From eeb4358381dc9caada07ad088b853c8da0cc89bf Mon Sep 17 00:00:00 2001 From: starsareintherose Date: Tue, 10 Aug 2021 22:21:03 +0800 Subject: [PATCH] add mafft --- mafft/.SRCINFO | 12 + mafft/PKGBUILD | 28 + mafft/PKGBUILD-namcap.log | 0 mafft/__pycache__/lilac.cpython-39.pyc | Bin 0 -> 325 bytes mafft/lilac.py | 5 + mafft/lilac.yaml | 8 + mafft/mafft-7.487-2-x86_64-build.log | 130 + mafft/mafft-7.487-2-x86_64-package.log | 44 + mafft/mafft-7.487-2-x86_64.pkg.tar.zst | Bin 0 -> 1342431 bytes ...afft-7.487-2-x86_64.pkg.tar.zst-namcap.log | 2 + mafft/mafft-7.487-2-x86_64.pkg.tar.zst.sig | Bin 0 -> 438 bytes mafft/mafft-7.487.tgz | Bin 0 -> 739805 bytes .../mafft-7.487-with-extensions/MPI/Makefile | 80 + .../MPI/mltaln9_mpi.c | 17073 ++++++++++++++++ .../MPI/mpiscript.tmpl | 30 + .../MPI/nodepair_mpi.c | 561 + .../MPI/pairlocalalign_mpi.c | 3573 ++++ .../binaries/.gitkeep | 0 .../mafft-7.487-with-extensions/core/DNA.h | 210 + .../core/Dalignmm.c | 6266 ++++++ .../mafft-7.487-with-extensions/core/Falign.c | 3611 ++++ .../core/Falign_localhom.c | 875 + .../core/Galign11.c | 1052 + .../mafft-7.487-with-extensions/core/JTT.c | 244 + .../core/Lalign11.c | 1153 ++ .../core/Lalignmm.c | 2563 +++ .../core/MSalign11.c | 665 + .../core/MSalignmm.c | 4198 ++++ .../mafft-7.487-with-extensions/core/Makefile | 590 + .../core/Makefile.sos | 545 + .../core/SAalignmm.c | 381 + .../core/Salignmm.c | 3099 +++ .../core/addfunctions.c | 1851 ++ .../core/addsingle.c | 3795 ++++ .../mafft-7.487-with-extensions/core/blosum.c | 444 + .../mafft-7.487-with-extensions/core/blosum.h | 11 + .../core/compileoncygwin | 13 + .../core/compileonmsys | 38 + .../core/constants.c | 1487 ++ .../core/contrafoldwrap.c | 312 + .../core/countlen.c | 64 + .../core/dash_client.go | 1366 ++ .../mafft-7.487-with-extensions/core/defs.c | 175 + .../core/disttbfast.c | 5254 +++++ .../core/dndblast.c | 396 + .../core/dndfast4.c | 241 + .../core/dndfast7.c | 340 + .../mafft-7.487-with-extensions/core/dndpre.c | 525 + .../core/dndpre_score.c | 54 + .../src/mafft-7.487-with-extensions/core/dp.h | 16 + .../core/dvtditr.c | 1202 ++ .../mafft-7.487-with-extensions/core/f2cl.c | 383 + .../mafft-7.487-with-extensions/core/fft.c | 126 + .../mafft-7.487-with-extensions/core/fft.h | 15 + .../core/fftFunctions.c | 762 + .../mafft-7.487-with-extensions/core/filter.c | 164 + .../core/functions.h | 427 + .../core/genalign11.c | 609 + .../mafft-7.487-with-extensions/core/getlag.c | 461 + .../core/hex2maffttext.c | 127 + .../core/interface.c | 144 + .../src/mafft-7.487-with-extensions/core/io.c | 6372 ++++++ .../core/iteration.c | 412 + .../core/mafft-distance.c | 421 + .../core/mafft-homologs.1 | 131 + .../core/mafft-homologs.tmpl | 505 + .../core/mafft-profile.c | 510 + .../core/mafft-sparsecore.tmpl | 358 + .../mafft-7.487-with-extensions/core/mafft.1 | 479 + .../core/mafft.bat | 33 + .../core/mafft.bat.win10 | 12 + .../mafft-7.487-with-extensions/core/mafft.h | 4 + .../core/mafft.ps1 | 21 + .../core/mafft.tmpl | 2978 +++ .../core/mafftash_premafft.tmpl | 464 + .../core/maffttext2hex.c | 120 + .../core/makedirectionlist.c | 1300 ++ .../core/makemergetable.rb | 32 + .../core/mccaskillwrap.c | 461 + .../core/mingw64mingw32dll | 18 + .../mafft-7.487-with-extensions/core/miyata.h | 47 + .../core/miyata5.h | 166 + .../mafft-7.487-with-extensions/core/mltaln.h | 387 + .../core/mltaln9.c | 15764 ++++++++++++++ .../mafft-7.487-with-extensions/core/mtxutl.c | 637 + .../mafft-7.487-with-extensions/core/mtxutl.h | 56 + .../core/multi2hat3s.c | 390 + .../core/newick2mafft.rb | 134 + .../src/mafft-7.487-with-extensions/core/nj.c | 195 + .../core/nodepair.c | 504 + .../core/pairash.c | 1442 ++ .../core/pairlocalalign.c | 3550 ++++ .../core/pairlocalalignmain.c | 7 + .../core/partSalignmm.c | 2119 ++ .../core/regionalrealignment.rb | 387 + .../core/regtable2seq.c | 216 + .../core/replaceu.c | 153 + .../core/restoreu.c | 319 + .../mafft-7.487-with-extensions/core/rna.c | 527 + .../core/rnatest.c | 460 + .../mafft-7.487-with-extensions/core/score.c | 98 + .../core/seekquencer_premafft.tmpl | 600 + .../core/seq2regtable.c | 88 + .../core/setcore.c | 503 + .../core/setdirection.c | 213 + .../core/sextet5.c | 317 + .../mafft-7.487-with-extensions/core/share.h | 16 + .../core/splittbfast.c | 3224 +++ .../core/suboptalign11.c | 678 + .../mafft-7.487-with-extensions/core/tbfast.c | 3644 ++++ .../mafft-7.487-with-extensions/core/tddis.c | 1201 ++ .../core/tditeration.c | 2411 +++ .../core/treeOperation.c | 742 + .../core/univscript.tmpl | 29 + .../core/version.c | 7 + .../extensions/Makefile | 35 + .../extensions/compileoncygwin | 13 + .../extensions/mxscarna_src/AlifoldMEA.cpp | 211 + .../extensions/mxscarna_src/AlifoldMEA.h | 63 + .../extensions/mxscarna_src/BPPMatrix.hpp | 130 + .../extensions/mxscarna_src/Beta.hpp | 201 + .../mxscarna_src/GlobalParameters.cpp | 27 + .../extensions/mxscarna_src/Globaldp.cpp | 557 + .../extensions/mxscarna_src/Globaldp.hpp | 109 + .../extensions/mxscarna_src/Main.cc | 1872 ++ .../extensions/mxscarna_src/Makefile | 77 + .../extensions/mxscarna_src/McCaskill.cpp | 844 + .../extensions/mxscarna_src/McCaskill.hpp | 202 + .../extensions/mxscarna_src/README | 129 + .../extensions/mxscarna_src/ScoreType.hpp | 340 + .../extensions/mxscarna_src/StemCandidate.hpp | 129 + .../extensions/mxscarna_src/Util.hpp | 102 + .../extensions/mxscarna_src/config.h | 86 + .../extensions/mxscarna_src/nrutil.h | 991 + .../extensions/mxscarna_src/params-weird | 10 + .../mxscarna_src/postProcessings.cpp | 91 + .../mxscarna_src/probconsRNA/CompareToRef.cc | 348 + .../mxscarna_src/probconsRNA/Defaults.h | 86 + .../probconsRNA/Defaults.h_backup | 57 + .../probconsRNA/EMtrainingALL.txt | 11 + .../probconsRNA/EvolutionaryTree.h | 200 + .../mxscarna_src/probconsRNA/FileBuffer.h | 104 + .../mxscarna_src/probconsRNA/FixRef.cc | 1000 + .../mxscarna_src/probconsRNA/Main.cc | 1870 ++ .../mxscarna_src/probconsRNA/MakeGnuPlot.cc | 58 + .../mxscarna_src/probconsRNA/Makefile | 58 + .../mxscarna_src/probconsRNA/MultiSequence.h | 1120 + .../probconsRNA/ProbabilisticModel.h | 1211 ++ .../probconsRNA/ProjectPairwise.cc | 71 + .../mxscarna_src/probconsRNA/README | 107 + .../mxscarna_src/probconsRNA/SafeVector.h | 56 + .../mxscarna_src/probconsRNA/ScoreType.h | 340 + .../mxscarna_src/probconsRNA/Sequence.h | 515 + .../mxscarna_src/probconsRNA/SparseMatrix.h | 341 + .../mxscarna_src/probconsRNA/mlparams0 | 11 + .../mxscarna_src/probconsRNA/train-script | 30 + .../extensions/mxscarna_src/scarna.hpp | 124 + .../extensions/mxscarna_src/seq2scs.cpp | 638 + .../extensions/mxscarna_src/vienna/COPYING | 15 + .../mxscarna_src/vienna/energy_const.h | 23 + .../mxscarna_src/vienna/energy_par.h | 61 + .../mxscarna_src/vienna/energy_param.cpp | 11600 +++++++++++ .../mxscarna_src/vienna/energy_param.hpp | 111 + .../extensions/mxscarna_src/vienna/params.h | 32 + .../extensions/univscript.tmpl | 24 + mafft/src/mafft-7.487-with-extensions/license | 48 + mafft/src/mafft-7.487-with-extensions/readme | 131 + .../scripts/.gitkeep | 0 .../mafft-7.487-with-extensions/test/sample | 285 + .../test/sample.dpparttree | 504 + .../test/sample.fftns2 | 468 + .../test/sample.fftnsi | 504 + .../test/sample.gins1 | 504 + .../test/sample.ginsi | 504 + .../test/sample.ginsi.allowshift | 684 + .../test/sample.lins1 | 468 + .../test/sample.linsi | 504 + .../test/sample.parttree | 504 + .../test/samplerna | 36 + .../test/samplerna.qinsi | 35 + .../test/samplerna.xinsi | 35 + .../mafft-7.487-with-extensions/test/script | 37 + mafft/src/mafft-7.487.tgz | 1 + 183 files changed, 155355 insertions(+) create mode 100644 mafft/.SRCINFO create mode 100644 mafft/PKGBUILD create mode 100644 mafft/PKGBUILD-namcap.log create mode 100644 mafft/__pycache__/lilac.cpython-39.pyc create mode 100755 mafft/lilac.py create mode 100644 mafft/lilac.yaml create mode 100644 mafft/mafft-7.487-2-x86_64-build.log create mode 100644 mafft/mafft-7.487-2-x86_64-package.log create mode 100644 mafft/mafft-7.487-2-x86_64.pkg.tar.zst create mode 100644 mafft/mafft-7.487-2-x86_64.pkg.tar.zst-namcap.log create mode 100644 mafft/mafft-7.487-2-x86_64.pkg.tar.zst.sig create mode 100644 mafft/mafft-7.487.tgz create mode 100644 mafft/src/mafft-7.487-with-extensions/MPI/Makefile create mode 100644 mafft/src/mafft-7.487-with-extensions/MPI/mltaln9_mpi.c create mode 100644 mafft/src/mafft-7.487-with-extensions/MPI/mpiscript.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/MPI/nodepair_mpi.c create mode 100644 mafft/src/mafft-7.487-with-extensions/MPI/pairlocalalign_mpi.c create mode 100644 mafft/src/mafft-7.487-with-extensions/binaries/.gitkeep create mode 100644 mafft/src/mafft-7.487-with-extensions/core/DNA.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Dalignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Falign.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Falign_localhom.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Galign11.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/JTT.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Lalign11.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Lalignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/MSalign11.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/MSalignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Makefile create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Makefile.sos create mode 100644 mafft/src/mafft-7.487-with-extensions/core/SAalignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/Salignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/addfunctions.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/addsingle.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/blosum.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/blosum.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/compileoncygwin create mode 100644 mafft/src/mafft-7.487-with-extensions/core/compileonmsys create mode 100644 mafft/src/mafft-7.487-with-extensions/core/constants.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/contrafoldwrap.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/countlen.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dash_client.go create mode 100644 mafft/src/mafft-7.487-with-extensions/core/defs.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/disttbfast.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dndblast.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dndfast4.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dndfast7.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dndpre.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dndpre_score.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dp.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/dvtditr.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/f2cl.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/fft.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/fft.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/fftFunctions.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/filter.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/functions.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/genalign11.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/getlag.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/hex2maffttext.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/interface.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/io.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/iteration.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft-distance.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.1 create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft-profile.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft-sparsecore.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.1 create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.bat create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.bat.win10 create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.ps1 create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafft.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mafftash_premafft.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/maffttext2hex.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/makedirectionlist.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/makemergetable.rb create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mccaskillwrap.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mingw64mingw32dll create mode 100644 mafft/src/mafft-7.487-with-extensions/core/miyata.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/miyata5.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mltaln.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mltaln9.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mtxutl.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/mtxutl.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/multi2hat3s.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/newick2mafft.rb create mode 100644 mafft/src/mafft-7.487-with-extensions/core/nj.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/nodepair.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/pairash.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/pairlocalalign.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/pairlocalalignmain.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/partSalignmm.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/regionalrealignment.rb create mode 100644 mafft/src/mafft-7.487-with-extensions/core/regtable2seq.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/replaceu.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/restoreu.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/rna.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/rnatest.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/score.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/seekquencer_premafft.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/seq2regtable.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/setcore.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/setdirection.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/sextet5.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/share.h create mode 100644 mafft/src/mafft-7.487-with-extensions/core/splittbfast.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/suboptalign11.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/tbfast.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/tddis.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/tditeration.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/treeOperation.c create mode 100644 mafft/src/mafft-7.487-with-extensions/core/univscript.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/core/version.c create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/Makefile create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/compileoncygwin create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/BPPMatrix.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Beta.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/GlobalParameters.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Main.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Makefile create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/README create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/ScoreType.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/StemCandidate.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Util.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/config.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/nrutil.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/params-weird create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/postProcessings.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/CompareToRef.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h_backup create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EMtrainingALL.txt create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EvolutionaryTree.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FileBuffer.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FixRef.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Main.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MakeGnuPlot.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Makefile create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MultiSequence.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProbabilisticModel.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProjectPairwise.cc create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/README create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SafeVector.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ScoreType.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Sequence.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SparseMatrix.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/mlparams0 create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/train-script create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/scarna.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/seq2scs.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/COPYING create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_const.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_par.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.cpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.hpp create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/params.h create mode 100644 mafft/src/mafft-7.487-with-extensions/extensions/univscript.tmpl create mode 100644 mafft/src/mafft-7.487-with-extensions/license create mode 100644 mafft/src/mafft-7.487-with-extensions/readme create mode 100644 mafft/src/mafft-7.487-with-extensions/scripts/.gitkeep create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.dpparttree create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.fftns2 create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.fftnsi create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.gins1 create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.ginsi create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.ginsi.allowshift create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.lins1 create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.linsi create mode 100644 mafft/src/mafft-7.487-with-extensions/test/sample.parttree create mode 100644 mafft/src/mafft-7.487-with-extensions/test/samplerna create mode 100644 mafft/src/mafft-7.487-with-extensions/test/samplerna.qinsi create mode 100644 mafft/src/mafft-7.487-with-extensions/test/samplerna.xinsi create mode 100644 mafft/src/mafft-7.487-with-extensions/test/script create mode 120000 mafft/src/mafft-7.487.tgz diff --git a/mafft/.SRCINFO b/mafft/.SRCINFO new file mode 100644 index 0000000000..0a067ac35b --- /dev/null +++ b/mafft/.SRCINFO @@ -0,0 +1,12 @@ +pkgbase = mafft + pkgdesc = Multiple alignment program for amino acid or nucleotide sequences + pkgver = 7.481 + pkgrel = 1 + url = https://mafft.cbrc.jp/alignment/software + arch = x86_64 + license = BSD + depends = perl + source = mafft-7.481.tgz::https://mafft.cbrc.jp/alignment/software/mafft-7.481-with-extensions-src.tgz + sha1sums = 235d91ea4fab0108b01b9e6518563af74abc00f7 + +pkgname = mafft diff --git a/mafft/PKGBUILD b/mafft/PKGBUILD new file mode 100644 index 0000000000..d37a190fc5 --- /dev/null +++ b/mafft/PKGBUILD @@ -0,0 +1,28 @@ +# Maintainer: Butui Hu +# Contributor: Steffen Weber <-boenki-gmx-de-> +# Contributor: Mick Elliot + +pkgname=mafft +pkgver=7.487 +pkgrel=1 +pkgdesc='Multiple alignment program for amino acid or nucleotide sequences' +arch=('x86_64') +url='https://mafft.cbrc.jp/alignment/software' +license=('BSD') +depends=( + perl +) +source=("${pkgname}-${pkgver}.tgz::https://mafft.cbrc.jp/alignment/software/${pkgname}-${pkgver}-with-extensions-src.tgz") +sha1sums=('d94137e79ea14c2d235c3f10a6d0537e86768a2e') + +build() { + make -C "${pkgname}-${pkgver}-with-extensions/core" PREFIX=/usr LIBDIR=/usr/lib/mafft + make -C "${pkgname}-${pkgver}-with-extensions/extensions" PREFIX=/usr LIBDIR=/usr/lib/mafft +} + +package() { + make DESTDIR="${pkgdir}" -C "${pkgname}-${pkgver}-with-extensions/core" install PREFIX=/usr LIBDIR=/usr/lib/mafft + make DESTDIR="${pkgdir}" -C "${pkgname}-${pkgver}-with-extensions/extensions" install PREFIX=/usr LIBDIR=/usr/lib/mafft + install -Dm644 "${srcdir}/${pkgname}-${pkgver}-with-extensions/license" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" + rm -vf "${pkgdir}/usr/lib/mafft/mafft-homologs.1" "${pkgdir}/usr/lib/mafft/mafft.1" +} diff --git a/mafft/PKGBUILD-namcap.log b/mafft/PKGBUILD-namcap.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mafft/__pycache__/lilac.cpython-39.pyc b/mafft/__pycache__/lilac.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5b3f13bae42bb9ad54635cb6a4ccf1624f6bd1c GIT binary patch literal 325 zcmYjNJ5B>J5S?+BXoD1qf`Th7NcaK>At>n5K$T|YT|0@vySBV`AT=BWO0MLViW4AF zFAkx6eMmaMt6XK5A1Cs@f}|fX&SlNBH^|w(n)ku1Xa7o^;Y>>^fFVgOk(wIn)d36 z%4uqb;I;bzU((bu{haZQ?G#@}yVLwyTi$3Ze7iBakI%dlt5x7e8_}M-U79(s>LzL< o^VNp@IzXSlU{SGUIrbUdjFta0{@9GVQhCu?8I8Kk*3n mafft +sed "s:_BINDIR:/usr/bin:" mafft-homologs.tmpl > mafft-homologs.rb +sed "s:_BINDIR:/usr/bin:" mafft-sparsecore.tmpl > mafft-sparsecore.rb +cp mafft mafft-homologs.rb mafft-sparsecore.rb ../scripts +chmod 755 ../scripts/* +cp mafftash_premafft.pl seekquencer_premafft.pl dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign multi2hat3s pairash addsingle maffttext2hex hex2maffttext splittbfast disttbfast tbfast nodepair mafft-profile f2cl mccaskillwrap contrafoldwrap countlen seq2regtable regtable2seq score getlag dndpre setcore filter replaceu restoreu setdirection makedirectionlist version ../binaries +chmod 755 ../binaries/* +cp mafft.1 mafft-homologs.1 ../binaries +done. +make: Leaving directory '/build/mafft/src/mafft-7.487-with-extensions/core' +make: Entering directory '/build/mafft/src/mafft-7.487-with-extensions/extensions' +make CFLAGS1="" -C mxscarna_src +make[1]: Entering directory '/build/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src' +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c Main.cc -o Main.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c McCaskill.cpp -o McCaskill.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c ./vienna/energy_param.cpp -o ./vienna/energy_param.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c seq2scs.cpp -o seq2scs.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c Globaldp.cpp -o Globaldp.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c postProcessings.cpp -o postProcessings.o +g++ -I./probconsRNA -I./vienna -I./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -c AlifoldMEA.cpp -o AlifoldMEA.o +g++ -L./probconsRNA -L./ -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" -O3 -std=c++98 -lm -o mxscarna Main.o McCaskill.o vienna/energy_param.o seq2scs.o Globaldp.o postProcessings.o AlifoldMEA.o +make[1]: Leaving directory '/build/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src' +mv mxscarna_src/mxscarna mxscarnamod +cp mxscarnamod ../binaries +chmod 755 ../binaries/* +done. +make: Leaving directory '/build/mafft/src/mafft-7.487-with-extensions/extensions' diff --git a/mafft/mafft-7.487-2-x86_64-package.log b/mafft/mafft-7.487-2-x86_64-package.log new file mode 100644 index 0000000000..b9578cef9f --- /dev/null +++ b/mafft/mafft-7.487-2-x86_64-package.log @@ -0,0 +1,44 @@ +make: Entering directory '/build/mafft/src/mafft-7.487-with-extensions/core' +cp mafft mafft-homologs.rb mafft-sparsecore.rb ../scripts +chmod 755 ../scripts/* +cp mafftash_premafft.pl seekquencer_premafft.pl dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign multi2hat3s pairash addsingle maffttext2hex hex2maffttext splittbfast disttbfast tbfast nodepair mafft-profile f2cl mccaskillwrap contrafoldwrap countlen seq2regtable regtable2seq score getlag dndpre setcore filter replaceu restoreu setdirection makedirectionlist version ../binaries +chmod 755 ../binaries/* +cp mafft.1 mafft-homologs.1 ../binaries +done. +mkdir -p /build/mafft/pkg/mafft/usr/lib/mafft +chmod 755 /build/mafft/pkg/mafft/usr/lib/mafft +mkdir -p /build/mafft/pkg/mafft/usr/bin +chmod 755 /build/mafft/pkg/mafft/usr/bin +chmod 755 mafft mafft-homologs.rb mafft-sparsecore.rb +install mafft mafft-homologs.rb mafft-sparsecore.rb /build/mafft/pkg/mafft/usr/bin +chmod 755 dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign multi2hat3s pairash addsingle maffttext2hex hex2maffttext splittbfast disttbfast tbfast nodepair mafft-profile f2cl mccaskillwrap contrafoldwrap countlen seq2regtable regtable2seq score getlag dndpre setcore filter replaceu restoreu setdirection makedirectionlist version ||: # in MinGW, it's ok if this fails +strip dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign multi2hat3s pairash addsingle maffttext2hex hex2maffttext splittbfast disttbfast tbfast nodepair mafft-profile f2cl mccaskillwrap contrafoldwrap countlen seq2regtable regtable2seq score getlag dndpre setcore filter replaceu restoreu setdirection makedirectionlist version ||: # may fail for dash_client on mac. +install dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign multi2hat3s pairash addsingle maffttext2hex hex2maffttext splittbfast disttbfast tbfast nodepair mafft-profile f2cl mccaskillwrap contrafoldwrap countlen seq2regtable regtable2seq score getlag dndpre setcore filter replaceu restoreu setdirection makedirectionlist version /build/mafft/pkg/mafft/usr/lib/mafft +install mafftash_premafft.pl seekquencer_premafft.pl /build/mafft/pkg/mafft/usr/lib/mafft +install -m 644 mafft.1 mafft-homologs.1 /build/mafft/pkg/mafft/usr/lib/mafft +( cd /build/mafft/pkg/mafft/usr/bin; \ +rm -f linsi ginsi einsi fftns fftnsi nwns nwnsi xinsi qinsi; \ +rm -f mafft-linsi mafft-ginsi mafft-einsi mafft-fftns mafft-fftnsi mafft-nwns mafft-nwnsi mafft-xinsi mafft-qinsi mafft-randomcore.rb ; \ +ln -s mafft linsi; ln -s mafft ginsi; ln -s mafft fftns; \ +ln -s mafft fftnsi; ln -s mafft nwns; ln -s mafft nwnsi; \ +ln -s mafft einsi; \ +ln -s mafft mafft-linsi; ln -s mafft mafft-ginsi; ln -s mafft mafft-fftns; \ +ln -s mafft mafft-fftnsi; ln -s mafft mafft-nwns; ln -s mafft mafft-nwnsi; \ +ln -s mafft mafft-einsi; ln -s mafft mafft-xinsi; ln -s mafft mafft-qinsi;\ +rm -f mafft-profile mafft-profile.exe; ln -s /usr/lib/mafft/mafft-profile .; \ +rm -f mafft-distance mafft-distance.exe; ln -s /usr/lib/mafft/mafft-distance . ) +mkdir -p /build/mafft/pkg/mafft/usr/share/man/man1 +chmod 755 /build/mafft/pkg/mafft/usr/share/man/man1 +install -m 644 mafft.1 mafft-homologs.1 /build/mafft/pkg/mafft/usr/share/man/man1 +make: Leaving directory '/build/mafft/src/mafft-7.487-with-extensions/core' +make: Entering directory '/build/mafft/src/mafft-7.487-with-extensions/extensions' +cp mxscarnamod ../binaries +chmod 755 ../binaries/* +done. +mkdir -p /build/mafft/pkg/mafft/usr/lib/mafft +chmod 755 /build/mafft/pkg/mafft/usr/lib/mafft +chmod 755 mxscarnamod +install mxscarnamod /build/mafft/pkg/mafft/usr/lib/mafft +make: Leaving directory '/build/mafft/src/mafft-7.487-with-extensions/extensions' +removed '/build/mafft/pkg/mafft/usr/lib/mafft/mafft-homologs.1' +removed '/build/mafft/pkg/mafft/usr/lib/mafft/mafft.1' diff --git a/mafft/mafft-7.487-2-x86_64.pkg.tar.zst b/mafft/mafft-7.487-2-x86_64.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..6460e68a3579875d94a2ee3ae7f8e7d03c956778 GIT binary patch literal 1342431 zcmV(*K;FM7wJ-eycpM=B_UnEj5Kp@Si^qu@#9hVumVioi2W;R8)^hR*2|fgg000P} zPI&-!0C4~_Y6fg6X_UT5*NjPRK$$4&>U2xVRb4|a#hgqp(_@XAtR@+J$+;w>oJ_-? zThYNM=(SCI6AwNdbH|gwhLZghJjz~cWS)swSu|rI2uP32&b8;fckH|YNC?1cY^j7e z#gtl2AxUaUA+5cX511pv<^BptJx%16)&dx0jpunF{LhqNGbMK4-n z2iH?QQbq!kCt7m8y~zp($Ux0Vz0vU!!C3%#p7%RCw!b4+;u2J;GuxTUQW2HMU(_hJ z2{GTf1yAj-U2fIZqkcH3P`c01Yh1}&^SZuP>keG*NSY8#P;%~W7DMoNe(_#=kr|dA z{~o8Uw(p-O&UWBK3C^57er=a9C3GAOJ%!X!NyT~Q&e-XeHg5NBf#XUrsg+jkVR7@Q z{0X5{2v#F_+xFxr%wtc>!GAA3pC>%>%k6TM(yjIGQ1H}D!|6zGlzds3+O_lE-_RC& zDvcdm>t;&F>2Pc~e+t`h22SqAJI%Ch&Hg9iXjAfU)tdEhM$!EChN2sc7J5fB3S)Dr z)gRycGcthps3EDM43UUPk|c%ZFoY1pR2e-|Y9ON!LWnX(KnNkkD9Kcjs8D}8DFTB0 zM@B(4n82Bv(fv`0Ql!Da<6?=BbE3;#K*h1Q=r5@z%jhOK)1$W_ z2Qoy;^v*DBU)|Qg;KC{TEzYeLV}kJ;i0?9bGWlR?Itf7hi2AhA>8gVsrpz2w5QZi5uhtW*5KEtKtTgRDJ~$2CMJuIZzISQXG97bX~%w~kF z8Kio@-k~Ez1O;{Gz%V)i^yRD=K;Pyi;ipxO7)Q<0>RFxu8=k%q&rVd~!!a23n~3rnbMhfGl#=0sN=MFAOHa}c!* z1r9>pX47PV%g5lvNhlbU61p2$(Ei!atXe}~0G&f~( zY%*zXWo~qGd244ea&u*5Xklb;cX4cKbY*jOWN&a}GBjy!W^XujdSqdAVPP#YcW7xc zF?f11dU|toWH10OO;l1vMK(4wF*h+ZABzYBrJBob9LceU_wy72&e~GmFAHsa#lVJ- z0pqNV$jnHpG0n@cTlUybf4-zNc6W7?;?N6GO|r5oD)Nv2QpNwdJwB>__u-(&cgKG| z=*PL+>$}gp@zK1ydHQ;LKlEb?;k)-A-v9dlzW>v2zyI^^|M%T-cdH+5awVEla(-{# z9d`fHkHN?K?smknyV1k(V;(cr>_Rmr2jgRLVrH-!qie0s^6v0STufh&4zuMnWg1O6 z8<&b{)v5YsjHD1#sNJ|(Jtwm=VvI7{2&GOJgZeyIg@5_uA6~4_l#}v8_AZ#JF0>I- zw@q>jDq^MA;c7ZBuW62Ln(kDlr<~+w;>tl>gcG>5q28z5W~@b0^OX&@U1D=7 z*er4mmnbe(lYNU;%`}b!jOj7w(ozpWqe?HigxGU2LnMaMtESd^<1)c*>;2W(9gcF> z_1pLRv~a&`UlwkbU!3=i2>G)3jW{`3{N_u)5i?&Ff4aZD-{0RH-aoc)1Hr~%PjDc% zt6Y@+-+=yCcmH_%cCEEh_IKQLH_-QCSqggxyao}%V- zvV+l0s26w9Yz=EG*_%2UxlwQ-rk(Gg8#PIbO*M!aOWHlZOI3%nEqYhuOfilu#WhwL z9jzA}gE*hNbLpbset&m-lzG1&|9F&#=c@M6EF*Gasd_EZiYXQh<*v!L&`q*x%}{5; zdDS+E1*tfvSXBn+8ah2XCecYPZj|2gEXvJH+)wGlaHt(M=8}SMSE~MeciihW7xGm! zLGtOGxMoJ8R5LJhrAZlX_#nju-v#`i*UOB}Fyj;qQ`a(b=(9|h@)XQkh=^oVUyar- zK^5ocV|UewHo-oci+Y#p9bx6eH86d_MGZcgvks>@LmY)ViZQS>+8xG}q^-!@(0g}2 zdJ8UQZ^f6kS}kfv8nvM2)djhPE$v7i+N&o*;R}4=gg^! zFFLOwf_hhb^Q-IaGTGNPH5y>dU^|_IAJa^fYUk#eaXpd zsAPf!U6gJBv;+=KZ8BrI4Vz}@>Xq+eHJo}`gA(w7cFfCa|9%|1a8(i%(aJ^yjN|jH*4PmFl7I>05OQ%9|3W6Jg6e6MSwyB@ zlsjGDKT8dqC7lAHcIb&&PF^HuZ*pYhYYcuEHaczyxRzE^>2Lz=$}L%dfT8LZj(`SQ z!A4i9`h)ZO}Jt-JkEpY5zenagQsi}vE#$=GOz2t6Wz`o>^{goBS8 z;sxcPQX;6H)-X|_W)4N(g__k0*Z~1aopyBvo{p{9j;AC_dUsLnjUM-M^DGW5dUOg~ z6HtSJvN1MIV;(kGufq^Zrovg9-r`Mjw$-x%;5#!!BoL?%tzlPCL#x_s)J`h_v2nds z`cQ+(jqfh1{iHv+r%y-y=~*UYXUr)cR;mY%Y8`4tfM$*?mZ+ziR?P034i`I2>7iCP zExB9_x9M#0DHhWZx`-+^Mge?46F}UzG#mtylQpee)cnnqb)C*yMj$Z$8TpTkb0~ah zaM-)bUT*|Bw_qHM()_eo4v1I=E+pCs#l{pKs)=jp2)KK%_Qe)|0W;d$CHA;(jOW9VHpgEsXVZM871y4sw<5hdd`#yi%~ z#H65@@?jcWCLkuao*6Z~(I{~a%bit8L~)6|pw`~PHeP4FUiw0{1LLnnc8>&nbty46 zgW(?oE%9z7$Tr)&na1@aepm6PutI7}(BKj7~TZOS!~iA`oUF-+Dj zAefO;a}5_1jVQVd(g2OP3F(ArLT5Xjj!Q3eiy|F<*zNbf$RZm9Z*c9wa9LayA$o9) zkvm)M!p2~z!}_+2hw5fdvwENHEas!xpFDnw?7@aJl+XG?75P&Vb4yXF(zSw;juP1oK765FkM@$ z3n9i0TO*S>3rl>*1e6@>>Lwt9CLtjo3ly3fW*$0BFcQRs7~uyiSzugJ$Q_ySL3YnO zqXOxj29b_~!D2l*bG$k2nrmQ~v>@=-#%&~9h~NgzpFN~iov#Eyg9PHAJp-sUFMo`T zW13-&>;|D(Z-b%zD!}0#{7u3s~ z)l4j13ebR}(UzNUq-F4&wofeRUsSXg;D9_}R zw&K=A0w+-jW7xG}MXuC*dOrG6NEHR@q6ba9y{Y{Ib0Ux-xU>H*! zedg8h^?oN-q!~X&DoeJe1mfWbG`lhtf$5A;`L%NY?c`pZz|$7bw%%D{h}zO!yBM>}#LRcCtdw+yN3UrRQv##W?o@^0kHJi(<7HQ{3leusYzD z^%!5Bs4y@M@#QjjU%v+5j6p4qxFXGN{M&k8M*4ElLv(yhZrPkj;f(RX2t_XGJ(Frt zE7G9{VkX)Q?N373Ww{Ug-Qtta-Xu?yqj%h!tCSs^!vhKYwq6LtAR7?l;u}D(b`4#^ zyc4jI25z!Dd<7YhW2eTNVd28GL3UB%qCF{W!9~e0SIdo_yZY{+%^c&Xl&b~sV#6`B zP+wl$wHZ0D5J(Nv(o+KekSY*bUZRfgbNKr8&@kYmQkyf(5P_O$m0X1vysY-``gnK& zzT5DWvPgoB7AY4jq4ySkW9r~plXT-L0+&=wSfaTxPnJ&Y%X3EGBL>@#!q#U(m|y;< z`obv)u#NV&ga?Y!yuzCORbQrhR_3oh0zFB$h_}9MWxVGxUpT7Ui@BaMP-#z!1 zC1KXTK6Xp~H2EV4Zaw91>tP!)E->HT5^|s~uNy9i4dEKH9{)nDh{*CYo~HHELL~OP zjPqUmR;#RsLw-)NxK!8?4jX4Ta4XmL{K~7KFMn-vws8Hkzu-?F&KGW9`r7w5|9X}^ ztv_?L(+@f{43oK@i`A-VccBk?4RPH*DXGMn_ow+4g(n|7kAh(f>BZ&i_ zg)W<%m@bPxz@zd)^)D73@G+-8V78SINx#%Ef-eo%=RI6XJTDgvx^~ME7`my(Akbz# zpmu6J=AD6C_Q$Qi-dPVGR)!aRabB{A0=6OF{XeQA874&}E>KHHGcYnEAV+0xWpZJ3 zWn>^?c_Scob0BkRZ*CxDWpiUqb!>ELaBO8DVQgtM;I zVPk1zAZ~SIY-MkBX=G&}b7gULWo~0-a|(5GY;!sLQ_NvWMyz=Zgq2VFE=$cF*Y+b03bClGBhxAX*V}CG&M4Ab2c?; zHZwM7Y%?=AG&3|bFd-ly3T1LVFgprud2?lKW<6kJX>uYYFd|?tU}ZaRa&#aHJtB4> zC@)HNY%el3DIy9?K~6_KLke$mJz#ZU3Ox#UX>M~pB5rRY3Tb8_TOeR%V`y(6ByV#d zd>}1pAY*xFU?5#PAZ`i?Zz2i_d1Z4V3T13wt1VQC^D zJs=_?ATd5BGD%^1Aao#MY-MF2V_|G#b!=gDb7^LCV_|M?VQzG3Ep};gb#ovtL2Pqx zAY*S~AZB56bb$A$fw5z3WTc>^q>!yOK!lJXk|81w!jYn*D98wsA_77LMnN+o!Nf^8 zfdn$d0}?HM^yAh2!CLw&7iigm2 zyk?0@ZR9d2sd!L@ONl8DvH@ugs>6uDae#Q-V6X=2_sg|x2x$yR_qEeBzz5E0MJQ#1 zrmkB)uv0gH+%g9hHH)DP+of12+9e_bZWqj&>w=gAC`^3ucA}vqtH-=ikqiivDS4jB zj`PMCjBFn3BP@zFkzQ1(*|Mzv2-CvfILWLm#lT`i*4yR|gP99M{8k43O!H{-9A z;N*4ytP3E4=;yrUx9YoeMwA|pxwc9^&>Wz4%yVQNb_(HM(T2&4Zl2&8d;9$f5GqmJ zFH1_E$AB})fDeT^@LX8k?>c=8vxDpDc=~MT7BfnW8FYGl#Q-yQ2KYC z8lfS`Wqt01FaXBqdMMzs=mALc!ibzAc_VF~ej0*m{9O=LS=l=<=Aq3uHX?E&#>m}3 z2mx{cZ2)cnR%!(tJ9yHtc89;Gbawdn%yQM{r)n7F=)Y;U&@&BF0Nmk!O;$Q?Rd}Jp z3KifI%BCZrQmx0?m>@)@N!}97-sqZ-pt29KoX`3#!|Vk1cIO@ zk?`XN&O}g5n4oBGO=)xZg5gaxMbTR*R^_aAa>S5>rETd_V0Lifz4+T}dT zE7=*Q%_?1@zf9L`iF*c*q7%DN{?(_lP`59)0`a$dH(1}p2F3(h(ldW!Q3>g^ru2HZ zgG>8v&n=>_E*GSmdk(T|E3_P55(hoj?bgw~`f7FS+UlH(6;iJcqi%Zl5*!c|7>o-E ziRjU*Iw#IKhso=5ZlcL#8Xon*t_`V8e{SN(eq_5TqOyz0f$pdwwxZD_DGX~-2x2Ja zpmbN;5^AC(8On??kPHPPA|gSWf-+KC*5<4NL;;m!pp1_)9iK2(GF~%{{;1P)w1Goj zq+I55x-bpYl3;|GKBCU?hI3MQe<_ovW_9dt4~ z5D2Zx>>H%;IeeuBrrVE3;80X5AW48!kx0gT4s;QwkipN+7R=b!IfT7zBYffkj>(CN;U?2O95M^O_g$Z22-XScR6N zXD`5m2-s~GA?Z1U+5EVLz&AjCA0op(X!PFUM`%llAPr%F;9BH=xkxdAbk{8o)HrmA zC8-#oDd>-lta8a1E%6TMfdZ`pG)sv%ws2Ps2*Idm%Ns`>^Ve(0CL2KtC}MRl_QE9> zv%>m$cxW7R}V}*%Y|*iJBfT;nJ#Ed*t&w7*6S(RBn4vM|;`8^z?`BqbiiK8{BCh_EqE z4AV~T|AkU*g2~j!8zt(hD}y*IR9K}-L?j7d3{V-264E-^pO_Fg$d^($E$>xRDN1HeNHkVttKRrFU0;-Pf65d zK@faa0A^}|C%_od1B4y1L~2Q~TWiff)sX?oMxa3_M1p|6f-kDp9$Z&Z%n5Q3bpUk$ zdH?|bEHoU6nt4W>wJKVgZ+2@o;#QW`$tG!ySo}H?at%iZVnd_BzGmijL4ThmX^-<~ zl-E^!>Y=(}xA=WYIp_Z~&SfQr*SfGb+z5GRCiHfJhk6MlGT*{D3pGRpY|ofXyw?^?5pH zs-%zXV^umfq7zXfDaWrY$a>TzSlRHfR;U~aP*@HGPJ=3SH&jn#1PgU3UYrOws0oP4 z|BT@-Zo*S4=tg5on+WX+ms^IOZY9iHm3URm(b@qs#!A#aGfEUE0*kC+!b$3Q(4g>| z_^xI_1{xo@X*Wsk+&;9a_*dU}UPKte?&UZF5mUFP-u}*2k1iGmLclcBaB1TIahJl~ zPGL~%_ox9g8l6QzK7wP!>taucpqcffs6{pwR&V3+Mskxc@V{~wtdsOZ>(GSRLyI3@ zBYRZ|V3@x$u9yr<<9Bz!gm853FNlp+U~2!%phSP!4=XeD_qbwwuxwPs>{z-D0J2xu zTP|~$<`-h0eR8R4ADLn$Z2cC`si~QuJ*5i&B=#-jQ6Oa9zr3zLM6`*w?})#G5sS^r zo8Lb$vUe!HCszxnx;yaZ#cD(f22)}_pHiWkN?2k6N$c5=sjW;hbbFx2ZwG(wJg_j z3qOBp+yfNwbYdePg!mtVzgZ~R(4sWfp@#~os35G#gMJnQSuddB+=T#u^QW=``u>-a zK>MRB87{F;(?f#sh~5v>hC#akH|PZXM(x3pITelaNkhQtv?#y`@8%|$D0$>Jkamul}af)~3TkejN*Dm7% z>K3g8wO(3Lxcm9_XT^^{n1EMuR@nf1QLOOUiKi}4TbH!Pe^uZ+JRD*5n$nhJw5|lO ztV&qy_F+f-Jjz?x;~DFTgwUQ_r?(DC44OaLxk?!6mD}5U1WUsU3~u zv0xr)<}$a#C_9+Exo;!z*bHYOzFXI?^Km$Jz8&ruK-BciJ+Hq=A!xAaijqkfxZBx1 zUia}+=YfhTzkVaeG;Fg5-QqKh`L^8n7zIBusZwsP?=To&+)SLV-?SL^9m9OXhBtdG z-IK0f^?7+>UG(0Y2pm`XtINrO()bKwJx-JhDuR+An}9-=DdXXnLCtxMf~)^&ftWo8 zl~l{~4e?Cglj}k$AZsFs)Z5Y?Wx!#<9qWZ?)iPHLab>LBeEpS%PkclS+~LK8H^18< znYXpAId7$NFq$a5m^|UM9%hW|iM`pnb|Ri?6oo{=X^f;kKg&PPmIC~b8 ztV*e@&q_$hUM7=GO2Vc@6cxcUWd?y0!P(UPXW&8<9+VGk4gbVU_zDw2w3iqBm=z2h zNr;wV93?4FtfE$D4WzkAtGql6z=GHcuKh>eH)Z3rg369Zw(3GRAg7u_DMP5PUXBnR zG0j>C!#ST4o$iMo)aGvcU^Q3V6Fa&-ZCxr|N_|@5P=4VPN1)#ZrZ`D`r0PI(?aY#yb z_|VY{HMD3G6a#G%|0XsxE8^Q}q03{b^`rky`rxs1ol!-Gmz$ZzpeuS>QxDo(O^ol? z$V7_Mu+^dodf^U7jK~dcE}{?xeeE+!=l+1N^Jt)EqbSv}MljJUV_7v30TQ&^)G{!( znZAF>!?;<|8sNz={dx)jzZm2Gf*2FvUenCC3^b zBYHBSn0;W%gtJ>CBf+g1z>=8A>kXi)Cf2^{xha)Wp-l??QHMEuR2Mq#@fn1H^o<0J z?P+$qTs6Mvto&lGRi+}z$3t0g3vv)kZ3#B z`-D^MqYjL~xXSrBm19&~I!yBzN*@ysTFeM)!yeb+IL5p{mT*ym#%63L;e?!0?ZW)% ze#i~1UqVS0Doevoi>9j_gqfxVF?kVPd{x)&Hc?HW%XE{K96}Qw(){*U7#)TW_@ESf zl1JH?bEa0?94{yLMvY1o6vrkrn^^tC??Nw<^>>16K5}uzq-%>T&y_yYz&M2dz}pD? z{v2xd-Zf%9+d0L_4Q!`aINIXoLoW-4oXtqKey;CR`aHt5*stIOt6m5X3L6D{TQ}UC zQ3xdQ6Mf`;nJ40r4q3K3lOv1R@{QLEn>ANiD}7$%3^xGVf)~Is=0m6c5Nc_L+J#>L z5RmF@lq66i6@zbeXSvzk@{(fM72&&Jom#WVOmbV8pe#tCihB7jtdhb0Tb}bU%80t7 zdGYYkpDwWuO+v$5${H*I9IpVnPHYb^fXtcA0rfZ+;SgKG0#Bi5$ZG9qnl3kKngRvPocG)sSFP59FB=O>B_!!eM1ozh+BsxwLs52F(Kz$v_1BWf$ zZ@rI0ApnV_ydqme$gFk7x0~O%t@a288}$roABmU?O$NX;YT!tuFq@9W11HI2e_xfM zp}^RDwjNP1d*Ig*gxX>`AtNd1S5WvZ+NWun3bego<&mx(S&hcFF-bqlJ9=AM(Z*B9 zBl40&H@v6xt}P+LAEtRyAxD0U9P+MSA0V{|UU&X-pK4PD1gCKPMy z+(1j8VK|+Wwcl8y)X`C~oq-OyOr&%Y%Bfi~*36HFfXLN>qkvTO+B+zFI@@O{IG9%! z?8qfdT&11IBTR%koPSj$RU#Y7<5qi^Kkjp3k`^6vz`SLhY7(ju@sg7a)?3)2#Gy4ER3ca!JedDFERL(JJfZ9;YBUp`i@g(%_`NGwK0C^E;Izy~ zW4@`-3s|8~(=<)fG)=oP32+iS>2MXNo%b?U#goxs6kI&G)EiZbFy&sgTQ`G<7KinK zI*3I=ksCSF?H)CmQ`4x8jd5xSmDD0P<0|u4Ub1>|?s=UJW<{O8_iUsUUZ=_OA&sc9 z(Z%%wj%6#MG%J0AfshZo&fNps;*l26vt$TRzFcJrQ5zWBPsO$)7CG=tCi9WVxLt{eupBsshAs@PFD!Tr;I5aV%Cw4VRjGuH;PsiW zR$-Zy{+yhJy!QEWvoga#6(jA8ttMlfCaIc-qtP(e?fobS&a$uojJsuH;n&DRR^w-s z0M@f#kycFsD5fGBf$7(vgP(1(r#3}o6jMN8k|n zyH(;78;RN=`nfn6mkAGpO=$#fl;yR~7b8(@#=uka@F~@I3p?mq3=PbW2 zwPXvm+?IwU(l@e8Dsf#hC$RgUx2_$y*T6o z$y|a$nt!wSP?)HCluBFaqAI`Ul}btLV4!qVI2brCAI~L2!X$j`))3eqDZV`0=7NEJ zJ_sP5bq>!O7%0cCQ=P*`!_&Et@H_+kYY3nV;@Y^9yak+V9W=liAhrfB<0f1OuSbTp zTq|%1hQh{F+PKAs*k^pji)XoCM_-4zs6&g!E1D!3=A&>hC?q7MjD>QsCMiD?BiT46 zg^9yR3P~6cL4+_!2qHug84($g5>3(pIs&MWz0nFIZ5BcvBuyeU>BuZRS}4CO!P^u0 zTy2kart%gDLTTP$x?Up4WPy+w$3pIs)gX7QETc6UR>_jCT@m<%*T5JVvoB)o_C-j8 z)ofuj&gh| zHrc(lAq2iM{O7jH^9$`ua(%qxS`joeeFfpTbxJcAL$FN0jWSmRYspUgT zgbX;t42p8a1oO474$vZ&-x71Ren#RWprStfaUDc_iwnBA7Kl(>ArDIoepL!f*4KQ* z7$UIW#bR87x|AMxRBEol{cflK&L}0Bk3FWCl)_R`;J&ZzFkb8p5Hq&ws#40_O+N2Q zi;|QsuECYo3gs|dg*3c7pbSJK5>#17R}j$LEpm2oxTq*tQiKq%+o8xzcO0x?%N~&V zr+@)6oZ@g8dP4zS0X84^8calVP}do}JanvCR63(F$C(tP_z2wN15!5VaYj^!izXmn z9K^oS&xI`4oU_;CIt!Pq5sTk4cT2SXZ43|XtB}s-aX?Zus~bVctU~qB&S98bWQ8CT zA9F3G=50sc6)?%?!d9bXQwZ^Y_p~zg`v++=Uq@3FV-gdlI44ZJcsDH)V!|vf2?%8? z8`Fxbi_de(Q0r}hyaqU~I8B{o{B7}bW|Rw1O>?=KmM>ShTxN?-f*roO(sv(s_^_Hx zM5%aPBjXd7S*_|k3w*rL%K+8$24y&(dPo1|nPZ)mpuzNq13uM|;!wL|L zAX(u_xd8R73S3lLidJxF1%RXuH0VMk1sD6W2cNLA7Bg2@=-Xuf`~lWT9qVDtD}##Y zK#3j3kTHI>1n==5*FSF8|KJx2DY+-Ys27{ZX&BVYk94`KJue@z4~x2gPouzvb;?{l zG|ScX-_kF)lRFt|e$)?Hal7g-4R~C!l!uYrrSExVm6lRK&(}^{zm+DcnpaQ&5xTI@ zwvydexAkG;wZ;z{Ol->fQwEZ%jXefk+!+yKTh=DvK-(tX0AZ5zI5$QHCC->bsVVst z;)k|AZ2}S$H!}VM#E75Z{hmvmX?-TrDb|b#N6>T_N$&``x6hgRa4EI+baLfOhHe>Y ztcHEOt^l1UwVFFWykTY$W#NgL#cKxYkle+?lom1CUUMMaZZ830wi2nK-7tYtl~OGV zMG+6w@a86S|DVvUNWVUKv*=wFj-d65;M>JpZ8opB3eE5u9hDRw6C-Qva*6gZRI8P@ zXVEz`8W#_FaTGg>qr1uMVPTZXE)#z5&QZU)9n!O3-ApK_O+Z=PX8ejo2yYO z{>ZNK0~c{AxlG--D(iY-Tz3dh#-}jYZr^vN5QdZ{T4LD9*h=F+3X~?WU!m)txZ2i- zbD7k@b$JOc1bUpz$s_XH?4+9;FV59G`*y~8q@qM7 zcI^-B7_n`l$G-j}UlSCFH7%C|#OZ^Z0Mp2=fl(R8O@dQC!zk#9QkYXjHANLhq@N!? zJR>6@xJ+teL_rKYeEW2`s@vVq?H{(L)sJ1^bS}QcUU||-OM$6?&UVO7b}qR(DkchB z)iVeD8{+eWq|{7VeTkM?%a%yr1Q<09S^EAGscZ<0jV9wbhKojmK|593LCxhENxR3O zrP1w6fbH&G0?2LCWz%;$A{ippZwNaFEa)NgMnu)fMC!iv0?2?cD<$tjzPTOskdVN` zILYS$!6_LsbT-J6UB<8gr7OIx0v){2$;=^Jh8E7Kuaa2Th4ZX8j1^P3C0@%N-8yt@ z5~~t{Q?Q$)4)RL}%xdbBP(r8QY4{>JyC8H0M)E-p9Ne$ZE4A;is^dYK$MMhi@4mEA z8KTTcf^}Mm>_RLwdP65RUh9A(>rI=e@_-1z>nuZ5a+VIB?Sp0XC zq|EiYgS6);G1ipcmx!oQ>=15lE1!NT2<@1iI%&?uH!?fhc7E7Md1@z@wr#pIjQ`rx z5WgGR8>IQ8t=4jLg|n5sjx|+e@j^xBeYp0d)lO4ti2^P0GvLFXXC|!N*#7(9;m0I` z{CM|z69}h&<|!+Lr*z^;oV(3y*l}_c^B`vSp}PneZAPOs-}JLFqCI z1m}UC6hD;#paTVqjQHSj=O-jJs|Pymb)L3Dq9)Ax zLH#b4cnZ0m3h+7j0v%l4QCBMOdZpLEbt_9ZV(UGCY1VkcBDLdEAaK+jdxq}hO~~n()3(B-NsGSH}#8Dv#Jzi zypRg9WDd}=#=>Q(CY%so9k=N>R*()?s-Wl5JM~r@`2) zcC{CLQEwKP9)!}u{y_zl)nU}11qNf8spMKuusZOg2GfB;2He_?K_E2%g6QW1GcPf) zaqt;ZuN6r^s7#;5_!^J!KpnP~POu;dJN3VtmdXGFruQxT8J3$rIf$>G-_*T!JqEr( zr~6Zkax0(tb70!s66u#3Z~jIV{`aYmDXPWGDBfbp99<}87BvB!>HvU#aQJd+_1KEI zQBQ@hYeh1c2>(O;$_l?e@*%>o<|Fzn3}?X$_&?xI_=E*TYX%HMkY90v#kk=H+v|rA zx@>{+Sel%O3W&|EZ=3@7a(I&>7ET- ztiJpEE-gB3m6;AAbaV=^%@c->)loh0+jMLAE?c(JB)A5!48?B zH$sWj3Ld4UgK{DB9Kdnq?3^A$p zObw~$C*q6*OD8W(S(34xE$b)>FxJ;Dqa>Hjt{0}#&tGEWzx~AEb)=D+UjIwxF$!23 zrW_yn0jWka5!3-Nyx_?*9}>ri^7W-q9)8YQunfK7X<{}}9KDC?sQ;8Fa7g$t`_bI4LQxf{6<-|}zg~ZK*pRKXesuMU;jJ+}E~Hsj;ibjav=3mUMY z9v8#zzk;t>OGZ$#;jJ(g9MxU?%mJrTotgzmFPXlo{5^~bqQSgX+2U4lKG1-Col8YO9EQZPxWMQpZPwB`kTA17HWXBy z|GVboUXI~!RS7(9Jx{2Qo-(A^VxE+{b1ed9?Ijw2q+EY?lXFl>BP^5#j*WZczP;qJ zwm`)12N0M`*goHbJN}up_Z`Sb&%kgJhc=SK3?3%e05W(rpLq#m_-ka17I<7^z232W z#xKe)WM;wYHDcFSJS-Y>cf%9zBham<(N$OgDc`looClxEP*A-QTg(%H?t=3e3V|(B z=`kqq(!>R$F!`pR9tC;Jxrouu3 zp`IVLD;VD_Fq_2v%XnEg07VlsH~d`LK;s>pTDsJI=%@Ue`oaA*;_> zqE0zbff=J&9PV_>Ow5Y6T4>Ec@hz%(_>}xxe8{Eyo#+Qo@jf6TkOQ^jWcqnpxRm~B z7s+#sf^ODW_ZD2%6K-^jZX6~mYd++k^M;?bEC8Rm?2Th#mpQ&UzP6!8k)+A*$m9zL znF@&<>Nl{7e!(1*ax}EHs2kb?mfXqhnd|zaawE(5Q>6Z!eyEoCf1Sl=wO`mqa; ziUWEuPk~-m13gy36g~m-+u_v1EsM(HYje#)uP2g77iN~ssO*J7Q4r@m`j&uy%m6@8+ZGUFVb}; zRNox!bkaD~hw_i4qck(+wU83{HjK<@lc|f?IHM*omG9)>=G`o+LTPT-|Mj4j>$5Iv z@G|6S;hj(s6Vv;^hU&^FWVj)+*1XCU({=$rHaCAC5%R6DErRq(c_VF;T3^lj8I1iE z7J$_=G#+(1<`4x0ql$QHL#ovha^U z5MLCrGQOOoIZF7k@sM1p>WL^z;FF5oFq?MB^2(nj*F~O2~G#-^T9VvuKB5%)AhW2dVR^s&T zcgcgo=AS{ zim?=b@pB$L3-18W|B8J>_Ej1_J)FeF;@3_mN5m6jx&Mj+H$Y*xY`->yV6%}f5{1(7 z+dU4cUZh*PDPX8{L2RAF{p!4nAq)o|p_% z>r%{m;YWXJZ9UcW7rJv9?`RJ($rMK{m`;Ip%2Ga>C};&}ZoqSomXrVh_^cW4IiG?* z%YeiL?Bj#F6KK|lzF~DCtoVUnsqXH>!Da2f%@Pjz!1&a zFZE*(i!5}myqzXO_CeR@3x2a_imV)zdn&7zy(#h-6H1|mF0*0?V4gRGf?7ZU&2#EE z^5y{vqSiSb%v>5(g9KiKYTQ2^M$S(ZePw@ImBtG=@Yv)MGW036i1Wze?qGSgY9iQ? z!N(!%?7#7p;+2>9rlc$w6Z*k6unA^(sd>p<&!|D1>V~NDy^z23~ zQ%+!@%mrLr0s4gW88Lup4C?_BPetG&b^746jN1ocIA^xy*N53!Jx>X~+bVx<%xOOIWPl62nWu$9H`5 z6LadtSz2(vR?7SJUBtTXy0%-oryB87L9t`#ry5%W96TJ2hKDkRg@yVcFMSvi=h7fJ zmWzjzT~`CP$#C2eTo~Pyn13FyDEegbrbK!MDh*3Iqyh{CN8^y7W;i>*GypU|*6-6k z>9?j#C&O%|EAm%+ftjDRw@;^BQ9Vyuld6D~dDv5~B5rAW7Wc)xa+0p&G`V0-NqyN_ zFQ=BhhP~uCb#3N+tpNMlOHe*W?WGjT@m}^=$58a$v6-qFS(YV11#YX{w!meQx+PTX zOH}L@H~YW;4%Ko!2y+X{aob*mn&`OIy_nXHU(_;A*k! z9zt#q>S8n%Xf*O0T*u*f4~Kx6zn7!8n#UYj7JmoPe>hEHf(ib=07F2$zXBd6 z?Y^zfqD^%P)JpHPy%vRZOVP=ZH+%w~zP4?I_b7l7-=mFRe;KGyy&o`~L?F)J^S_%v zowr6U-1%aEJvzb>7;fSTW0wwwfB_U>Fd)e7zb5a+JfQqKam5)YdCK&>f~4{rhfC*e zws;=0*u*RCo?84ADF(l~q@jK`|d}o3@D*gNOzw&myjPaX$mmHhJ16A+bGXsz@o(z*0>nkq*Pj{xj@5 zK9NKqU7b|z9`LNm=cy#}Pa&Hw^xNer1NT&cr-vxaXZ&}wj?w9B)P%8&#(#I7(wO`J z$D_`f4&Pv@LE{I&op}ZXeOzE>C2U_TZ8FGI?-fiou+JVNQS1L+gfgPz0c{p^Fx6FI zRn>p%EoC80R%PiB)h+4K(4t0Eq@gIWf_bI;Mm35!)LFkZIUE|KBi}b=$`)Vir?j*S zz628KKAH#8)oXK`az5^CF?oM}buW3oR+_*s?b0^ty0k0192fT2UlePhVhUv2%ZE1S zQxiIhLW0)Sj*BQrx&)3xrZ6LsNJo($$t3SQSASCugYu-sGim>3xHw|8_-u*A3xp$#07zS7>(tFptrZt zj1Y9TVCZ2kn*|_D2*HD}fHWS^2SH>2M&w~W3@i{JPX^(-JkbS%!0|8#Y(gVZXu}b0 z5+H=!!-Omj4+tIu5Q1!S*fxu8q7+$E6sTz?UGp(?3Y1|!H8L7lTSk3gcpRW|uu=BJ z-OF#TLe+(>!UjpDLd)-M9Icv-u)E(JR&W_s(ScUnb(-jFoaPe|I)@qZDNTK{@I#M- zv>|`ax$+qk^^qg8Ix(6n(dx=pxmzwmfBNy*+ggl4kmLOOE-pHnH!AD9HmZNQrG>iW%`4oP%N{`grI94ao9YQ*LQn3Z?)rK3P@r!);X% z`nVd6xQX^2l}t))t87@K(zNh8A}%3<;)Mgw?|K!9f0X7S#S z92KXRcxA#b%xGZAe^eF6B$5IOSQ~~p(@aW?iav``MK7Al8ih0-j^}DzNd$zSkP%<5 zaIY?YeKvQmxcKA0001^P!JdvkPya#kw}eH;RkfZ#D{}rfh41d z6i5VuLqG(=fCQl+fMyH?03bvhsH&kEpF8ipKoGkgZ4P4lxM-2C8{xH-l*+m-?u6_5FM?s<+Jne3*qU*Bf1UwP=r57%cLzfW4xl8_Ey<D>X4Or61 zQ1D`7-cuF>IhK+q3#&ovYOCwSL&g>?Ei0r}Fz+I80B?LUHbK=yTWXt90|&!V-^_sz zm}5m&avm{`>J!TO0GqvZMz&lh5;s;S?F`c^&5zqOzb%ELHYpgNcEnIC))boZVJu|w zdy4y){>%(a03uiuP)2mS$tY}m%Do9*pu}klbhDUUN+(#KJgxFp)!joQ;UwO|x-2W!o?l@%HJ`gU`I=M^+ehL*v2-};I0Ez+ZE;bS@`=?leup>(K z^(kzd_E}g*VZnmh-7ZrZcR?*)NPEDC?#bp{v<2D;zPo}XQVSxY2qm4G!&z)ChQ$$Q zTUls#ePGalB1WdRfC;=C?1<7ciD3jzaLBOaXv_sgWto$f!;5suQfpfv27LS{!sDSF z?Nqx!CijhEY2j#!3Za`L+SXeEDDn{LW@xwuYI|wl5u-L)p@@2S2F1pPIqy(^VQJwR zADNOyoq;v=>y#6&sM>fG?95WGbQv7evA{%5SR&R0gy6*b?bHr%^4y`q^wv-Y34fn( z5EQ~G%qig=wTApt&vqvk&xaPW;-poeMvRfoaVXQjDPNa12{{f^QiU*h z+jN0p-WEQr2N;2q4Jo7*g5|uUX(y<|6?a##A@+0WN30C7O`aP*+)nj&Rb&2j^H>xK zh&Pq{i8g6(sTw>$Y!^~Zj{tn8Fz)1~3LgwJBx1PYfhRkQf|8h2`mxyA9mg*^?ywQ~q!~T2I>fVGhZPf0 zI+-*pH+0!9deEeDcRcB!6?aV`NU=1eK6$$jMnRcrc+95M6xiwIk(Oi5#gh2F%tq~- zKW97Eq(ZMz+g&{~HoCK)F#05-aP^apoeMDXvA|uQp{AaEn3R~riB5&ez z8j?^3jJqO(>R4D4N)gV9-sUV@e6%zO0B+{Qj-7;gQOB(t$|ZEK_32!JSu0MNrkyfq z;n(a0CUhiFq-nz#!k(PGj9nLIcR9V85T8fBu3S&mWQZ~1yKw|H4H|}(PxEQhFa(^g z@vvH6Gc;u%)|#H!&9ZdtImYdx%l|(JEDX1CHT@+WO49%HI#@+JmMVQEXH*;Q0BFCW)Qn`J^R6uL-imI_6}r zCN5xzIK;y>duR|y-m_}pS7321&cT%3GB+91&h|@U9)jqy|6WyB+Y*^A39fuwxYyay zrkXL9lu}i^j)908+oE~V2=ci%^L{M>G#PM^59G4WS+;*Q48XeN5DDi<;l79{SpROT zpbRb;qA~hJNpqqk3CVtzWNYA7#MOj_1%&$@x)>=Y?lWP6jCOn@X7d&`E|(R8SJmd>PEq8CtV_?hP1KZZ_b0=@o~tGXuI_aeeS@<UN2w(wL3vd+6%?KCvCeukLWa!511ZGDv+21q%Pxt zINH?#X=r@N86(c~^Z>pjHRwbpYs44O@f?tHs79+!aGU+|VT--imBA3fROH7I zJD%HBOc?}p*RP|aG^~o!US(i!?$N^j5fvLQj#8)A+)r(Q=k{xJg|QWcXc=6D_qmIY zgPHQmw%DEJx%4IbUJ(}bi|pk3u~Sy(;}B@1{HvaFSZ-md{M>rCz(e2EoUbgZLRwMI zSin9kf$gmm8SkgU-zI~;cds?rIg`eyR?qmL}Ny4vl&}N zQ>Rq{`qS()ahN;AH4_c>ae~WGZ37+nG2a!zr^?e=<2whae=SETuG6&S_L1x+f}isa zJ#?HSQ70E@;-p|5tShQ?G_UHCW2#hB!~H$t_-uelkU|6g-qE@SrsOqHB~c7V+S0A? zRAShh5RSXEZ1bOXSjDxpnlz-q=Ib(mR)W^c*r@@+{R8I7^%s5hmnr4r&vH>7^YJ@I z|A0+(2}Zv_9Q4RsG+e;wza8e4Zn2#@Sjy~@8pL$ljOLODCqkbjCRYo&3i%Qq;=uy` zl4O5qVB(kB*rsbg&yNiWRr48{8T`sGbEoV!JXd#AD?jk6=JN(DoG>HK5YGHj!0pE< z>{48!xpRkb3rI$VNI@MuIXnS<3LpXoknCnVROBRLpQ^l>j+{}MtxUyk^`Cw43~c?= z7fttxL+mN?GRr}YQQ$}2BfeZ(0>=5kse){y?p+|SNyOJ#e9T(z!m`d#;__O705c1#b=OgtPJPJ5(|BlfF#y#VEU9C2KKUbZfzYk1!M;&Wl$0QRRMiU|IjyvT3}|@PL;cZ8@p_t zW2;t)Vvvz+ce?EehSLH;0vIexl1Z&%DRI@iSoMPojfL6una$|v@a>yRNjFTuiv%V^gst-KrChC zj)9y9=LA(K=(sDP6Aw)E{@9?)<2Y&aHnqBm=(3f1EiF*EJX;U~!FuTm$AIR=p#+Fz z=`mrde@ys-6cm@2+noh~6x!cpd!a-05`bwp>nPzb>x*L8z_^-4A9c0Ne%-hfaF_mB zv?Q=0P(3=9FZtmq9<9|3pvY|NgEB02N^eB`I(f^1@}-|dpfLgk!-j9R{v|n71AO~* zDp0}T2O_+y<^E>-c&?&zC%>*R527hN0f+JCvKah*t};B$`zA@Ws)afCk6AW7W7kaF zPUPe|x#D!lp{-!>FVURVffW;)$@wmIP3wTbr@I$VsF?b3hj zo!?GPPIXpQ!Z|>JkruJT4LP_L0E-357&g0b?Jzaym8fhn8Y_!^lN(3%g2`PW=Zv_w z=1gVB)tn@Rm19ldMz!uu5O*CUfQnV82e25~3OVb)7CpaR#%NeF z&LkP~1Ch3a;?O^)8fkZ$G=`Ue_89sS?}`;3)ZnN5rI<&gxcfNyOP0dK2R^DKV`#bH zUEBgYOKr{iQ(hm@A08ogAt@vE91FX2y2164n4fo~1#Ia0DXH23GL! zQw1!+@#-m#ECsB3I2ZKY|L-`m(?N$@dD44W(o1siW<98Qlo68-K=jZ4O)0wX$NaVr z(wP{<;*}#EjbEpHjWgPaQZpkhP|R&?VpU>;RK0slf!XMqN9N^CXbv`pW#VfdL)T5Uk3`{Loqq5?j53DM`D3M z;C=2m0BeewmvGE3?k}F^rbw{;2k^i=xg%4AD=o;NMdu!ReEoeB@hzPrl28o z_p|)wU%fi8tWMYiS?Co>>O=7@g)VJyy*GEK}T-_h6%?Q4g+xaePl2wmwY9aSh$DNT!?fo{j z1{LrMwn5#ow1R2rFNA3#2N#=A(g+H{(*DK2oD$p8AgvOFg@J~43}D?&O5UXnYgXmY z>98&I>FX=fswmHb3k9R^RTrGbw3k=~-)7=R!tlK8IMth}C12>O-s6HSLs9u}mu5Zw z;8=TU3DVgWk(E$wH!Gd3d+7-A#TZOzV%y)CU4V!BiEqXeoo(kWLl&&OSPO;YCfZ_e zD8}4rGw}NvOQMZKhOU()tckq|Ng2=d@qNic;2RfLH%4#)JxYY!PijoO`fQwtyD0j~l5w?dYlE$C z;x?g~M(-K4;wCJnb{DxVLUWc;`c@jcsh`V0=~eV)TX5Z1Ti>QUy0mKXTmi6{TtLAt z(8or;wa~{#)-P9+taC1kS2(^b_GmzUxR3SHSG9w^Y!TN|{7qjW#?L3Ndu%EIS8-LP zen*5Kw9O%t&9eUvpWC>3J>XUn@kB(XA?&*IFVCGgYhFpM<}QCdwKK99kq?}&ZUAH zdh|;`?KYmOfjniGM=fu>=L9`ZpD*&n^d3e(9B@Vs$(On{a=(vAqTU`%RDpcoA_qmX z^3glIrK5A#8vioY|Dx7Z?^d@ivvp%TOjA~bn(5-SUirsZx>s?gNZFAduVIMm-W}1+ zeSt4O)g)RPb9s_y^Po##B9d_ydr6R$Z6CQbvFYQ5?z6t4m-Y*$L;LyBt+MXbw2T$7 z^7gVsK4AS--_;bEo*BWm`lQz!A7S@~sZ^uUS!pHax_P-=2|w6N#)^7w-jy^X`aTZT z(d_}B0es)xc$6za`h8U*n+GG1c!;ajoJ;N2E!R4qG3G zxgnCnw#~ivbm}`mq&o-mM6B@iJ5;uf-`Tt9^l+f=2FL^-7H0#o@7|!)dxY5W9bkfx z!rbu`F$TEG^#WZ7@FswYaDrg;G`TH>aD-AUY1bH<06xEOZC0|_@&8_5R)v%2(B-F! zYuRX-1&Ns7-ZLPhGH+}xG8G5Fu^YXZ+CAVaQYf6k&fW)a>sglLOr)@dh(%kH>w$IJ9t0l8L`qPR%FgS+b_x}x z8q^}vH&VlrV0G3_uY#hHD7d-8ZJUWlm6sakg*vaSU;flJ&kmA66Le~5Uw zX7E>I&>_RyWC~9ZOs@%_?3})=?{loYz!yJQ=6O-ZkGe@Cwv0GyXZf))+<=-Lt?`#$ zGms%*(nqV-jk;-aj|D;=-81ln=XUXv3cA(r4F4@7`7tBo+$jc$`rr#jJ< zYx#@v(Z$WERfEO+;A%ltA9$kC0R64J*Uy+}_$xd)?hG>Mi0Kp@;w zYpv@Q;yt5MluZn+36lT}2l;@tK@MLuqUA!*JBa|qUg2p0GAPC%vS9bfi$3k|f<-ga zG;1U#@<26WI*|F)xVMkQyQA(9TSr9ug&1#5>qqKE!q_M+oB!&|3+v9_eB+Eq8}|R2 zL)ldCQ*qVQM09L8&VGCp=A0&vb~1)2MP%H)*(tH61XdZkYF8!$n=G&PT}_T_lRo!R zh9(5VbnGgu5czV7mI*woWx0_k7U#$)R5nZyK5-9BD$jJr2ao9vXf3i&CZUkh7KwBu zD-r0~d>)q)A`_aB(N<@lTRR(aDMaI7T)#DVLjzOC5J<+8TGsjiehCQ@4Gyz<0W6|M9VE2NXSiMkIPHQ}S;;wFiYUHMrn+=&dk&3yF;o^MT}9DfW;dC;cPAmkuTBr zTH)Vzh>cStOZ-pb>X5w*Eir+foR2>V+rYX)3&8#d_@o?p{}NM*h9BO8DT1k9@x3&} z-1?F+s`$DXm)r+&LMH-Uqd7o1=+vruvP#9Jp1Ul|KKY=j*=ngCOP16!m>5T$Rnbz& zu3hVoJFXD_@QnihVT}RS^DBy)_hH8Ecavm(Ko=E`25o{IrK|P|<@^tT>S^TKSy8Zl zYA_foZHq$Th(rH_?(46_H^iA!BgT zeVL_J#sC|0BhV?am%0!7h-)svhp};`kKtp9h|VnRX>Wc7^lHi9x+g$u3<3voAN)F- zfpo>JqCdsE*`;%#P(wTEMGs82=_h^Nti@X8(;wNRjL4#9^er3v#x$t0W$#XTdEZY& zl0@OE^BtFM$uN~jp%Vv*=-w~ z>Lr53 z8(Z{>Xp(YLa{3K4pLQ3zl+0GVX9j64oWi&SXi8z4?v2!wNri_yJ(2ITi;73p^m&RD zaUBuO%MI*VoAvD(+;*doUtoC&Bi4ltNV|f(&nJ8F-Y>;fRE^Xjs=%;rYJkYXYC&|s zb4_ZbSF*p0+>!N?cyAZW?Mo0kM#6D|carGqFqTg-H*Dw5>)0@(FI2n3k;Ob@J*#ce9S4Y&@e zS7x}BZl1D0?cwo1{cg@>OL7P$N!i&L-DW(FZof2wc|mIRI}VGON6r0W%OfW-fL)zj zBOptOgkei|LWD?<8lCtTkIEl#FZ+{8Kei4g`s6627)37QP_)wXJmG{MmOnN^+U%67 z)9_`M6@^KiP?K0e7=tr#H96jHc2>NHne{sj2!jWI1TMc}8UkIh**!DGm~EcGR$iIb zlXB5#uc;uTvS*E>l_qOZj|l&CFVX#~06`i94~?VAu02{41)vG|GDJf^9MToIyU+Z) zP!1zAHA6uuXAAGpq5!OuqSV1Dd+Mpp)X==#@D(GzDeDHwS0|tBdhF@`h(kKL4coA> zzuc|b)8)A~E=R6!JxfYH0+?82aHnbKTo1LUuY9bXLQVqrU6&e;2rzo3c4a83<-Q!@ zJ)vmf{mu><<~5MM*tE314MzEZwOPP&iK2rDqAV}5`rL1B9gej1Oij_|;*I(xdII*# zQ^lVdW-*^72pT;EhQ8n*jMkK-(ua$AE`Vdhfc{9y*atG6%o@98G>h3ll#vGnKjKbpyM`ovnyOaAJn$Cl?ri_yDpWRBaBU|UtHXp{zz@f+lP1^L!q;3ja_tTAaS+qAO zED5GQ(lHTmDC9=%)RgX{)qumu^22#$C81~40bqqF;>%0%%Yc=04(LNC>iYdF%rIqA z%K#K+MJ>>=r-c>IUjWKP9&2whYXBCi#xhnw!oF4(3@S|^SVG0rL<$lL=B!XLd^CW= zj}lBb_Y0}l-!CwC6ItLda@|c}d!VF4HcY9RPl$fG27m8hkgmR_0I)M5S`uaPtzds$ zCy`J_(vVt`WWJx)Z9$M0-r@+$`ip>c(MspVm?su+glz{-mXZuf&e}bPNyz6T54bY6 zyJW^Db<|+{F+%@+@zq}>Z1q*}j0(O;pn{g9&Jt26jQ~b{Xnx9hFWd#7o-@8V&O;-w zGGx9jUOX%)il4v*#deXt;SlZH79caO>p`Q|myl4u2Q9FY9vW4i58HhLmez=T?}}<7mYaHf?F1a) zr42s~eD0*lgRF~(Gq;$fNF*r@lF2P)603XGw+!wvDx`FZ0g6Ztzdzw*7vTygrq znKa#rD&u(_o(v_#8n9OqB~-Wof)bDk++9)KDZF^qtV|@@wOdP}QmW)r?@_!(qqO*@ zdY+h)j!mB*18;UkT6Gsh8`BA;iAoa2LlbB<9h_UB7)gUpG>9!&bh8Z$5M%r*eaO;bJ${uP`D5dxY@99;;}E{6(~OvBaVAz_F?irmY|Lv?MPlP zp5L1Td>9kfj`dr1mCRI%$@g8U9e#y=cmG`^d1@K2eEAL(*Qui? zR~v%aSe%EX^kIQ1B!Z>VLibQUQ;VL2vU(6N6^bjW*vujIfx^2DI%IXOPI!88dhnnu zX|1aKIGB^^jVs#?(w-_ES&m_m@3CU=5d;R0={gq>{50STd@ve5irv0erD4X) z+t*y=$k!$^F@V)Jz;@aM)OF!L$nk##Ho@%@&%g@J2N)8t$U~^3}X3 zAISw56{1?%Uk{4`@)l-iN>T)cT4&xea?2=a@p`wQ-C-FUqo->yVuKl#-EalNov>a0 z$5>ujHA@Vle-a)S#K1YGn$ZZ$;XW?KVSnN@^tE>nkWTdS7!7}7gFl-j&e=OO;%_p6 z0;z8pgJ)1}spI09nx|(LPKpPE;3{EaBnZ$^W=U7VJaGbgP)UcTU1cUtmkzdi(O3j+ z-1*dDD&1AJ-1BQ!vfv&15dW<{dod^mN`FT22Ch0V2Hz$|uA5K}Xt8tpj-12y!=vNA z8ZBqm#ppr1R`KI>7vQNg9MF9M-4ymWKmuW2@a8tV^9nk-Ww_;_nmNQVA+S_TTn7hc zqYx#k225dXyb6u&`e(CNK($1k2sE&)H?k}!trh5bGQNOW4vD2U@gRy3SQkf(zAc3I zi&%naD!=DmBu=UdTl>Y%mpFFAiFHa&Ku%gpGp$(QQ>xATWT9z#f^kK8I0Lwl)IX1I z3#!X23!(PV+*byehzIIHO<;o4s?T4X8ZpQ4aR{keo(C#x0zv+pKZ~Z~-i_HWEH@rd zmtdja{_Q;mQgvi1%VcyJ0Xv8ekqfNJ99%;hZv&Iyw=Z4lD1_$=AAm<40iJxyr=cd6=>~8IZKsWBZmH6^j|%}FNJCRo13l*B8&7*RZg11u6i6Q zs;yXMde<+HA?`;7P*6`rI7jLfpqY!njW&S1;2S)yLe6d69j%OK`C(TH5J7nq=y}Nz zF3)necdr|IVF49~^Q=0gmr5G2!PsADATdUkjSaAFR%Cv6ce?ulC7Xc-H)z_08LUgv zn>4oU+NExu{yp`XF1M;>wqCk3qb;8+-2#+N-aEXH!<0;bw z;@v#XoGwXzV%h_zKae3X<5`?aQQA-^U-BJdRKFIt4s1~X7oA*R09XKA03-tln7fze zDCAz93ysez9os55k9tn!V2f~1kHCuZHU>0}~LJ$ZXC-FiZ&qnmwfG#0SC-FIxSaAn9iR2g;AHsE$ zPJymV=px|%wPgtCa}p96+(fGl==So%pI;d@s*XguBxz9%TUNjF1+Yn8!V%#PfBOkk zM4c7Z?Wpn-5g7RDoZUyy|CYzU;)}mU{P6H#v0y-+%jIuKN_+@VaM^sMgp~MCc(djn z{vlBGU*<_sjav>u1n^+t9ORQV*;BSIpGOY)mr)-|iivRue`PH3?4mr36c82)hjO80 zO2{dwt5JPbGvXQ0QuxF`gA{2*d(T#8Xc|EVZOA!*f9*I>RWi8IX!e@XfFkR!^`7yM zd0!hWvP!I~{TUhGVAO4u!O$QRbv6_%v|^~*yHwKpQOOBM&Khn*PstB@N`vdH;-xl| zB<%)rAP5A5krqWkh&h@Ej8<_;1SU0*YzqPWE(vrG(h!6*|7&;nizb!+2#lpe7jgr; zrphd05p>0~(Yc(NdEX5zJSlaoM|v$*E|u?3WZSgh3Rvp(7lLtobg&Kh`TgD?3#o|+ z84qM!*fpdGfD|Ot$JDps{lsRGv!MLog2gaH#N9C!n>JMsJ(NnXRcwm~SBd|@G62M8 z5W>N*GT2^>u51(g?-`eu)1URA?d4I6sbRMDw}QolLS{S$PK8pYbtiWBp)C*e!?AJ; z&{sfftzcFCdv}->NO&tNG7?Ni?Y@@kHf08dkTVo$MM4DgT<7Rm7)X{VqfIlh*)o{< zqa@zw3H=B(h!ZMjw8?6ofrFli9lLV9DWWL%3+U18@HvZ@2wrV)MRkH-jI(0;z6-w| z%{$||!0HS-qG(;JF5>78PZnD6b4QR@J5S;DRq@tk6h)=PojTdlRsILXqQEU0ZzO*r zHz+B7NLI9U5zYoE+yA=BAWpe-m`|ny9Yp4osM^tKTXRx!eR_1xt=O-xSpuJ9y(YF7 zAWq|yFoi@IGP$`pE5Vu#8|7*FTV*7HLpwF2j&Rjea;>XI(zrp^13d4rOaW4;uYdYZ z-PR>Ci{M4u9qFP&>K-4I`k~Q?q$4W8a%&|$g3fZ0cZ8rL5O4#?FIH&CeEg^aF?l}Q zSx3{NI77Kl5kknz8*aB1VO)M)z4GzP!$tgvJ3P7BfcCw;$( z2<=me!#@Ib6PCY$N>8>G4@wn}=lQr;uO`*?BT3MJ?ZQvP2TKnhA@GdxI9$?J zNCnlDUD;3Zod>v;TYxBTv*ztF;~gyHMl*8r=_K!AB1Z`FLK8&0ZH0f%>RP~nzM@Hj zx{=ItG3P*)WiiT4z)00_)~DI8aslM8xH3HJm;p%YR--$vQAVV==>T5KC)mtelu|j9 z>m3ai5%TmAcO-2MoG?>?jgvDA`kcFymPfoqcr6i4DNlaEhABxT|9QT0Ze6Gqf1u&w z9pWM&aVYzl()r^zcYpdeCDCw;V#{iiO;bPXirP+Q)7YWn2R0LqMhhgg*bsD~Vz(M~vLNY-b$pf2MY%sg4H zyb1LX$RLh1EkEUu;*L5nkFP9QnJE0nM0G2}*^{$EHE@zn1F{1nayhK!jeP4$?9T#?Pt13- zX6De_Qj^Ay`y`I8(Mu<1q8Fhs$`hlS`BxJCNRDl%L1fM$5LxbHVg-rPgn}u=C7ZNV zJ_hkp=rA*a`5<-8_{H3LU$N5_HTN?dY(9KZRl6)wOuP*`Z|H&4H{33>F}_3q?}ez0 z3F4(<9A2dacM*V)2T2RjuseD1TEMHtG2@duEyUtexA7681(fAkYUR9FYaX?>|O5gx@mlg6l5YeTc-uPJ0PP%=bDD`&2>b<8i#p}Sa;f8Eky)|{-LV^ zV`lM>73eZSED5nC!F@Qw0mKLo4aCUkA_RZfGt9Q-C4QFYLa55aVM5V*J?NtE+n1VqLO&w4m zAancFTfO2h_Y3P^b6Yd4LrdY%aTGyyi1~=jLPqlyn=WQ8fEBCWcIB`|caS;Smf?k`4Ilo} z`juVX%_DXcpO}YdRrvHeoVk4s%vP|De|Or-%i}uIH(_+f3~s?lp2?_y08nP-nP3y5 zdR8B#=HSrG#JxYvA)!&B2~D#VYdmkcENA?vYXnLGav?)~oQ%?fpoSI1(6t_YxQI2^ z7>~>&B9d5+l;sZ(9`R!3E73W0XgreBFZfzZF{h+=KShjY*6z{4WDj}bVeZsIC4^JR zlvqcVk0c;5z`9(r^2`C9{@};;;`g`)=7D&GWiw^7t6(XaW{2@e9h;v>rquZT=gguh zM+Hud4|2UUtt4U|X5Z-!lvQpOs67nAumS0ueY`T7|^?4?pz9tFCt z61RAA24!xgjNjwFx(2leo#z{skPhnI8FNl4n6I9BeHw%1afqsPu3?m1#Id+#_pLTda zL_d!_n-$q8NAN8?&{V^=M_v@o?(z@Fbz)GaCs-t(4yJBi6XLDwZ$)9Z9WWd9Az0pU zqoJlza4V~G)^vb3E}0!343YwceGifR(1fYoKOeyayug^XU_<3pGtEZ&pCjSHJTOC@ zZDH{Z01=tokYZ;HQk7t?%7~^(MprpUQzfAaB2!;&X_ti}d6=GDSOuG=DXIk$I`|0E zZ}r6!ptmMrTd4?9yx9L2=3 z;40{~Y7HP;cnply^m)V<0Avm?ULY`KTM2k+GBY!2H83+XGBhg{IQ3eoFP&PC#Y-D&iHZ3+ZE^}`#GB8I@RR98j0KfzR2?7)$fId!t``bfJ zO5*iY&{=E4U;()hLm&Wv0T2R1MJXMO969of9A{Nw5dIQr0+|32@gUI|`0GnOOrdce z%VI=b`G4GAS(HxYWNJs1MqybUQku1>$^m%NFEs*SP_NzCqvF@a3rPN$xCA>E+`*`uqX$n!{Am@c1@ z;+AY-`%Ym4A8qJ#$V4_^qVyh84OU}Tnva{ghcu)xAfmG7@@Lo0#{h?N+47Y|8$i_K z05JeJz|?yfa8S{|oMr9w)G&a291yH}3h_dz{32SG_TMH0c?_MxOD`5>{@ z{QZ>PL?gi*FAO|W3igzo&z^K0CRD2bO3N)ZFO{IcyD=YV`^`8ZUAF&c>ra2003rgV{LG9 zX>)I5IXPc*W@Bq#V`yt%W?^Y;0BmG*Z)^Z&Wp8ExW@BS=Y;|sBbO2^%0BvJmVqXAq zVRv$AW^r_HY;SjXVP9rxZgygIW&menZDDq1WdLn9Fk?qdNkT(kGA=SMH90piG&2JL z1O)~M2nhrN0d4{?bsA|2l8KR)2A%={cpwCb7inn?sg$!6z5^4;%=ox4WWeBK2te3B z1{~-m@HspMLl8wEL_G%rJ_85@7$68J2`~yc3qTA=4NwkP4-jY(aCj4d6o?g&7MK^H z7^oSr8i4z#z!XVRkV0!A9YM}9MIyA#0pX-mh%nR^q$n8<_Vs$^<8;i&>6nj(e6lf< z@OIvNX#$b76%t`FB*J1ygatVt`TGmyn%o%V++l!R`6I{@J0LJr915`#qNc}1)s-rD@{*=xfd_xCyecz3x-v z7#7sK=RJqtq?@5N8E_|gj)q_x(C|Y*P4<>XtZ-V31Iw0jUClg-+KUaW=-% zSl7?0)}B#u)-LYx6er513b2cGSkcF{1}(A2@-OrfH_nef`>%sFFLR1$9il7S_?`8p zZXbN8A&L%+T4njx?*A%n@^q7-(-nuhq1KiBWTK)_&#F2R1F655Vt|7hE2*_fu0hAx zEA<(sj1H23+3OgsgA`9l`uR}nSN0-KHTIJ$QN!B$?$QkUg%mVap33$rs6y1MDyTUD zVjAQO0Q3#G8^9gN9?&1yAR!_nBtIqyClDwpDl054E-x@KGBY$aHa9prJ3T%>KtV$D z4<7nRgX{=Miv`&q3IIrjz;put&`5*C2*dw1x*ZAt|0TQ+A3$j7;QuAE0nn-fz@h`N zngpPd1(1pcfPx2bdI(^02~cVZKw=9pS_~jk4G>BW074J&{yGpc5h@ZQ6B-l}6$%yt z7y29+@)_zH;v3o=(jCek!XN#*AhIEEs3GmLv!4MVRZ?mWLO9LBi2C~f|FH%Ih~tuA zwg7kFBu4NC%;W$OHF+Vc17|m)G+L3zEX>Iz9vM@Wd zlp>~V8nxQ572wTq%Yv3o z07c0j%9ymnavjW@fF{;EXecHBrzIVl2;l?WD4q`Apn{6TVie#*g+` zRq`tYgZzk^dys8(A`m%+39?n47G~BCSHE@Rr3^6-8?L+3V;9Ivi6+ln zx@m}&>Y|M}Mc6|c>P{10)LaKUd=tI}(b}|tZ`b1)F%;!)Q>u5X5DP>{TUn=Ol>w}_ zNz*UCcy_r07zb=)DasNAWl4{hO&Hr!lsrEF)2gfMNmA~qQr&SPbMj`AW?p04oQpP; z8||Hf`6qm_WzwLH(QaJ-Y?KVaBLd$DCoeOlXFKwpulDdo6idED59KxkQ&$!(V5}Lj z=I5(821vreZ|g%?lpPe0G5^cS^B+NJijX)`vPg9m`Y6JAyxuV-3nB*{^d2PdvPPH# zkidf>=ou71kgZ@??Xx$6AIbX))u7Oa^cV)V_t`Xx*M`|N zDcsz8@nC1E^)wTb(wCp**_eTrXJwhUv%uKcSyg82EGlGb?5r#s>?|)>JL}678au1Y z8`5m%Wv&1Vu+sp8NSd=|mVAxQXjB~-C!z|lv)Je|t@Ekb+|J@+A_I_};cotEt-&%y zUof`Ul)o)ENB|DBP3jsihF{Blp^NllL0&8f1-6xZUY>qM%~B6^pd-N*1dKSM*0Lt* z&iiG7a)Wt`MJmZDFXv}7-(U!gn@mMRpIxWM`l9M#2$P3xl9z&(k!#)zVr8L35i=2V&A!dnmFH1+oNquHnSIl zd{w7vi4&a!2exY^|7qb>iSju<=Z=n_RvQmK2zHjLQ^L*%+;wUTVuEiLOmo51BO}&x z8dk0gowLdP;1s-Y0l$DNfMLMGFDAx71#9sP32yc~xLK_SS=RF*9ltkotwq-%eIe^! zEGvKFq2)Rx*se>>%x9g*#V**?G=z;?a&~Sx4R+~J72M4}SUeAjU*V#oQ*_*b|M5NM zOoqeP73xl?{uZ*d;rzgF{YuLOVPIxlTYA zIXKti&yro&&$rK}%WI7Uv&^~3meoDzIEUApmu}@u>$LY8=%S~7KOLmc=MzG*EE@ue zgM(87+3WR)NO-LZgI5+Vkian5XUT@KkX_!p)rhwm>ki+=&0YE{?DCV)%S1YU^$gcM z=$K6h+g;wYwW#vY60kvn@8agV4tMF%o$8r8 zkz_2Lufx>_Se=7jLEyl{?z9)(Rwu9zFuk~@8@XhxA0%eddYG{qiEnx+CI*rvK!5bnYigZxeM5)uLso?Fk|7&FO`gWgkns(G_~1Z~Xxy zDjD)fxDLpl*0-9u6(B$!=0SLRnsLWd-YiJ4ln!q%Das$OHRa6XfdJvaYj!$Nv*3z@ zZo=eUbP2h_IU0h-PSVmW4Q=IEOeL^MS6NMoOV)X>2$R~XXs9~JlzjbZ0TMPo8JF&M zgoX=Scz-Nv3!JuJ1m97Sx()+&1oH)RC~F!Zk5?FOWr%Ply=!DNNweae4Pno z_wMGE(@0^&7k=kxM;-yF>1E*Mx{k&jVOa`%TatCo#V6KJ{eZwc>=9WIAnUtX^-*x7 zTptQ-7K|3Lf&B46mek-2CJz*C(**qm!sxBpBC)f`q|}+>a_A87d($KD<)EL*6@>{x zWfLu*buQJ~-!l1JXI*nu)cpU20HU|9>yG>tZRXRU8m7w^+kzd!WT21@_r~fD1X!fO59i~B z^2oPgGa+^uORa>@O39_jj4J^SiNTE!nLmoH(PzU$_ez7ECAMMz2r>dgH+nQ*%d8?g ziy-My2Z(NCN+()L;vVTTnlM?-Il};v4>tmxh{KiF3dT0p)rQS==aPA` zQFG3R!j{#wnkB!>(;$eCqeN7i*NFRsPEvN~A&j~cyub$~=43Pbcy`%$pmRxY4L; z*1=^jrgb>YGX{0Zh6g!Swm7`dJQTy>No><d5>WVDD?DlPt)l!Z z&~A(-!Mt9`d{;PRhUvy6WUXw0T9~|XDS}=-@p1%CaPp-B&|xu)kay7{t69)?X-za$ z6&PYwJb|PMd8`YEyY(kYzRE=6$Zp)YtpWe7muOCL6x*YfymBQ8X(}+aGYS2)*qRK` z2w`V=&sHKy{0w)+j@;)z5rNZ!V`s5Jk1`vQ=U$RcwB#AmbLDAAe&Z+v68g&PQQWL+ zx1GPfp!rgn5mZZSMFCAl!jM<>Xm+_O%-hqIml%v>-WE!2Kg@>5qSQ&}mSVcwp*NO& zkm7i^bm8xsE;?Qj{$|Hl6*Lm}VamP^au9apOulGr(XME>ZtV5YW5rI&{pOWhV<)0; z!XP@)t)8Eb{6{Op%PO2Xy>2tZCwx(jaWvWi(K6k!$bu3rpHb6cF<{%x2RaRUakW$4 z2u&^#zOb}a1Gdw=s*dluA-Sep;mN~2Z{*;OL!8~n<~MN3Kpgoh$6k_VZxIOFbFR*| zg?9qQPA{7wd%|Qh;!*_cA;Ep748C+P^C1gKxwpu#c zJI>&XK`$pz;8pEmrW;u&S2PuynwQJCCDFWMBKSF5 z1vwD1-zIx3t_xsi6hA;9FSnqLY822i1x(Cb$xtV%VXi!tkD;TH0TsZu^pz$xys@u` z^kse6bZ!A4AICf!Yy$!6aM#SitHUBuIYLkLbrhFd-~G17ro0U=}JeD7M+4%>C+PwQn_^aZ`G@|PF2l)Nh8E?J zU@#p{@@jkIb&H1ARi>%TI&l@cqE-AD7!C;)VZEV>uoaddCv3F< zsrK5foGuSA(!#)#%n+8=g`bomJgnlFZp)8v7uIg?F+m`44y$>b1!l2Xryv9CfQ!T1jRP*NQ4bfG%eXn zP(FT4N<<#G!$5Fnb1b4AjcRM%3)dacFcAPg<|+D^g?&5*h=qT)FwRnJM}eSc?#e$> z9M>vnxXA8o4UvX<8j$`EmXhK(oye82i1Kkvw1r6(Ac?dVe6P!1DM6_$sm4Ro2E4-2 zRNdVg51WXr>e4HNd6(BThpxx_icV1ySBj9jf#;61Uz*-)q9j@7jjg!(Jv)M4ym%4S zOIxOpLJBG{ZS)=+67K-SiBut1H#7XgKXc*^smviMO?iktz#BGoJr=Wi(7qYlIfz~( zOSDj3Bc#|_Qr#I!5ISAA)s;t10;Y)ku{5vA)i2sSe zc&(yE*nlH?`05t{(Np}0N2*7bp>GD)9yxNeUrA)`jirK2}02|Pghcl+^&B+G< zOB*pI)Y9Zgfhw`MtTuRIMarMBe6~=_eWZY{i=!%^eWi*IT^dm|*x;w-#sR*lkp@ZJ ze7pdYaHR@b2Cxh`27Cp_z<>>?NfOIK$et$Ii5XFXNsDIeg;irXV zb2jd zS=VUTlzVM6*EO5-w>(G=o4nsvd9J~h69R|Us6#}g+8%XE&5VpBNjl?U5F{cH%OrzA zb@u_IM^iO6Gc%f^f}}Y-(FiI?b0K6J0sQuzE7*TuD+l!9scX~3*=25!v5FHrOw(W^ zSQj2C3g-|tY&%4)(!a>`bVO2xh4>UgO_qIQ6e$SX%3e-{YEp!q##|WYrR1Cj5?aEX zf8Bxym$A1BY7X*~03@40uv#b@;G)AXStCDeRgLm5jOg$f{$(|J8~i5?9-{+wFM^Bn zcuishPQ(xo8Hn4gwk2G}c#Yc?D{(5sV@hCfn#f&aDeLS2^GsMl5&;_y<89=`#T26pC;i0LA79D47KIsAmH3++Z4npkN zd-(2*21i%SAj(_n_~;um=m)mNV%V}q-y3YG18s^+mIuGp(bxF?51ahb%Tc| zj9=2hJeFSvK}q~pjHQN>Lf%_7egqnkb)df z^eByPaHZb#HJyR~r6h5xhg0lzLNVYVC0fZ#u6_Xg#ZSV!>9%sKfp~3PW3^NbzYs-m zIFF|d#xx(XF*~A3*38Yo$Txi8{NXRKs=*6U5J?{}4G5b^`=qcwt%ch!Ku`v$Za0)? z_q#%_{*~TypD}i*yYLj4TKGCm^YoA>^nDsZ%?;2Ihak%wh=TzU57+$fInwRZWpr?X zUhz8<#pY;?P}5SG8snVrV2Y2KUs>q8D>R!<1edQyj<7J&&*(|CRk zE_Gcyk6e1!F?PBO^Qj}N44w0K3qc7rZGljd<5S!|mLs0vVYr12O!}-%v&03i@E5=Y zJ@eVA>esU~@i*hWqUZb1ccmnodVkxQ%kJ=LI?)fxm|L3X!4r33z?ZET7TH5w+SMRa z`(yvULj4Cz%{nls&!+_1_6Ikq*p*`uqwJ2_NTQZi?@cnr9}0ImqVeJD%cx+pjLt`r zUPM+&Ue|f1{V>=9ggOPH;Dh6-1V__)mQ2(ZaC$^cH))4hT>rV5p;ZRQnZy+!f!ZjX zxefyc(G49%Bq_(b1kPZ=UA}j&88V}Wp~sV`%`uL_RiBBa4@R~U#*TT%35EG- z;J9o;o--p5kg6kA4yqW9(>}0f$NGK?98026;cuUb$1?^O21Hn6LPHRpx$-6(;G+t1 zrLW!r7I#5)eC7?^_ktnh&>IsexFXQtksWAO{dA`qPa7+YMZ2<$0URKkS2F1 zy2y1>vKQ!c-T>Mp<1`IZDc@YKXSQ(*a<%m*hsH|+>AnVV77ihlN?>mNu1jKtGM*=N zkXXa5!c@+2Pxj1)As%`WMkb6fi@YV>@f#CC=`$+(TnVr8z!SAPIk?>kHqjvTwRyKO?-{xs>omm_W z(4WI+LEG=8u(@RTI9JWPs%|fey1N1HJ4mm@gNNO{oF$qBmXL&ccb6#L7t#96TnG7r zdO-4u8SusWEjQ)y9I)LRq9cjo6wH`KQ(ux_BX845qrw#6&j~;TO;j>M8-$(+?MakK zI!hV1Tdk}~xErWAe&pIy7jtjnd_^}w=NV;x0fQUw7hS#hmgF|jKBP}&>Hng8&3I5$ ziqZ6WFQB6y93!nIzm?W(izIj6fm{CxAt254*lGV`t_QjpEtNhZL$gu`~-5ji25hw zqG;E(S(dzEOWZQ=VD>At1!hX%e%VkiHb*|?2&~QEWfrtFe%*%l**1wdoAp3IMsiNR zZLrDa9}MAhHz=#zQvM`JE0mx4xA^X#kKb$kiHA$Nhcas%h!O*rdMDpD$>FVHM>=JF zDNQ2|fQ6a22T??6?7=m4ocrS3RHE%qc znX4o12bRKE=c;|N_Uk38ujx3!004$SdV314)o;Ma!9 z%>muM-B;?|hA+`NKc$R=6;vsXF9DFOJ!P{Wg}w*v;lOUW!)~{gUO9xjgphz;O17)I zrrg1?7|8?sic$U)xWd%Dd$x8bDUdwKRtSd*LJ3=WjLF|Yl1^35*O)oVDkLJ;6Na&S z$TccX2puduW#RQ6QO=r|cu^Q#6mzaF*KZTA#ToSF5jRLw6^HhbnAFXgH~I|eQL~;m z6#A9xEPMr*uqxG2+koTRD2S%D`BWjS6E6}-y+i!Cx6Pm=coT^LN3V#sA#IG5efP;` z&_!N?@6ZQdu%zoTt)}TGVO11UT^m5gTEtBK0r{1&cI%YD9SFD>(JusVxJqSgQB`DI zPG>)^+q^4K7&(ZEO2HFJ*(`-!bjbkuzz@ksH9yg444u4z9#7cS`Pup=eTF|97xA@D zo$-3<65yB2sE1uOf`&8P1;^L5?;%SGE;&HT7Hioc_Md_b@zy@Xw&IWi_h~z1z`?bl4 zyi)7%y;>Y6$V-wO>WF&Fwrlp7@9i7x&l)Mh+A4h=sKeSz8X=FUtC+A40D=cg-hyXdqlx*bfG9r&z7vTOvrXWBRA zJG}fxe#$NI2K|`psR9>-jKIg!);9oN96kU*RjOqA?p5{@U?2(s^gm8YY*;}VYG2)6 zS0VK>OK;Tezi`dSU$`+XA>DcNc!0Y`BlO^Vs&(87w;vTl*xKPG8FS0;GHb$!`h8)M zcEV*ZwCY1ChqDaFB!uOsEkx3?pOAee4Ug3G=Me=xpBG%W`3^nxDiiX(i) znAVb{hc6O58R)tV%;z;+fDB{%aw9Sc>^IoSQuvx!@L06LZ(EJLp!}|noGzb!ur+I6 zUru|LM-6qt-cOV`FL;WX2?1h?T|M6+8`fh6L|yneF+?=R9=g>Cny* zob$Ed&;C`e7#iDb8Tkf(qp~S51gmUEr`4#v!`I*V_hUeoOADmQtQ#HLh>Wwyczg}CHqE}nMFvBt>;k6+zr!6tv>FzA5^ z)&PS^fFt6o2X>=cxXhlWDQz?c8T)Nff~Hb`9)4v;{(wAyLWwlGytIk=v=6ocK(ZeV z$NAy-HK`0=&)^YRWC>ps_5p2~Xu1n9%5J8n~}z)U78JPiyq2C3HN zHiiE2AdgOQ>LWYxOFE@_6DYo99|kQ!OjS~bdmDwO?}mS{RUwva**DizH35T->(xcT zJ2lBB29Q2d-}&>H)sV?5@nDj@#wvTdbM@pj%*CT{8_x3h^M~7C7@JpEU(+Ibg4+fa zO>pAw2k1b;c2{SB`aokn&$Su!wk8C=L!YD0_1^<^BsO5r;VAR!D&?E!h|Y5WIO#*( z3+gVdX7;>m&tYsijK5IB6KDwcq(a{yjQYbUlq|XYLMqGef=PG--6vL>-H}Os`Oty9 zmd2ZzqBrA=B)oiBluMEVM;5lUZ-C1?LYAjc4vt`_Y)+G)6v6q%5HMfvLBu>^*TTsM z@Vdwq$Ysh{IZ{cyj1w7?m-&bt;^s>!gTk(e@y_itqtb838Djx)C7a6L;CRZtr)O?Z zkF1{J+1Qn6B8i?Q0VusPMuT{;gUGrBPuc>@FSfZD#U1y@i=3;An@fvHT%kByx?U7q z9~N)_*pW#3pC;xPnA=C!oL`VCx%$r4iF1LD!JIEd%^+mANxo?ZZnF?J;j`F}#AK4RO{vF@@uE6^ zd0Gj*PxMQVZm{TCV6+&RacDf>#2YzOB*h>8-zDBC9LLYL3Bo?QMl(DY_ETbgmoG3r zAQwMsI+jZo2St!|9)(dYS zO(SY*tY7(77dr%K`pLp!zFQ3pvH@y!eOf{g7?0~?hMgW^Cd1BlNL7n+czswkQMoEE zxzmYACbctJiE8gc`~*x2%i`2oo@MpyectUMF{#2@=Fr~ilVzAB0igwf1&#$*>wH7E z#rP_d@5+n-ik$DCxPgT{$&%HK(B|d=d5)YAQW`)x0E(4ED3MVBpfX|xghni(#VJ!_ z7M!%uKAh`KImL~3sPWrHpz@;?0mn(DNd<~YUbc%A@&mHhvY)ix5(RLaAVf!!JlSK> z+hZo(`uMD7&GD68_U%5!k&cqAWQ*K76c{6?Qot0IC^p?YeKMKpI16iq9QRhi0cZC8 zV_Omw7>S8UmWVlq;J+kRBpWxjw~wis-xKmC?2NuDU~cbGl@4aA&U{H=BaBE^F#IbM z6qlEwpq*V9yEu+a3LJJvz^vqxEU&^2NKFIY2_Ke*R2(p zLR>i`#*3ii%SJe0{JQIbWsO@GM~zMOsdfmZfNhMkTCk2`L2_46AjPNw{BA>BF6Zek zig`zNWyjJZMIr|gq&WuQwa|*Ya>iTVFvlL&WYa|NkA{FO7|LwSY`WtW$3otH9;tI2 z8yIBfRq--_MPk5Hz})Mqy))co$yvsCWA?8$l2+sUF3wLHlj#|_yzX$2prdkv-ia#@ z58O`=<)^LJ&<$&B^K(tFz1&=Jub5C?4my$-7<302kJc>FFvr!y?40TYIZW@t=+jZc z#R$mdGQECEbFE_UPl=ah&q78I>?ufo^^EwR9mSVpHY%@xk3zqXrt*74UE=}jS{5;H zRi}lbJ@)Xg);3wkXmu&ZR}&`FtBBX?8gDzbJz>?d4Dq_->&OvZ$UvXb+YdPV60;C` zydu{eKgQ!D>Jv-6JIa10=lV|6Ju?0sU+prp4+&@MEQN3dihm?%$T7174GH8|lve|j zzyLy77|`expU|s~{>FHVgU?0jZ!bB%I(fY-ebw97_oF<`uDmLz$Ec%EDVL z3BIS`fGd@0klGJ}div znZ87zK^3?KB@OX z$4~IX37{%~Pm>N&jfWGc=?8d=U=k94p4ghgs6)aMx7}>- z>CzQZaD?16GsVsz$=SyHD&b)?@Su&qsP*e{r88M5kn`CUb&IH@OdV%HZfw)HW*)w6 z135ZMCEK^9SDR)Yd&YJAH1ROSeL&qgsQFgbQgzs)p?yJl7NPGV|G0sPlT!^}@1XgE zj`I|aYdY6z(@GpI7_Gd=^jZ!zh$=}ntkXE_#XGZ?8dNtR6Dn<)(CsihTWYYY5tp9d zAR+Q|YFh9a>sx$~<35B4M?B8m*tdAla-y|h&j&FVqMopgJ`W{7<&bs;`6Bzk3!ZW? zMt0`7O!NjCCg9{DbSb=mp9JUL(iu1YZ2~|1@>RwUL{}-?mI#m_`HbnoP2cQr4^&cb zwW6DasGWtKKBZbJMn3?##}gi4mguWaqBn1QalBVOX8(L-EfR$6k=Ml&u{Dmrhn zet)K!VffG!tK%qoOpZNJ9V9qc9Li1DbHUSv3vqrBKAGb0?eGt}ra52*AfuV9VP9iO zsUhRVEY@C&=C!g0!h*#5CLn|WxzoTNSY4@6mS5CMhoZLiRU}(RZ^XnUfp^} zQBGui@w0x|WjTIx&B4;W99@n>+`kq*9_D(xnXz4}Jq@`NAoPqcmwo(C0ot^3X4K51 zvSEDK@+S;8SHt9Kq+r;i<4}tSuH0tEYVI^BgLHAtw!Z{T$*w8z?LgURWzHz6Rr~&LW%4 z5f~_yi~}3{jQxwRw;K~DiE+x8) z>3O2<1QsyvCV=^dy_@!JN{>9{1<#nVj`` zhz>Mp<~LIQXeJ3p7@}GMO?9J7Vyo|ViygrMa`tdwXd=@W;-g2@6|)L_b9dToSEmsfjf57kUiuC*iRS`ECT zcR1ktBIM^|q~m{gv=ib~mh4<78b+L+xFQER@B65S$S~}wUiBd5iG6KHs`6DOJofNR z?UMb9arzpZGZKfI<*2zNg=Ali_PFCC?ki@lNeDilM-Km!`Gc59=BZ%8#5(6(9HFor zttIXml&8Tk%C-J8NC6s|ryn&Xs=QrsWTv)?hDL&2{XByOaHtR_kGS?kFMRw{Sq~qYEFprNtbzqoiUjkd^QkBni{3+cN|Cs^1E;E_OOA6Q}>ph$^3wD7$V-}DLbVm=)fOjfBMk2byNcDog5ljHRHQ(0 z;>$z`5_tF4h^o5gDgj~(@4mG@c)+b$RU7Z7!t%G(74^mv(M5%KJ0*ZbM|6O9(gkUn zF>1N=g(>;^-oCF0hZ2aehupLYVJN=DWW9hbR6r9iK;P2qN7}2at3&diLB9TGeGN#i z!C9=7iCrO0#4_g*b|hh(ofm-pa%U^>{Jo>UKWG_JC|cnHbk)bkf=MlrE&T$yXOF&@ zOs9gp8j9*CrH*pPAcO`u>P7Mphat`iT{kAokg8(J(NOVZYwZuNDFG=b zit`;1&w>PcYDI38npnZ``DITSa3a_9btgW&O*EWniGm`6N)5|C^#lUXT-}qpE=L&F zCLcJbqLg6sVZ1=d*VTgz#bOrDm9J`jH%Ev~PdOWuJY4gY1HUM*D#KLt)<$oWd74PK zgEw%*whzpIAW zXYJUqv4KchU!d-6>B+;uCBn`|X-Qpr*{JiiTpBJLeQU~bC*+xqx;L$C<@Y^ro0Z$@ z6^n>n{Ns6D}>rL8`5a=C_@BPSYQi zke*>ZIHZ*xjPhCOzbF&m{f&dX>H84RBjdn4UJD+=#V@WdI+VJ|}nSiIftao4U$S+(VDFODMjy##z=9?S8k$T1AaL#2q zPL($PhE4g6W5btfS_!c?b0T(bOT|>}EN#f4nyvfuUI zrD6D1H+a%`R3C?YH9|GXC?^X(&lVk@&T-=90&LW{6v=BSzMrpgNVpL-qGWAwLK}|h zjV5bDtUkOf$Ww0LIG-^FxHNO;2Q{@n!iEwfoUM!+6HrhDjib7_v=2u4lAhG8L`pMv zs@=fRrz z9^pI$1hSjh597jB)0?@FM4+x+P>z9bzG*Kiye4M1_U6x`x9_jEy?N$^Ca%-%T+&*H zr<}sxQWRf;bz9N)q%97e9yq5tI1+D0aBowb_*L(VwYh_&u(xiTXbsOGp0Jv3bx<+j zLTNvNp^c%n;sFkaFL`|f8zJTJ#$SQ;vl73_E=kci@cxjO2*h;**)l3zqd!B)E>WJ@kyUee_^d&VNw{5jJc zsWD5#&{^heW=C4R*`uvcIS$8f{SDkAEy7k1apS=F`p*gumpnn@NFQa#hpzy}7J#xl z+W0eua6VLT>AVW=kRxMU<|#rL)A-SZAL27ep2CARUVv6JSoNW+p$3xFgVyiX%ZFty zcLpz`k9$GvWh+;{O|H%c4dE@$*}fGW!e797Vv*?24qtXxlIl`*aOs~c5RkF2tK9Ka za@a{0E+8#67e;bZ8B5&vKoh&fqr%w30kX4w)5J>Y8-AY`!?W{bU;Y3RR{Fcp0@obP zw9KQ^ZIG5M9)-NZmjPt1teM;38PgnZIq7%AqTCTfWo}v#hT(Vut86`LuGx%3w< z?Unp$uI8dx)kJtg(eI-)`Qhv{#-jtC9*^3Xb4A@xLVA+v_zm?%F?-1UN~q_@ZGsOL zLt%p10PU@_euoHq^!LmMDhIgn781$x8Ow__$_LN%kieo2fI&KQaK0z|_*#z5Ct6P< zp=f^CFRe4<2@Ienxqb5LUBdgL`aHgLQjp{P+Ir=54|hTF;_#PEF$dl>#Y<;}GYF8i zU#eFbbu!?FCR!)(r9(}zbW%FG6(FcvJM%jL4SO_~;lFW#vYBt=d?1;ES#!KHsYn~Y zpzF>*ggQa;`IK%gZZ95O?+f4XNt$PI`EfMlS#u1%$Lf)hfuM%8hS%qYtJ$k6W0uaaC8MHa}L53=! z!)lHLxZ2utUWU6{mCniZO`PH_NrVOQTo;w8Tv!Y7W?}@=;FA(%$e37?xGKKIDbd1& z47eu=4kmu!4WT1p z*wqN6a`ENB@~(@(5Gfp83WA6NLyf5d=H?v%gls$L`=olJh0cp zTI9M=25idXe*r;~1ImM_K`dX&h@BxecFGJp3Lz*dGhhwnC4^2G4Hh!a^1N_WVrEs- zEIR{>w`6B#G0)0YMCH|CGCR$_WLAlLs`NVw>w*H$_>PKwgacs*zXy0>E?9XMfN?}-{2;NaK;1q zT+XN%W_-DfuTywQQ;Ye|4AI9unyE((P-IKMA{_$Tj2Ac-<#JfOQxEi6p$|BH&loFCIG^DDKByu4+4cOl>36Ug> zg;+1c;&9gDz^5ant)aZ#(*_l_7fij4fNg;3g32Uu7{_xBr9w8EIlM;S77%-!bHT;Y zh8E!{dR2{F89`Gl&V}5Z-C~4`D=w;ac6W;dpioee^%^ykfhAsTK9re^Y$++AMcf8& zkQPG9T#o!QtJN#$6|)Q@TERGTgc0P$mXWs{MssZF0KYK}VlgRR-#GL!_Wnpy`(d2n8}#w8}(Q4QR2mk`S~R4v5COprw}eZ|?x!})vcIs8*}kNKL}wxmYu4o&aFR@ID_%VbVAeKNjoWc(>U)r9)=h0VM>cT&sugBBvdY>Bsn`$cw8eA$WFGMa5YOK$HBdo&a%Hj+!l zVUPaKH688k1B+PtN^qLdVFm`DC1VPE0_<{1JI2ZcIa*anJSzjX=R3LZ^RQ(<-FkzN zxhk6yU?RiGpEL83!iN0}C5D z`|k5|4+3lDVSkHULCRObN7span7{4KlT3mF!&$m<|cM#)p54J`iaP%M$~$l zs6SSzhEoF_9$JCuJ5^(~y08IUIZjzJhY~75t^%{h9Cv5QV`dJiYGtsO{v` zKimE|N&hxtR!7pAVPxsXIx=dB+d{}EbNs*QIVmt-T%$#LeJIn{k~B&E^QGaDZKfjG znWU@H3$|iIJUNZ{?1Ey>7~#VRFesz$2QTVjiaF^b3)2tr+{y916!ZQ{$2!o4=JI~- zCX0;@nRI_W=u6@#smOIo$0M#uT%+~q%PT`u@E5bQ-OFft#8Nz8&k>+tZ|AAEnKZRb zg*)v%AqRk7dXH51hS&^60~b-mu*Zk>;qZ<${f_14-{;2qU74695Sfe`|1S0nrJDgx z?L?4I4HuJFRV346jj9T1T_PW_Q}|dx#6zX>3xUU^(Z{aY#e}aYaNjf~A66f8oA&?Y z3q_v!Dv(9I&D?(jG3CEk2!44DU)KO6Qivv@3QHsT4Mgk)3lx>{ZB+#Q?**)g?r1FQ z*&vH$TyXqSVY=71In8ji_tY`@qaT&@+!o^7eVc3Y;e>~!LEEX!DK7!);4|E3@S`0L z=Mrf-(4-d!n6sfwkT(Nv-G-QnI*V_a2n=F)e+RijBBZU0rMiJojN+6jZAx^!KAH3# zZI*3UYLHdoe;b$C<3y4KA>HM09X=Ur@z{4iO?Gew^?xpQpVaY_gEsaMyJ+foC8-C8 z`QPEGTdi9c^I%$+sFCjd2BaCIfrLHXE86uspc4s2=!U3Db}6zv+AGB+S{Cg^p%qi# zvt6?PQl}>S+|YirGY#GNO2j49i!03ja6e=BW-(Nvf#*~Kep=0pW}w>mN*C1RNNe4~ z+zB`nr7Z`l+|oy;kJ5try7rf7HlZqmG4CGOjq#i)iB24sR0`psQCVP2Ss7DEwyNXR zo-Vt+F_w{?+n=j?2P4J*KQr~RukejlcN-kn9){-fp;mL5&*?RTpl!}0k|bBeM^@yU zqA~6|9~UbrBL(4v+T>Z=Ny*np8&L>Tz>>@hzzl2ai2bv7H%CLbxEb43*S%uTU z$RrF#y7C?pIa=^0ulx4+7^W8=a0P#(UX1{t5-US_ih`a`fkKBl$X;or02^BP1^C4O z6@If#smH_x#JQJMRgx|zX=pv8skw|;{6dZn;Vh__M}9&k2ax-neXca*WE9f9KXY*! zQ8T=$jaWg%KqC$Wy4cv3-38fVEGPj3e6fj%6E(2SHkWqATGz=8#H`x$jNyyZdKk-) z@AJ{IiLj1s5O|aHcn@nmJ2|k3(G=md7ua0F5w3xIh{G`eA2ghlOhFS>UXN6gNv--Q z7#-(cy{X*6(owsre|D&p+k0nRTe24Z&%p&Zs6Q~DMr==_FS<~hpG*Q_QBDeF9&HrmF?9jBN7e<2=owskkqm+eA z6O4vR|6*!%}tKg>+ zZGb9Otp0cKsI$9Zs}FjlIp8J_v2qX_+aVaqvgRb(Hq+MK`yJQ}LX#KR1Aq}Be;USf zKx=oLrdDD7iMfb!p_5(^R*O;4NjTC98U@|c>eX>e4`3L&Q+1_fWi_RqzF`LHvZ*bl zL%?Tj&*OQODMA7D2f=WR?O!W;3eGa7@n?RKndKjF5ih6|z?T%3>mN0}(9Ty7z zJ~o0>pgQ`SA63a9HVd5sknWGjbPmubLVY@-X+s&j3x`h2QEGeo`x?atTB z8WGZTa!NTiLv~RL-FwzmtqBkkOmNgtK_E95yb3`_^U&nb7x~89ZibP3^u& z3pJlmY#c#-Y)|2S2y?jW-ANO7s>r3fgL$rnL@pj!AI&n#k3)VJF6QBz%2nNLhJPv6 z`2d@!(=!mC@1B9z=jQCBE7}U)%7rz2EO&TwV=iiO(@;sYVbuCEK zrM5xbZ;p-sO)CsbnR?C>%P=TJrcC9UPMmy7`Q>JqDY2f=Q)#B_<4jXFZxWq21TC=u z=Lb#|m9Bo}fCwGwbdbwu+cuDU@;-7|tw6hQ-zG4>%7-K-A#Ema=}|l>n`9B|g&VpI z1wCM`=FIN$&@k0#7I(hl@5!BMR5jR(C~z069QuF)BEUDDAX|WnIi@f`GliZ)vprgK z3DewMJuiCWLy!G(@-;&+KzrK-SW^Hf-JbB>DAut!Kb_6)+$wu+4wUe!TBFtrR6+O5 zeYYKg%RH)*n{(KkggILnn&%jf z@n9=dyc&8zE=>=|6UW!}$%q1}bqi{g-R|O#;HeVmdO-A48Q(WqwwUmq8d{H(wxHTV z_}JpOK&0jB(8~HmuM7(IP5{kt`WceAPMlD1t@Etl3z_eP152n0BkOL|)if{;fbTO( z?;lX2zq!6$6)A>+A)8^!D=?-5P3jz3O+P!7^{g>(b)r^iz3I@n7V#pKN6387v7?}N zx&d#Bjk}eAT`Fy-dY-1K1cG|v4yaTa&5+PS8XsiYT`enaVN^{tPWU*{w{WCez&2(i zJ#Iw?8vTs?-FdzD$hi(YR+7w}6B{jdW*A_gfpv}xL5n|BW>~@&Y@!?|RUz6|B(cb` zncQ(D{%ipAbd=&xEZsv6iw4;ocmS4!hR3!Wy2i8!$Cutm0hH!%FyT@rP3p1MOg=#y z8#S!uoz|^u?C(TyLtQ?_$tI`(w~ce>ZBS0p*9AZkz(U9 zsqr8-cFsAC+Oj%b8h%`LI|u=xbpPAl^h>;*qpD!|8uI;St7uM6>Bzh*W_<}mXS?ad z*sW;to_ip%GBtXus7~THpVmi613ZF!s7u**o+W&A$7I&cypidsM^$b1^Ic$|tYsdx zJY)E;CP|4Cp# zAuK2&rEUW7&Ui{GX3?= z_=!khJT(t=CT_}>Jd=4UbI|dG5J$)~5m#>kqZ)oiSH#R3EU5xbJFsGIX`k816Zt$; zC%xWpq}^*|AbdK1tw}hI9b?Frs=FG-Z)zu_y=6NLTjyq6scmrJ=sRL`o`~`_mQdYL z07O8$zxS`DF@ZvzrXOtHVcqj!9Z^52FUKWr-|hVxJ8rh0G;U)*PcM(YHrc?0!sBb3 zQ)!uw+0{;c)!Q&p);{zat0Ku75{{xuoc6;cyd@kpzXw^%N7(Ps8X`o(GFP=u1Kl7` zd58@eU;w1k8mk;mm*qSRYneG6IRz!(G@wd<88RKT=k(wm2 z0T_PlmF^^F*V=~GLu@EK5g*XrG=3~4PoeU-2p;!(>+st^u_Smu(Q9VlMV)%vlrI+p z>O%uQ4eqSxZk-T?ub7#Ef(0GrCRSiV{!Ir%EBW)Fp} zRz0ST@yX)SSn`fnUEbW{4lg8r4hY=Sl$aPvGb<7r0RlVR954GcH%;%)0xK|za@!bS z=cZ=)?39-ecDBjkpxdyPzsZi~7#c=c97Wt zV4Kwzi`*lTBHSODcf;wtbX=JQCiM^ysYH@KH;AUFEtf5=y(=&vPwR=PgE`<2pva9Q zCrqL4OuVNGiv&qc&34678iAx8a(@ON@IMgSZu%rnMCh=!f>jyA5v5<9^E<=+6sh?- zc2lBQD!%6ZZk=r$6;gk;rY{F`4~d17!q5o}ACe9D78KB3vyZ#>-ndrFM|xB5>R}$! z|3agV2Sh2lTWC^=&1#rX>+91PFUDHHofvFcmhu&)ag;&%W|Rg^u+&5MMM^U=-v;Ar zC!$&aMAYWaU~`O&GDv@t43NWHHSI$T#R)c?wXZM@9L!3ijq2P2{(S~ie(?pAFQ@gM zfV;ylkog3ur#a1bDmzFPqeTwSpUXJ;oB;|+`s*;*`GL$YH9S2I6G7Wk8F^`ctiuLb z6~<&@@+>q$NCKXs(qW=U+XhVg^eKCwkEC3MeV`krRf3TcnqxUDiAq&Ou``k#2(tte z@3w-GN<$xH_lBk5xz?>_lmoXkDcs4vQS=nJrg_)2z=&IszygV}<^`wfVSR5%)5s~6 zlL+pZMSw|Zs0dEH)d8NY!OxNqW<*-o07wwLy=hzHqe6S_u~ff?^7`Eja5%BDi_ z`*nvlQq#X=>TE71@MW7DF~|`ogl-VtO@~A`FUrUv!>v0k7g~=YK;oq=xwJ+UwHFEZ zu^$g!tq=9y>6`|ww%$RiU?eR3-Z*Xe^W+l2O3}_x|Apm4wz6{W{Tzc%$x?$K-#MX; zO1>RZ4V*(aa}~7KR+>e4*bK!L+-a*kaWxjXk;gJ8EVaL#^bV&vU6bfdA4_?^A0I;- z8;*qYS4El&tj=M!K5uJCh;xy!nYe}=s?^@EUof0^HQKIiDz-imL^}s6I$`uYij?6o z4^>EYdin=~0kYzwig>-e+u5Ja2j|r+z@^6P&AOFCdylS;@ToAVpAg*5-px2L%|Q(G z%1Vw~2_w1cU=AG9lqjMcFxM~|)C#-3&TccIz~;OAWs5O5^EF#I*@|&qXv(Sr8T{f~ z8>Mbu0mI7zQPhKv z%J6~?s$dPqYE7eSE}?>i4FzPRDBaWZqZSB13!JBfmXXu|fS3w)Mk6?(pLqopOrK|y zX42U~5DH&OvV=G`rI;j9%XDF;5LL*xe%H~B_?0MEGY*#!tYan$^W~>w7e*?Z<#Z$n z<~sORANvIfmXXdSyh1dnMMY{m$m4`jrNXtI-9Z>W2{ZaP2e2rip!r!yvcQx@!?QON zjY^4mnE+{0I{muIggiXA5&%k@X^br!iHh93&Kg2q)!G8&otrslqjXb|kEO0NK9FA8?82lY1@mk2cO30m=G|nr|NLlvzKS7FtQ8 zdrQn+8j>?Zd8Q?v2HgnNy$q4|6u$vKL0;3{Y+th-4By{cCr_1(HH{Sq=b`#24-mNzcf&5>jUK zyG;TnB%OIzWxdD5dL&%~ZkL+-*~uh{bCY^TzmGepH43Qcv48#Ha*w+UH5eViQXx*5)t< zrO>}moqO{BnEPPZX0QmiwSM&eGg z{cRhj;R5&76@)cfJ1}KgN$0fRC)F56AS@^0WsTFI1aRt)P<(FFfV%IvL|9RZ0P4CE z)N0f8p6f#$cRtedL;x>Vrk9|%usiPzpPJQlzXWj#WFy2_YlfZ&j0w(g0jk5_2rRpH zd1BZj=6;SG4zsr_Q12<)82Bc2+jn>KKfC`73@*XMy5d~fn(0)qa zmPXR0R_lVAt4Co;&9*eUnleMNg8SjjC$y{p;SnVig($(`k-lFX_!hf?g%e>mgF^2i z8{mLX_}7f_{y$9fKQUoCWZHx1@?9GSzsfeSu5OiM0bMt)rSJ9(&aQhdE0yu^T{S+F zJ7#%$$ZuEsLwdn{N_U2e8Me@<4DA=u%Nx5fnM#KIuVAHWqo_!FmGA$#BjdNAk%U%x zlRk_~>QPd15h4(=E7Qn|9rgd)dG&VW77}6PAfx=H9(T@nKn6L#siUgL>zRgv!#U&* zV%Lu`2G(8H`)3VFzjC|3aXTk9(s%7U)7VVVi)F5}?*HNM<6&O86k#ucX%d|k4Q_F5 zF7X1G$g6c%8P=*J$zY%O9@lB9e0w;kIBoRo5%VjeuQh){f!49@WGzGG0mIPAM(@R+ z64vZzvjSBu3TPb1D#&hZu^2N)&c{Pkp+ zcenf$Vn8L@HPYA4&k=&jM&JygkhSaH5kQt8u@)w@^X4+b9P+VuRV3L!wHZ+NlEz?9 zhB3Us8y4`=XiW5pt&LU_gBJV&fYZWo#>ixjx5Y4RKg1RpdRhv7njrLfr4E zgn$oQ3^r3G?q57p>DkvoEEWhBzCJe;jJc^oH4=xCk?<@Du+Na+@VWu3)D$5Yr z?fgu?zw?~U#gmYbz_iH@V9&28<%Vh45m7voFNht4Epk zs=9dgCF>J<=0iHHhqUL^Lw`-f5pvonUG^H3PW35L`hOA)0ykgG*+mS9Azkq)mz?_L z6Hb$w-RgTLCC=i1MxcK59=nypf%2W1UqH%%Be9j}$=(?Uu25luwr|e^iY*7I0{O!V zE}Ck+X;{=?iQ$ks4Yt76PAC`wio(&wY0)_8SOE=^sJw*-4-UmwT!V?I+(d>zF2p>VCfysfcsF1CVxl7lOqK!pmo&G zde(;^iWU>HLsKKx@Wg{h{g03$#s-4|5~+)LX1h^U#6cOs(_jrtaT!|KgJJYziNlds zl#_}Bl=nW!1EO=OJ@{{wUj{oaFH@1$_tDcB)@tdTgN!S!TDQ~bTh8%~Zh4RqbTb6q z(xkF_({!&kVla#7UQ-xfm}uuo7W6ga9!ZB`Hc^2TEPRF=d$HY*Eisxii<`oLwbb~* zaT|#+Q9o7orlqG5rCu_Y3vSG;Y-HbkmsL-LTWl=6y)W#~yQ=j!B;+4AhC)qIY|OmX z++c|Kt-QwAGTdQqV#HEz#8& zmc_fyp{+gMZPCx;mjjOpzE| zaxoGXjoO&1wc)dsh#Bh*_fVp_KgLd zH{nO=dj^r~1y|Lnu48q=fTgqVw=gBf5b&75%DmMxxcxngxBvI?9bQq9N*F}l05u*C zL5}0ajGba45COqm*^Mdqw=f6tATMCTzU+n0fJ>4~2s$ zo92|;<7kh7rQz2hcufOXOHc^E6HTl(96iSJT2m$qN2s3h!0sD|f%V3xlPlgO;2@}R z%r4U9&G{)i=v-1eLLcu_dG~Y}j}7XUyXAcFykt8`ExgW7fw4XtkklaxiN7xI-ZiB> zW^>vAM2TOlSu4Xoojphs0@3C_Fq@SU3c(#ydLZF?se51vp6G-D`DZ=RSx#S2ubX-9?r%_6fPE?;~bF>L{Qw>UF^63oRX zT-!7IGJcsjfJqZGkG@4ue8d#!K*s>mNadv^DZ8}d>+={ZoQf*;&@gXFls=Xy9ih&$}UP zKxS+EK5SfOMYNbxMMHqPKzUfOP(hjbz81E){$!OwsRL5d^OJ{UlHQ?wMu}iVsw#cP zC+8?l+ZuvVzJ0L4bn;>ifQ(=py1<$&U2KS1VbfA*ATYqV~#f_8b8X|Re za{CM)p~#u~2#}H0bGd6q0aN^!-;wN_-Y&tbi4evH9908~k4BtH5HL--0sPB5Y+Dd- zBH!((Dk9C!S~M}Sa3dCW1>x7EB-;Rm{zVvh&wTvewLCGhRl1bZG)MwKS~B?oKn?&V zR9%yxqqt2{2FeMe3AhPEC_Kb|$lRP7N*GCnWR+q01Fif&K#ZA&gy0M32gsk!hY z{U><|V+S%H8eRT;#$)oQlao`6uxJe2gws~~-4Q`e^(({1<6aO85pXSpz#ZK7c`+Hn zX6({^aS>bIG$2M6#=6Kn7QFoK1uhFb{)>+=An*c}g)tYRAW>WZ@m}!j4%t9{_+2EL z3u!pa;VywpgW+_fK+h@x*%v5uHWU>~VlkH{N3t+BcNh{hrWFp6kikoY*%iZ%o)JUI zAExAC<5da<19(7%*x?v7xc}VP+~Wmb!w`ZX52CKeaN}QfiC%EwE3+p4I~d10vycUS zR*3*A`Y-7!ntDZM>Dc>PT1);RSrlQYn;Jj-=mJi(rRQ3PheR+XNyp~#GD#KT00jw>@0zpR49za~9(*kWc;Mhtvp_S$ipyCTyTGD$x$;c@ z_Hh0b;Iu*DOUmM#OP?kY675!}1qdcb_+d{^w^i*MNFR$jzXab_(VA6JvzkbdFZNy(Gq#1t zTAoFhJKrQ@&KCR4qQhC%EpItFdEt7SL*JjLh5q88q^!2z+^M~T55Vd)ijsE$v&rG3 z2+hj#?u-X34|;RFw4R+j48N1C6&Rm8V~RWB6rMaH_+ViuOuD*KPWeg=w0oXqf;Xb8_YZ zUV063V9ttZdZw-h0MJScA_#`BehfHni)gnnw-2+e6AkQIExEW*WdKv{x?WRR`DL5O zJX~2l_F7eb=mzh^k!sTak_WG|9(AKs%e17atgnwk{to2>KS&9tcfAtd{~TaNiG;FB zhdt49?H^el@lW5DRo1(kt^zi)X1txi(C0Z)ulcG1cS-k`x48wK?9b*P%$Q{kQ>uDN zld1zW_Bt8sMt%PG(H;uRDXP~;Fh|hU2_StK7Il*V9+FkKpro~`mx!qRor2EW4!|YR zDE54fDN$(x)9)&wHDtWx{XrnhXHYtYZbM}GVZ4wOFCI5QUPq`5h$#BQX;e;%IUJnz zkjW9k5ot_zp%Bd5i&qg7%AB(00~i+7@ePyD>c8o-)Bu1bq#Bx+SBau0R4NmS7Oxvl z`!&PjQfpP~tf3n-Ab5FsZIkXH7d>HKaFTA>1qyp;f)EL_D?d+45MfcPqTE-`ynL}w zq$Rbuts@K~pw$I?qvRjEfW!cwDi-5l39Q5w-n9;z5fOr#Kyz)Z+UdM0d`Xqv!c!VF1?iN7B)mS$F0^M7Ts zN%#C=Njr#VGLelRA6(Gv2N&HSI1NRx@JY4`C1rbjw89Tl+G7}5*m~NoIe>D>bz{ z);go8O}tK8e;b-XY7;$tZp5rq3O+D=Xiz+H3(TKOCxrYsg#>PdoKiUNyxYU^mO_&j zhpoYtLikg)+$jl{7mkxQk(m5A#5pbF0k6?)338_)CwY$?xj`Nz1iqwOj*77mIDUmiv4HZrpV~}P zEk~iSF%&uAz;m3{D!^E0=m(+XQqK^q*7Z}_#a597X}ua%mvW}F$djB`STrw3S|RuY z7wAIsg=8M`f*XnPd)k$c)N9?#XGH~n``lq9;e8TT6shGguIjyq++yRX)pf@y&A(pQ z$OVOALrZ#XK=3+_wN>jhZ}WX8%Px5dxky-<9E8)Uk*@ipa{ovm%dX_AcB+p z?vfWe6=6%u0Y~jEj$6R#3cN5#YsR5^i|K6gz!roS@?EN;1(jS)i#9ba@_e4BG3O*j z6D^V%>cPUB70{?xwope-3d!umATRnL1mR47FpY$oxRStu%XGXpWKHgM*^K9WiD^k# zJq?$iGXNU-bnLT=Nxi{>~YLHK3dm+ z&{xAgeITWSl`&|$+SJhTT38t`q-{b|aRNHjL-n)dAqq!(9p59)=Us9T{u&!itLeex zIHN1@<U!wF|85DgOJWxXm`bmGjABHI*)MP!7JS-Sq z8coq=VVNQ!MM{*SbdboVyRJ?o;|`@%)T2^-sl-GpwOoF51+eG&dW4T6MP1Gbozo%P zzWc_J?-G^fIs0-7H8K}v{+BZx!RGZF4*7T#l(|IqAuqG6r@?3-29J&G;0_l;tk}>H zBZ{_;nFeG;S!X4ZSc&vcbw;zDt(1o%)hn-9&V8E=tIq!68(jYtEq541HXV&}qiFKn zQdv@|CAQS2z-A}0m+ZQJ8-Yp^g9@~KyOl~>ORY}o?eoQ*mwrKXYxvtY+(_pw_q(p> zsX~9XWwX<02#;ajQJh-bdM~U_JD4wCi10%CV(SH24P{c9!C3q{K&Pf&FkvjGQ84Vc z`-brbV>{ho+G7ehZ8DWI6>&yE*@Yp%hpRtgLqpa&+px|~c^S*oEb0|BMgvs8jE{9i za+jzMS2jE0<+F>Aa^<9D$R%Vf#cF!zLrcFY}%gFNgaIE)(r)R%Oi;xrVQu3ANQN5#8q+^PrQgT11bOv)w!wf2? z0E)j5$$&H<*4fRL@wZEKO@mhRB_{w4{`1-Prp#W7HXmIf<(ClXYr+cL!jdFH05+i^ zB7lMHcLp=qX4nzoK>&R8+LD~9R`W&Z46$1VSr$hzPGryncqvT4E~RDYQm3a;x8Vxu zeF|4Z=c(Fb_8HC@m4mT%)72e?sX>7aqDRoHY5?7^eJ>}m3l}F`Gr@|Au&D3OY zGq$AQn7u6_%!zKrwnJ`3-AM*e01H51C__r->v!QhI><&1FDUA4ANbkGk!S5=qoqiA zv}Z_eGiA%4)>-R?uLQ-oLi&`fqHaO#%OH{P(L8ZID{7j!Ti!Hayj=m2PDroISosZT z&+1sUXVO%ez(bDtGyP*TmX&2qM>|AVLIlsir3p$7GEhbR$#RO>QiGzoXx1v4sVnLm zy2PYmRwV@KiF(H;jRj`~XejGI`!n=~)n_u)UH%R>6&t-~cwid!X6F*avxR*;5 zn$}*792G3IC=#@nCTxVRxtIH0r-U1GX5nbjR!H2H_p*}Ah1`J-OP z74&>eymu+)tJ|_(W68HfBv}wrjto{JgHmYzY{6N@kkzAz+Bw9Uhd@%pga9hS2l7<> zZ?s1vP3sJhMS@!m+mdxALBi^^Nhq1lYU2q$up0vqmVv2y@TCLQ?t44yr#48q@$#c1 zzA4J19@gQX)_WWTDQFa%R(N?7jJ@1m{w}*H0vNmX16`_@Q(8)B*7C}abWPB&p|!(B zUsvA*XHzmLd+;Smz>3Y=hhmvEGm0MaMw;+*kNJGvV^rF0B;A)q`GjRkL6uM+Z4M0; zXCEV>NS|trRnl!E&)pvSx((8YDzVUOBe5REP8pfi?hbJ3XkdOr19W4b;po`s@2u|F zv46-I9M%4p2tR>4E;u{dwJbx;dVMGh|!Hf&WxJk?V0dXzll9l`HoV7W2r%tpr0{Pmg$ihUirIC-uU2ukA7fkpD zuAegDH}JbLKRj>~H*PPt?G2G%S~Mstw`H+dXP>MBTh!`VFR;!J=@p3J7}N5@cpf;2 zrxrfpsYFZ__mY+Kq5e}gw>e>~)0(6oG4A$Tlkh1%E;&i8dGhOOF9l?m)Ftg;(XzL#+YvCaKeN9TMR5pAI zwwNyTI=m3n;@}PLPtSC>P%O%%=d&+bEATaIW3A@%Q`ilK34G3JKXc`CD8O!Oh|=b9 zp8TLGUpF{`eR_Q^p+GXnCzkOEF$TIrtaFnu#%uXx`tT>PdD|ustF;KPn1Yt=#*c$~ z4)Y)d^X>auY+&N0bnc2R*?BeTT-(sIGVljYpv~AJM~)FW8pvd*`<7Rl zg(X3d?ljme$Q&(m#t_cAWA>xaSvH5xl;&R>+s@xz;~vSlSBk*#z zB-L+Xo2&hk)_vM#EWVGe`C0JS@Ihy-;RprgCfk6*DxsjTM6g(B3q6e>brv+rP5$yx zSY?!_qv|vvY|0d|@D1{#opwjZrxH=$pA%BYG9HdkM(NT2)L}?zJ&ngh0mqn8V8%es zB*7b=<~Qqd@fh&soKR$CaeHQe@Tk4!VWk2n|2IdmW-67o8FWKoI;8-2}(lMY7KQ@wKh-1y0RRW2JfId1^gx@(=jJ@lzE1sD>US z_4?dhpxOyt#PNvcDSa?cy{<{aCMI~L9k||yI+?axOY@*oGB!CXQ|g~fG*s!&NU3?e z1D|(#e8JwEH#I1gfR~&$9DDu=m!4Bs!}XmE#Mm*&5pGLryP1I38KWq^f2PL2jqxRT zZsDEg;W|?Ibw3jl1Vw<`Rd;5O(f6KLg z+jJdcr|B*I52n-YJL6stR$&CPuipFfBn0qC&NTNmEV^;KdR+L;mteSK8y?t8!V>9c zv>BxUeE+g?_AM+#^1)CZA;_%hZe?Ta7KrVi4mD8oF0No3-zq2?pAa#Nu^E74ZS~axv4Y*p1?-UoqA6T3k2NFPa^U|PT$dQ~XDr%dtnM%i)MRm*)AZiB0eai|>q3K%q zDj};hLIe~6VGLup2uR5P`a<(5T)$fMwK!7Y*ak>2o zV4%@6>KL|XlG3WS6S6#Qw%n&ZI;GPn25tGsI{y(t@ER8{JUT?c)F^1F;1hQX?Ut`K zrpu*-`6*rIY*k*sVto%)2eb;t5)-Ez9M>smVHF!Ug&jXQJS>76Ye< z%@L6j+FZAUic{i6L6xK3$g>Cs+Kkf-%YybyQnqXZ4CJyzWAhL&?{0mdnVYWOlLD@` zr0tNubF|X1XF$w;o*a_0Cc11B!o4h<4+QIEJK#gvAuf=V&;@^Fi#T9IWOpzOj4I+; z^J?jGIXL4ovV=(6_fc*XDO;dE(U*{tL0kuYa@Jm)dw0V8@pbN8y#a%+5Jr$d1|UvL z!a?392o^nh(x^IKafNY4b8rDVqjhO^G@i5sQ01wEr?eXyx^4+uy^rX1-E5bPzxUeM zmg?qYWKzGWwyf0Xx#kk9iGJ5OW#sS)bxCW$I!^$TW$$OVCReBjacuS)e_g%I}HNas7IO~_XJEx>=m;sTyy3RA?40-8TUy5vF$?}ph;IGGEyJ+2Au2XzU=?DZP9ee(y!(IuMo zQmjnJ`abbu|B#;fJvq#j_<=qObE$46zm%0D8^1%MKjzhWB}v~T>OLCN;XZmoS3-kn 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 z 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

7pOy0 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�ua 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

ft2Zqd)MwmZ`%Pc@mwmZphG2yv;Y?ayB^gy6w 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Ⓢ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%0DssNi+B(zznB@PfA=j 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

    T=m&kY;r7*43q^WEy7}ZB~f|Q<+ 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

    xWqrM6J)P6|&_PjjSuPqa+{PEAfJ zPP9yl{Y-vfoH$I(oH|VuP4jTN_y(|^4Nc-pfT4&?;7ayNF`jDugVpBOyZqK zOnBd&EKF4!N<_h(L`yB`m`hxp@JU;p-TJUe$)HK6oASPAN&A^;N|;E(zA;L1oHn~H zNs_dZv|UK~M{Y=tMv}FEv464VM2?qMMP5WJL?p7EmL5d}Mc+bnv741;u4S%6LbpQ1 zLCmj3l*U4=LWe;8lRKpguL?n$tct9)uE0QMq!_Nrk`X|otCOp_t-(L}k!Yj)tolBS zs(Y%Ttf)RVqA0AnkO4mBtI$2bp$e-CJz1#vr(Qb5Ii@*@IRrW9IBYmhI59Z1H zFO1|XAmJzhK&Aiv{}rMslO0CWRTH{w0%ShK?vOTHJzEpqs<$v?cW^%oPPs>99|x% zibFr8FB2ec_K|^B^&0F}xK&g|7^5mIl72WXx^G@2W z?Yo!mo*kTy-9iZl1S$bY@Ua6ZA%O$R9Iy5gs82ozI_D$|-RX;lbx-XBv|yraAK|<+ z#;zNSoUszFi28AXE=_f=;9!B|zfk`Zwu6C(u?R)@qK=EcpD@=d%D{!qQQqWf(PxDSB8C_kavxNJPT1VPfp-^Q zV8(jgmtZiep2?I)ccnSYlUu;=XKLekk^}L^QaFP=Pe@G)Ren_ zIu@cADm67XE}z@tHuHJiGz+qI(^<$+4=~PKAlRuX*mCZc$(Ki#d=xbQX>y<88^+Za zBr=+fGdy@WrUXW779=t{CuiV$7*m3!8G=wx8?_)CJ;0YZHknQiYfSN^<#nf*?X^Vl zYd&?lu9vmZDfUNrsP#zYB#`x*_vS%Y3$(JDv~P6qAEbSIJBEHJBm&dI@zSf?`tx+=|^d3!eH(_^h$Cr3b&LD@{1zAJ!C859gW^hX8Td>}bC zl`$Jt3gCd#3+Mo+7vO-?FTeq3sZJDNc}!u7N+LN^a@Bt!s1ZADDnKW6Q?7QM1()Kd zNH0Tb$X=&0Rff*aCYw0z#QG!!r}e)g)A+lQGUR#yzc z=ma(o%(6gkMto_o&(A2E2UvLc7gmLobb_w9qBZ$+gS8wM0K^&2g_l+amuOTeEtw~N zCoByt2ASr404(M!!6`T@#1fF*qQFck{CvJ&Nhu&Htk`4_e9kBYC-ylg#Wf`>C2)z9 z{&|CGVw8b-Ts@R}c_AhzCmSaJlZkox-=nW?TuzhNct|cLv;vch?~O+a!{|ns*X*eX)^PVXXj!ad+NG0EE7fl*nb$gZp7|fB%E#a0DYiATj@gGb4tN zX?30?AlUWLgF|xzl;&ECT8lIvqd6W5avmS~9CL6pkQs>?iTrRp97KZi9L^ebi)|Hc z-GPOHgygy>3 ze~AfVTEn?v?^t2R^V9@*>vuPGlwf^yjGA;;3NH%$qibJ){;VLHA7CFs=|!|r=AAKd z)_ahVdB@htqp|XJvOVB>=uqawWNr<=vXakuP2L-nE=Eki14Lyp4DI)I*3^ugHomdH zVWbfw!hna!hTyb7d;wn|-Y7>(0;F4y&B#wwB|r-Sq6sf>5)IRC#aob>kPI?flLR4z zl(8J$dx6w#32lJxDq)sUFeYpmfYdm~NYi?#p`s;nBm)YNj>e9&hExKRN#)rj+|zww zD+DybKmJHIHoS*4%q%z>Kg#k<{yG!j3hq0M*aK0?_Zbts2arxkG2&rV)A+mIGfwLZlz*h?-eS(GZYy zK*>!-&ygvxEESF7x+KH|qz?dApI1K+k&<+UU^@`39#;6##4ZfDu4Z1OV<0D4t~*sViv!LjW`Yd7kHap67W!W0++e zV;H~uGE55u06y!$0|SwQ<-nxUga9RrMYLnZL^bOJtynbHB!DG^BXJ}SE@D_96$v&F zG~B4MnL!cRxD3cKvU*4#0t-w)gp8;}l8xzv0t!S!!b3sSG)ghVwkn z^E}VcKa@4ffld+)vX-h1!8_uhN&z4zXG z@4ffld+)vXfc~fu5Z~|(A_yQT2tk5D7_>qNAp&AaAS4niGC|T*bFq8`D%oKd=yy7^ zb1PVjMxP#iTJ@|UpX3*uG_204XUnmeKZ>QS^yP=*WbyxJ&VKn=9;d>=0o327x40a| zhB-|K3mfK$K|VduxHJy`Cu-~)K!)y9e7g)N2}(8OCzW9iCMNP2dGQ|5g=6Gk^=e1l zE&#efxDGr(rq&!VFYk`Jr9HnQ+$f4#kJ0TTys~XM{?#ZfX<(BzXZJqnNErs6J;ilYbSBCYUpxZp?>*c&@N)hbCMTp^a` zSQ-P#QotfsLOn~ZO9LgfXd!JZRii5qw)9j09f~lmr&x4sVaum+bXCIgo|d6A3}f?@ zPo06}($r%eGU+unuFg&Nn3`9IC8;-6&R?LWHu=j0F+Z^`VrZ_uNw~(6V_;V!*%7$2 zBb!0SM|S3ql%Kq4oTvjrHU`BggY)9mW21#gc*Gex%Um}=kZN0YV4ymwPO6jY7F|(Y zY}eIMzH}{3xYwI=pY4)Y#Me>u$m-O}W^ZG^j3L5Uf zm!dWa!-?J3Y~_mTA|ej;FzO2D<+F-#XPL16_#2(y+QUAN0HG}G^(e; z1XH7^piFgEMNLg}_0d#H2LOzR+y|G}susdSZLCbyY-zLU&GzR`AOKJ7N`GVLzSoHVuPm&uf%-@V^AtP?xMI{hK`!RKL_UJdK?Z&(CB zhlTn(Y}6kn@!G=J>Q6iNiWrkN5v<(LJC=~t@U5_IjSc*%=K`JM4)u|A7^$rqI^qJP z;}W$IhAwD{LybBlwK`hj&<5>sC|4`j9$O9Vv1PVv%N1y$t+RD8Fj$FPnPO$~C5e?g zR`#s~vl7wE1uq{Qf&Hj)DBA~tGfY|o!Z4VoFpQ%p3S*ct1Q|kzA%qZ_5g8E?2_lUi z7%-U)G~WWF89{8ed`UJHJK*)R3s(_~@EKB)`)iEU1s`;7EJ!=<3`nurQ;(EorCcheJm~yz z@sY6F|I?jg5_Fi63Kjbo&K^4YiS~TP>!W!QVWC3;`Te@dUguI}??5yTIkyxr;{zqV z0_4*o2x<2|7DqF}9K;eN;e@OSB*{NKM*O4y;`{n~=wH}ImpJT?i{Wu#$+%M+J@Z>8 zOz0y`OR&N0exXpIIo z-^_rjUNC1IB=-(}E*+G>1)7KW5qJ1Yw{vN+M)OeaO0vBEm zN3I=ihlHxHJSH_oEzEGj`dSRaK-=9U7CC||{B1W_W)2fk3>_0@9F>SX)on}T`5%IE zj@b$}SKhS39d06yI|izsQ~tp9V5is`zn{13dEpDo~kI zF%S@F&jC;a7vQNahzOjmw*_#G6}j?%x;M%xzNfiHpbw7(tYQOck!xt{OOAmCv`G;K zHU%*StD$0EZePA$x&gFklz^#xnV{Ix*!e2?@&SW?B?ibr0~DQ%%8o6JjU&>yD zUX@{;VXrByHD<$d!Ds{Y)>sCM4HNlFA+{IhK>!EQ!!R;2(J&bT21Ref62WS~n84n^ z_P|z*#l{uMnaLi~}7;Qi(V>%R0?FZJ!dM4WhoB&iy0S zf28A-6BPrhQCgweEGjN)u38Eza;nT{c})#bGfVYJjr%PT2IQsOt!c8gS4Am2V9n9; zf`V=v`VUBHW%@A5ABL4efmV1c4F$N?9IY7Ks$Q|)OuV9a6@2C3*5DP*!VXf z|7QJdeE*Hgzj>hrqJ7gw((cyY)Rxs2*0S2B*h<;%*?!t8-wNH*{S4y9;93I7;4F=tTHFZoOAJ7{1SoU$S4g@3s8v;eVlj z0e=&J9e*)@<$eK!&);AGa7fULFUI+yGyt0-J$|4y;2ZxZ>HlnYzj&0kvlTHU6Cnw)u=kA>G&YHDq-K?57b5#vIFV{z2;aAb4|0nwM z2jT0N_J`n|V(I;Ob+DM=oLBk>5Lqz(%V?}$L>etHLtxIZHq!9Oa0_pc8SqA*%V;M zf#H2onIAD7F&xFwg=B}?hR_AuK2A>gB~QjRYM-!42$*nT3Sm2#*HZk!)TnB0d zFoC=bO&Ht7PQnf( zKMwCnN5T%Fuc2e&=HkZUwvZNgCEoKtn4ne?$Jx z<_UVO*~za}ovnCUa=y_2fzJYBDp^x`f?x!rY_d|1h@)*#R_(TO`Z&2^7VPz-IaPbK zT6jgmCX0Q>+iJU=K)5D*C>^ zc+P@~10#cl0#SSj5Y_pYQ7WC6+gFQhw{5ofUn=$9^hot9;EyTA5P)BM?>kR8KO-xY4W*Bss^b!jPAw>037I0i^ zmYad~^X>{`wr@IPE%XXT8)JdY85(UIB`ZSLs`MImTGu+)dUl~3KWz$E>Qft5Lax{B z4EIT5J&2?7lf-ejsP^{stMzRg!uv6o<0HgL8N#;++IiXtu!0#fBgwY`?IG=n^k?)s zZq?^=^Ry7{Ca7_ZTBu_x(2EvfG^JaPXC@6yW{&iK!={KOK-c@~_Gmcn$}0$duaxEb zR)XeD{HstK)(}{pDl@;W@M5#bM4t_hd|tE-HG@y;N$(R)TpaPV@3LM8*G^Pf#E#YD zSqH_@>>0r3Y6!je-Ez)OdLHKXl5@*8mrkOZt+oKu<#-IxCDs|x`A6|3_gBd_Ho;`; z@aXRHuD>M3d1K+)S@Q)f6;GAJOKE-3*_7`#aoB>8b-hG4BkBdwC2Spu6@nEX4Vty= zgt3%@!s4ELXBmEwyTYrYx}2`PdZmkc*SKdWd;ThnI&ydq9~Ftme1tn{xTb>vj+VIY%umqDi@BIbBx74w7> z7<`!o0aKLz%Boo1-(g*2GMz7G7aLe?-Q7Rbrxz+6)Q(WsZd1r6x+WGhejvRrZJ-Uc zgh7R(G@#<3K%#!EwyxBna;KzG{9M8HyHQo4zN?`RxqgFWxUq<>W?(Z>1-A%tG`aM6 zOieT@mD&^zzp{Wj+X|oNSBTZIHKeWCz{IZ-aM?K7JcRYsZP(zaw2BCrAv%u=X$}E> zgEJ#983v>?^t(A@`feVMmD4$8-D9Q>FM5Mu==A=0&+)%^vP9^=A%G&-`q)PNYW$mE zMzw{%op8FAr?KH7aV_#Sd@Y7F;=0c#qVJ;Nzzu3`+z?q>l>!X7jaBPukC)h+9R358&EfJNiwrk*Va%>NL6nSsS#C^voKALHV zHpey})xn_His;Bf*Yu;NELl%*c^_*5&_Mz|L&)@zqrhXU8a#{dhhYd(+X!_YfI})? zULjCi9u?xvZ%8(nd`al~#bjcC6fLQ}>8Gfuo~yB?_~|dIPh6~?Q6qGQSLMLu;Fcvs z9v>QUN~s^%(W%@|FV zjoNEN)LQHj?FVEK!6nn4a?m6y~#0J06EzELd;KRonLpd27VPY zjQc5E9L$A6E3NQl%}P1OojD0+s-@ceeU&Q}8k$Y&Z|b}Ts(3;r$W14kL7?_fwTq|2 zak5+Qr!%TBw`!cZ6XPF86h^a1X0PwX~@Ee}AWF2Gcip0uK#aTDGzF}Re zI}iYu9oqqlfie$>0Zx&YC+q^K0Ted^0C$%-@@qHrZg_C8t0u;)I|z*I<$}9P0LPOU z#t6jt<;aC~kX8_C&>nU;MtjsdyyjIk-B>*wM{r|jqbjTEpwKXZVOzxh=-iS>UWmxx zF|-&`7orzRZ@hx-8uNhsgX)1!m#IoWm3Q!2^Pu1!G#^>O6IVZv!betN3zn1XAIVre zf!d;<$`P}AYG-(^EbHgoo@%#LRNO)=KoBA+ zMd?I{yi_u{aZDeF#InR{W`0k3r zU;ReZk2D}=bO22hMdB+OMWO1z`kHJU=8fRO1$(imiEiXc5+xdKQ*nb0{Q(0Khmzm; zhJNWf+XK-S;YgWOQB`{~F56?$ihbfZpT1_LA5x};AUtEu5si>tkr$70BtVKx;Y>1~ z%bd=iv_7i%BD&r`+N4tO+oVHq(se>mvHR4J(8)Afwdm>{vyq|LKutlbLAOBh!Cb+n zz#zcI;M9as)E~*iRmCy;@TbsiS7;a=={2z6$?G_5(l*&2Vc*14P3*m=x zFhQz9RV-=^eXa1-u8Kn_c07NhK;nx?bvoT2_u^v{XOFWu z{rk>G08&a{3ZTG$a|fZBPi_&9XG$B!W=~9+YfS4R>$82sJs};$UZsT;@1|I@8;P{4^ z;pq`R1Kq)5H8BUAs^F1dv|>gt?S6|k3m+QqLGK~$DcsVvVRs?egMRLl?g3*J=tQz% z1S)et^L_lb0L=X7fJ-1wxOGA$aU{H~r8)n2+?uM1KVc^Ipq8J{uD!X&a zhYE)}`ED`2aUMc17QGoYKk_oaHa`gSzlyq=AN=z_XIH)+S8A6xyjtpc+gVAnynTZ3 zBe?eP7hFPc1$6HS%s)G)Rd<+$RAOjaY5g>*$jO_*6 zHGLFWftzagV;>jP@HP|P!t7qqUVxW;d}Y7P@kH*V_9X6P>6D06?zDE|dr=B_c*h_1 z?9)7RG|%fp500@}u1IO^8ADd>UY**_<44+k3aePo9%6(K+Yh7VJ_w@RU(UwG=1lJMu3!QmEliD zy?aT`Ct+t*p_YHZx8;MbL<@e<=E2Kht(6QbAk1$%7jrFDr3O${SOA1v(UCpXN0qFS z)RdxI?ji3J`l2gIDmG?7`Tz zU%D>5?s=LV;hIz_kfKcXe5(pinmxvN>xfzPxYv)({V#v{;Gye%>A^E zRGd_TRQ6YKXv>&aFn{9E*ly#*XQ78bd;U~39&X1fyT=6PDJuI;=kWr8O`bT#nsgIn)iZ{{Gak1zb8(q!lrbT zo(*0H33`jrf<3MgV~r85?4cTZ@YElLKMi@f{U_IDX1qVp(%hOyro2YTSGgqP?WL$I zs3UHw&n@LUpeR5Nw~2l*x-P4x>euKK7);|0;*H?FAe_fs$j7RI0`ifQUs`-6_dNT~ z2bGs9@{=+aQ%s5ZU7>}9BAR0pq&xJx9A^SxQI7vqgPRQm4JK(O_(gnnAjdnEh+N1IW9ZQSGPwK^@!)fUUrH&` zFEN>en{#JFvMiURn6q3wSO8npBfOP5e1udfPZ6s;eg<>-E&?_rZGoc}Kxai!{;0DV zx78Ajl6qW`T?cO0*-)twP+g zGm|pfWy|v0ac&r-2KNVP`9@y13rk9oyDJwXwCSB$1)jan*B`C!rvh zQ$jhh<&q2y=gQ^0=Y(_Zi_VJ`h;fToFsB(II>v@B!2^(Bob5?qd~evF(mEBuiZ_Gb z6b82R2jr;>ZtR2aqEO|VI$TOH7aK#RNjx0f0%kZB0cPlwKXA6OQ*gKOf+HEkAweY20IoD_fACd z8T!a8A?cY8*T?Hr0xsjz~)x=uWaIQP(P6n-y!$q(BCB|;iLkWen!Yh zh;lKaeg}WBq*;guMi4fj(Ws1w#Gn|&U=SE&VBmov6FOpO(7q56J|H9z)QE`+bF7F9 zcF7K$7a-~GF}vSc6h>#JPMfU7D12zrgqtXZh?DWpOL3bWXwHMo3J*+2LCMDwr$*}; z#x<)Zrg%3!j!f+yTfet-?U|{f`OVyZU?c17tn0k2R6^Y8%22ehP5$b%8oiBvm@JlV z5!DLACi^)UB1P%<`*-c)y3~#&#uPM{v4Adurp!S5jm1y!h{+CnnBvgE0W~gsE&xly zO+hI3{;Qx58;)%9h4h6;*3v12C&tud#p)wwMIcQv%R)N-Z*Rx74RziAiQ6X}%drD! z2{$U}NRsJ?>XPEMhGxcEM(r=69ex#+Glid<+S7D4ML5gY7$;@*BnCcXfZJgqLz`(B_qMN&>J!yo}yAwW{-4pc3PM zvJoFxe0z(JZe3L=LSS{Bpn2Fq;D#eiBG+!7E* zdIW}bpTZwEJZ6%C)SHA-TcbAX7`ih`+EFHk4WE*$iXk*(s;CTYP&I+K{`Ab_GtU|q zmZHjHO*gh3usANAq4!Fsf!w#Sfzs<6(GO%0p3F z9I)?BX^%otaVwCEm1UX~Pq{)+3JF`AlxW(~Q6h6`-?$^T2A?6B?%5JPw)->blC;zo zhS6m#@5fC=nDeAQ8}D3Sq|x487u{H;`;$qIi!f7=%KeB(*>wPC~e$OPO0{2 zF~+L)Eh~RG7WKQz@O@Q(l)xP6--$ON?2*iW4NhXfjYp&2S?~h;io+NY^)98i>DyYN zYLM`h*%TpN7cG-cZS@%HQ5I*ynbsCtVVc`00o|g8`1D{NRPKaXPXRL8CMSce6p|&$ z>aA0ZuCbygeIa7M){CS|rE+rGN>NE>% z3C&;mCz6B`a3?N;oTxU=~phisP0jv864nfCZcHnSC z&eiD;CLkhd#+q96?%MVMkvdnENu3QHew{dEDx$oNaCK6Sg*;Ay-??{p|D9{hKb4iIImy1LlmUTEC^SWEk4Rg|>&)D#0p= z!O4!$eig<*Gz@#yR_co?49zXKPUBdp6P!RSS*Ig56=I0$h~c=ohBB1oloe%wZR&L* zA#L}01I0Mc*oCWq5qB+?Fg*K6084Sofn>%BGUohjOw^OpzD+0HJ^NXRNk!Xe{N?+U zIROsaIRyF8R@h6)qP(bvHt_Ar(d#@|@nMtnk2>b?{56j#4Zl^z<=F9eoNFgeM0Ue_ z={rJ7eAumeOH3whpjzMGl|K?1yt81rEv(EX$u%e?%Ug0r^}S0ar$dPpSJ zl@O-(P&yTdMuan&Q2g9;5tiWBo%A0RkF9(t1WiV9cibXCRPvCqv_mlJur;}1n&}@^ z8q|W2!d;~fy~p&f$QN8dUUbB1DV^HHcqnx+uqgDZ0{WlQ5NxXoVAcMtoNe6Lpu966 z-h0Bl{8j=JYrdA_X#Jt&?>8`5wkUCyFRnlYQD;Jxfq}=%h(zkk5+CK~H zY`f7+!CZeYVQRLkYX%C=xZ{NRl8tHJyr;Ew7H&0!KXdbA4!^n9I#y&$R*fIt{6qpo z0++Qcm%Fdp+EZ8a*n7P0wSX6oOL0CG6PpFez_T|xWN%znO>{!cg%cW#xDzEnb0gSz z3)FwRxC1JW>jveEo{^62u2ElRBCK^0G0hA|Qm^8*`y3Kf2LbXf)F4X}cKipYnj!7a zmAUa_El0m@RD97$O!luPS4=G2{eP@R)I?sL4l}^JRub#Tt6$M34DDI3hM;LSz2Vay z`?K*Q^jH5pxI6HLN~HoU(8QfqZ`!c^dMfZ3hKPou`c_AhC2b_ZJ8!z^@PoIzQ3pl{ zSO0XI1;Gf4yW|^UUFIXOL`+KZ4>L>iEtu}8DNx7&{N5|IDBr; zTx`o-H>=}UX(t={#Gjkh@Hm^`nw{*H2+Uu4(t7WOPx($QyD7Up9Rpi8MSkw2nlDZ$ zz^+TQo`Mr?_enNBKdSue{ym&*iv=U%+AfnRAiDhkAI28+i)EnzZ&zh(1}w`V;o@({ z#(b%NBpmx-09y3_fz$=209y!ft7BP5`(P zJt;9Qs%D&q&hb>U9v>@o*j=jz?&g)K( zwU#wPH9x9gt74X2m+zN$mU_N*Y{$67xb(hwx)@&xsOYi1Sy*4tC}%AtDpgxhT=3Nb zzS`icJZJ(zu+#N&`*CbDDELa(r?wjJCc9 zWr8!+GKA9Yk`0qJlBJVZQy#TZQ=S#;lfx6al9m!e5?m9Ak~lTN67w{Q;$LD>6FTFy z)bHcW)m~%IVoz1mWK84uVv1w9qJh$mvE&?{idWn~HN_EbVCvK7gS;UymJ7&f2FwVf zFarjJS%qnaiG~Sr0&RW*E5pA+{WyR|A;clLLC8TW!DzwVz(Qaq5HBc&mn7Iya50Dx zm>X2W4AlJzR0`k^kPIXZ`~q$Qi-6xA;y^}Vw%;3XW`L6>5K~k{)Z?npuhb{oC(b9t zr_Gc&x~CHA`>B&V(r=L4!EgRok&pf_m0tutG~NPSiodYD#D1N4QF-rruDNqk11Ar+ zT_;>&D1e0Sm*l{6a^Q`d9g7=FBN;G-3>ZZQj3fi95;77VaGtsbyEwThIPp5ov1>ZN zI=b!%Zt z0~@h{IoQBFY#=&X3l{JnY9bae0Sg#|1)N10L?KRqNpPYuqWPW=F&i+;Gl@2VjJ=A{ ziV=;$MFo@NwUHav5k#NHA8Q7OwYzrJAiu5p0u^hN6UGg3^P+ zk-~x;nWB}vk({O+zwCt!nd}UJT3(+T$Sh+<%JCi`)s~F}+j8<7M5eXnhtxk};Gf@l zzrQ5*iGYYr&CS9@K*Hu&aZ5s=WK*438Ub+Thl23WM`nH)-Y^~!o~+WqQu%u`UT$83 zQg<$%zsB4=+)$j190Y&FIEgrg*`%%=+2z<%S?F2ok^f$zu$?l~B8M>LGkqWL!ka~f zDFM-zafQ(*x1ZrR0~%u%Lp!~z7KfI~UAtzYroJYH2CfF2h5`+9a^_lqE@am1%uMuj z_SE%cSpx2P1Zf-@u(}I{Xb;I?<4E)Pa%T}wg)>ht0Vdyds`pHZ%a=qSRL%9z67-N< z)olTt9o5HK-H&=&{q9hmReRNgkq!!s<&I5Tl6z8+3lhBJXb98nLbwO^_CG*cLy|>hA{c5tdc&8gEiJ;?*%Sk^`a85knCKas+p_bZh! zs+I)A7OZo>ItuoxdWiHez#`v};i1N<8A+3JKqs6nQ0v5(FXJ3WD=o4!_dKUDffn^bzdqu88Z7^4@yHIB$uLi?sE8 zy+AqRk`<71Lgs_DigEnpu#FG($Se}b zuf?7BWe$wqm))`dyXpD%3nc)^h6~b+i$94uF*Wuv+BC9u*mo#33MoG0(g3PBI~;{X zDCB0s#i!)&0SzjR6f!yr2{{um=I7>`69tNUs7=6U<)$YbB^)FbfgwE|0Ck4`>!Gi~l@w7AaWr%RTZPU@Ar5{}2Er7ek(SAO;CS@QuxhB*d3u27|1Kh{MB-l7Ntk zc#(?nC$WN3gdmBRih?Y-4THH4>kISLeF+%k5swE*PXs)T2Y^ll3}KaGEsY1$bpE52!il}aDX_2Sb%tLnQn2NaGn@A{G9kS`|AFz z_{{w9{$$$u@3%zG`!EX}MUE84I+9B6ra9+<#4Et0Y%>=${XdMka7 zdtU7;%1q1zX4+(GXG&%2n=@r`n^WZ?m+YBw&B~<+q%frftW+~e<=WyWs1Oy1eG_B= zA<{p<*4hJP-&1<$z*6IUky~7Mp$~1I2H~fUC3uM`i#G%R%%2PED+KNo6;Txd3iA^*KN1*8>uyrY|=;%k*x<~0&2LV*!X^N78&4-$lHY>rk^Ds|FRlCYzG13X;f|qSL$d#B85yZujf3NB+ z)u^;e`3Hj77aM&O*3Fmsi6xXL`e~qqCBfx8dg}l`8iSRTkKU;w|RdvKSe(Sx& zkjvxGfFwi)L~=N=OF|$B{J?5OyjBeT7_1F}1RfoP4VNSZJq0QSkk*kkm5-DRntY#h zoV1$6eLI=rn;Dnq^-aSE7OEBE+`j&yD!lASs7%OAi2Qaqu}+{##+qh`m&m5o4;l$z zOSa9K)O6p141#U@hA#NUSR&Kg(T)-x z$`+y)>=vgs4~{#1bA2kNVx}D5Q=qt}@TN27hJ7l1Y9=dY0W0Om*nSDWzW%6C!3Q!y zz(Z6pr4|8*N03Q~#Ds#ygy4zEh)5|^`PZtYkHbA&ia8#hGS zyM!8QN&?WEiFF=F8#Q#vKsE7!(n`e7r*C5en3oY~2=r|3B)kqkKr#>^{6XM4)lKGx zp;%aeOoq;J3?RW|rj?sF1iOW@(^e?Jkql6uN6VipAqnws1_fHwpp6U9e7Bf`1`~pm zJ`RgIo=t}^jWYv%_3urUaL$R z@b4$DG5!qKgsU@P@Rlf6sJNm#Us9${QWi+IBqWS&fBa}~;^jGlei7h{>l$`b!~Y6h z-ls#cF;K3uQLpmBz!8mB{u$3$4%Z;=kWe92$-}M?q3S8F-d|#lj#Hwz6(t`}K@;IL zlwN@EUM@319M&Q1qOCrbpbG4)XD5Y|+|T@(Huu$G&i(F|BH9cq6pdXAGb0FVRh^_##|k$YQ?_UXSdgX{U7;-pipCI^m8eQsWb zIM&Ir#__kVgfg$xX#6)5_v(Saj-G#hc)UV&{?RY);+i0qh`3uvkpoT;KxB= zK7jzV^`Fq3f}gia#gK1o|9yTaiz!6k<+og31*;Pb`T)R4pikBphSmw%ctMUS<|4r9 zwZNyTReOWInq$7vf$q(gBeUDg+l{hgY{`fQ)k03&6S-S7SJ?gPbh44q7Fy>oeW^#qPBZ^~joLXFSf+rDPA0!{pK+UNzK;WxO zELRGDfRhD;9&}Bx=elK{SYgxWfuOeRvcZc<2kDcDOkmSmJz>irofb4&|JCXDf=vYh9-@?w z42zPNfl3FD^!*MUn=IKwME~)X)n5SZBGx*T7oh;>K{5o0R4UjDezZ46!?qXN0qZG6 z`=xTX<@Y{w6Vf4=pBKcGBT5b$ho$smen(035tMY|UoU9vXr_+xB9z$n=3_)$0kilt zI7o`M9h#K^e>qp!nbum*u0w$yC5RZ~S-LIP8Z{RW4=*ntzp%K3%zq&(D=Q}_FR%O^ zsv4SFI(qs)4NWbqtgNi9t!*8gTzvh3z`(%3;Lz~M=;-K}xcJ1Rl(h7WyyCk0mhPV3 z{-NRFkPzRiDY;cf9-OaIgI+se0A|EKl0jknFWt+&0mgSXTFtMj+Z zx9hh*Z+CA`Z_jTpZ}0!p$J^(d6v#Un_&2o!M~o<*xUbl8p9JL9R8e zt*)J`!>;G6=c@0jpR1p$CuK!Q^-Uu>!Ew1 zH>3Aq-coY$YbjY8NZEt~xuT`g+VZf=Y-=1FAzFhw^E-pPn|rASq{g-;<7fI7tCy(0 za~OTgS}RK{Q)}>>$eZY!LYsP*z?0~a-I6C$9?^@juyKWRFY(;+A`2u7m@0xO*(#MQ9Vsy>`zVhoKPZE! zAgc-)m>Nj^R5DIC)-y%6=(8ttP5!m?tIMZ4U@VF&dMXAaE;$Z6K0lr+0VL5eeJ|rZ zLoQ1$XDgR4KcK+0u)c7w(6xxFxVjjm%(R@WLaTzT5~8ZUimiI7TC1kMROg~1U!;ZUn3;Czk4T6^@dckX9ib1a$@=LkI&vK8+?(I=%UgCq;Q8-T!E~N#}TAW$&yq?jHM`CiDiPT=_G_Y zMZs5(7NXAwguxURBOBiH{EG6Q*~mJm#(r*cYjhnkKh%K#lZ$`lahcm`(+r-^Z!)m; zIZ<{kSExm&gY&0(e_J?t?<8Fnw5eiiNAB96yDLPf=+iwXyYcSqcZa{*i7dI% zqm+)+_S;?itY(`tV@^h_1+__0J-eb+!`s`BbHWNATu=@r$2aM*O_Pezhh`6phu$~d zxAAEFX^EQmiYD0U3Ds1l(M{=;v6Is=N1~*M4TbgTa*TLcS<|BUlUY{r{~>)3NurG= zmPVtZ%{jCJMPU~}5F&#my6jU%(SN{4h+ql&`?d4ty(Gx+1(tHJYjNGoR)}f`fj-jy ziKiprZ6`pW#)g> z)SWY*d&l18l=TFxW{K1N=jED@X|+N?DsJ^wZCobe;HL z|4j__I%jrWh5rbKG6@1m4S}i9m=6Q6w<6KN)`LSc^XfP^pb@`AVbx9l|F?X1pZ=c} zqx51>vS0UfO>=BRvuJ~R`JKw6UP(aUG;nrlh;|>Eza+TfciB2s(q0m?v2&u13lVD<0Iy@((R5 ztqH9)##p=PrjE;RqAHwm&2>KsY`xyI@oo^4=%zP_OQ`Bo+M8x7acZZ&DKBgCBM4&P z$E;UMHl~`;FcLM0kvr6vNW5LOW4vo%09(}G_0a`74cCdPA3Z>XUdz{36>!BX!~yPB zk)T%q9$QA7PKkDh!`Uy-wz0ne%73eOQ2h-!GIc!4kz_Gi`z%?_kdUF5gyaiBChIhC zQBoNyMV6+sy1J>R$#4y_F3c_M`-Qfw(PU4}mT+&$n?nNV8(qx>8TfQpoip~=s)ePO zh}~Y8Dl5tz+R_tv!TMu(VcRU6ul7V~uqu96-YqRE4p@;iAz-yBOA9XhS96~>YKY?x z^!4W9M(Rq*_ks{-2Vv$Krz^O6ITYs5F6Fcy8JbaJCp5?SGzckZ4tODDn%(FclOQZG(Do_ zXjyn%Jt>Atht$}X1!-b7+ln-X0KSc-E<{cUjB&6ys54!^F7BRG}nSmiQr2Bu< zPA6Z6c82?Z>&y2GGuFW=@Xf%i)Z$>}_GIr%w{-H9E{_c_DsnGk7M3FzS)7hc6=u*9 zxAp!=h_gIIgFCJ`ERbY@=*TRV43BW3vR-dkPd-45xb3zv5s&mSy&tOXtu0!p%2R*wJa`23uY6;y$1ui<1D~W#TaL3F1L7!4Ftlnl}bX zIi?o6mTU^PKkqjwlTmu~0t{BrguZEN$8#Jp;p->sut{}T*Ja02bIaI=JUq8v_A2BiVTYpN*%iHB7P++^#LFKTrzU8UVd;WpCS z-46e)xR#0Rx4qCu+8ou!m-QfLkXwh;w~~rGUt(u-%rKkbv40DpNK-Q6HKQy3Z4$CcgrpkNUXc$T|JUbny?~DjUYcKxT{-1INMBL9?$BTf|v}@+%Mx z>1kL`8r?0|=Sxm6wx@l0nfODv$)fo47q-%>2fudUfA*#r`cpaw->x9yL7P_Aqq)w* z#Ftw^5}vGShMmd1j8Uq8q>04_^#VlVi|%f=oi{saMGrLwqnm#x=J)}+Ql4iUTeTWd zenLYiwOonQ%hE8VLLxGN_In1$T`EGz3&XMVH5lr9l(<#uMCd1}?)(%>xwM2y;(hxR zTP)(9LB&0V+YR=Iefnx}>C*0+q^&A2iwX~(;-xcMc*r@Ml(9)N50-eci($fH(S4qS z-)|#>%)O*oeEUM)Ph~CQwl9kp0^1}yvYz_-^bH-c^lx^aPCh~mW+*QzPR@}|Dz0~0 zGzSZPgtm137TtdMGxS$PeB#FC!xY zw5hjj7OtC=w|;eQkh2E(2O)#}rLD?|5PP%|0Di$Ra;>jU;>2GB>5!8qu^Y$GD#h`s zqw&bW6QMNVNUsDCwdX7Qx?Ge-ogWpn(`@*M`53zDse1~rQfpc^l6->Zf5qKbxGLLL z<>#Uo8Y5CFkGS*tGs8uw(BxBL{*186=<_YZoBaAZ{Fyo-$50EgW~(&WhI^=l%_>e4$@Ar^tW?7&i# zdw9Rq$5IGBujX{T+vh~7w^)&M(JQpe9Ff@Hd|jUm(i=N=c2dE)tuS-Iguub(_B7()62VzcQkZEaBAH>-Oukdm)Gfcq&c?|>QAq5( z!roW>o6v1jG4r(+d$u(1uFFQxyfSl!Fw7oT?q*~sC^LC2FbA@t(o;1vqEmf@o=p7Q zf`1=ss>y|j4BGs^yn9EMSFyI(yjv`h_yp8nPl82KYcJ&Oe@3`Yl_x#G)2V7bVuuqL zxmgu0vlP~lLg)n7wSvj6Y`z%DA4Pekj1|p`)}b503S<0e!Q=6&)1?_7(!u=OCHOft z&GMeIo$fRgj;o6#(^i@#maI^2;MK3kUyGFVZ134vw66j72zgn)1!NwMPRr#S~Hy`;j^sGN~$ z+jR80vb_AgDSXEmpxs1#eSCJB2``(UulSS45{+V%%iP;6820^IOB*%uKf00_{zNXDb3B~ea zCdT#bwn9P;%6yllQ|xo4zlM_qBY!i!M+T`uc>K1UE{jHrP|u`X6j_rCA6Gg3w>kW; z7B?FS@{7=7Vxq`NH<^Xv6U@jKvnfL_bqlKpu9@>RxN{!DzhaE(B<`GlkrPJrRp5p; zr4kgmKJbM8pyag+QCDOB9Mthm%Mh~e#{!Bd#kFr}+LZmThZNu3CU=l=$Y1y>be~ra zOO@jYBWI)8Ct&C@%-Ip31}mW(v}|>>%f-!iKH-Dwltq@Pv=qZOjveRs8F4l9mdW9` zgn}A9o#*$Ui=%!_-;>cEPINcgzIf$CZNt%g&Te=yka)&$R6cz2s!7LooKtJD$)swy z9_D;ahW4rwHq^@{$%QufXY;^>1eMY<2+89>6&$XE(Z+8$YH5V9o$#My%lo-cQRTSB zUL&3tnl+*-NV&pvFWRx|@Q_?>oZ~)#U_r4T$oqULL5TmMzj_{Ly=+)Z*RZ zn_9(69}ff;w2J;9M3w9_S9)rF7Feh@Q-a{ferU}tNAFLm-@3l3&IJ%HXJyVxuP}0-NAT5*9Y85r;nrMU; zn=V%3=plPU2TF5^G0{PvgDWjgn09_~2@LGWV2q)-q<0{}lz*ll)8)G%-Gc$@xo~K(% z9or7KS8x74Nwrpq|Lveu&C@o9U;6d;%G9F44+=zqfK(PW+FRQff%#3X)y7meP%+MZ zo*h7OHs|VH@C9xX#ACPZHE>(dQGeOn7v5Ie#s0~3CRMTBDnO*5SAz8>h)j^by0T3P zkF^rsd9rvN;fc0AeNe|E|G{d9$C&6*<(fgbiE7hI-eI?6DqG=SYWGbpu}@*RN3gj< z#t>X=aU%EnEt~ej?6)@nCX0JK=wn``x86ABV5j=CFqKno5^I^0yk~88PnZT^?c%H$ zwbMdvaGvPUVe$^kCcQ9D8r&23Q4Q!w=ggN@o)thUxQN0$j3$iSZ&YtRU z8f?pCgWE7hjug!@m5K7eKAUg{QNMSCxyCb8DMHXi7%CJw)$ zBGsXHCGUb5(g$fa`?Mc{d?q^EIhHtK@Aaf1BJzO*KkFvX9U%fe%ZuWtDv7w@r94G? z`vwDABgAy#oMGG|eV)GlF+1EvIBmdX?{s;I;_s~SR7NO1Gx&K96V`DWb%T&@6vXcr zP}l{kZ7Y@oW)C|NQYG!tbJ?zTK1N`SYUoj%$ql?7J99gmcyps&+m| zJ74!0`eQ zX20OuH@u-TB*)ks2&3fs^8l9(;Bzo=AiX!U|0fS-n(=o3a8CTd(t7`WZ*p%q7p90| zWN*J@r66g?Yv*g1D3q9Xr+n9K*E0u(!E1L<>x5o&cW-;AYNtFKrs}M8XE($EXtE`- zMY{#QwZG}KotOpFN0+p{!?3MbqNKaIx>dDRlL>=PTer0x`_Z=TvZ1{(wVAbC?)y0sl@7fZW*JTpe63TXkJESruI+UQJwMS=&j0 znWfxVU8`D7TJ~H1xqP_7yIi>vk_;n830Pg#UE*EBT1sCwTeeJsX(6{-UXikwTwYmN z%3CT+gz+N>EH4Kwm@mjKkS>5OcrU6az(|q-mX>Je;pYF$sV!X2*UiVp!I+Z(78WdZ z5_xCwX1`|q=JH};Fo^T#=BsA#=k8~(V_-~(Zf2*=$LE@+Gp5yJU|fj+bF9wa8>W%? zOLPh))m9r^@8->HVJ^{p$UbGWB?MKPYyqJ+!yTnQ{G-t9f8lvEIl%+qL79LFCjh*U zhv6NKhfQ@vTN6fEtBy5BStpxVb8wI98aJ~CV*~0&&W)_u0oVX`KrrtJ8vqLs6h9mq zW~~@%T{L)SV9f%U96)6TWa?Wp1DF8KeMW)S_&{s>o6Y0Rrq=uxFhA@6 zL)JM)SJFLgKR!9J?l=?Mniwaxt%-4B+qP}np4hfA6FZq$Gr^Pp`}JK_yLR;LK{qDu-&RYJ!Tuith4B2e1WnGgifERkeM8S$a8n*;eV9 z9oP)A`J$An0>6B(+_kLZtBP$>LQpdBMW+w~e}2hOmm`msG?hF*O_!b)L6qqVg0V_; zih)|$a$Wr*0Yn)e<+h7jX z2fn`L&KJBC=KjuK%nL9Bzog~AQ0H0ZOXWY$XK$E-pIdWufzOaRPq|rsSsGaiSx=An zS&x}nkJ`D9kB@X&<~h3AKx6O&Rn9|u)=Tz$_JdZ2u@P7kSe$uJo^kJzafgYNx#0nPD;y4LrR8AJxmEtO3?xLrnDyO z>VTCYlBH5eQY;e(wZT6<5<-m=6oG^Zv=H!$z>6=}Oh`zwNkUB^)B;N+2_zn9f;R&a z#uEz?DK)`F)3F;G;MQ1qpk%C?2KZeLc>3i|v29=FZmw7{b+BE$SsbD|7_uSuC2l@W zT@5Uc7>)ZFB?J5?13Z=n9^XcNkHv~@j~Z41|A{$@4)>>w_J~o6kpli6ijo4}I7MYE zgOg+=+VxVX{-0L&)0>U@*w`*w)5kGdwrM@K|ky^*xMlZ)yY+meTo{2tQzits9HD z4^{!Ixa0~w)A@}rJa>Ydj?Pq<0+daz?SM#q+CqA(Go$_c$8V1816XKT7e`c`R$}5uB!JjfrCx=m>38#Y~u1xnF(?#)OZ%=^OOr4Mftw&Te$` zd^Mm=O2!URjf5T^2q97pPcE~Hqh%Q}_3mbvAvM>^6Q0^jXtfKs-&LuGZ7p4HPSSs< zQ7i0E4}Hozi6d`Pi=z>1BrUIP77Go8X{g^O(^wgH4C;EABg3(BY;s~a{7u?70P}Ps zjLuw{P;rlZKNLRUvN&mKTCTM3qc)Ahu00mIpXlEsBlIEO^*fdpu6)49>J~w8b1cD> z^`|ysFp1%@WQs;d5E68?@J!CIGix&cRXIQZWV~*s@6`NkC~m*e0TL|zK3HO!lqaCo_h?@N{3x0_YAFE}s)xr)K!AB8Oic*ZBNHr%!b@wRc79jIjAUnf&o)5`mAw6k$Nn*$_xNm*LTV*X1R9O!lc z@$_MbM~dfU5yo9S9<;ft`jDXEPl=QjhyB4OP)Ln{O^giCgefnR>n_f6M$$fAYQLW! zM{9%6K$Bfe z;N$Y2lgKH-i_TJFff?`g2(&U2O+b=tCwY!9$j-NU{D8>$7Mn0Kr|ULyu|ws_Al*F^BH2S3jq{D3pJ{Mm}l>jDsJNC3fW; zms|sFhUL~?<{e=DMtc%^ffVYyBTT)nptzAL#l=Zjv=qd;*h@{l=yucRp5w=wc&YWq zq#E{4;l5Kxu@v@IRBabUZoR&n_?Hs=#PM)MZeiCwjb(nwBSAypqReHY(j7Dft!`wQ z>W;En6DNeFB^i0KT@JKbheX4?t4;8pktFaO|MmW{hw(wa3}e=d8}EsF=wW)LUIO|- z-X+u}br_WpD?*UXE^&)E3I};Q=7^lJ70tSQpFH3|wPHaA(pVB?!_FaB@gVY33;_$Q zkkMmChy0oPWOBDNCNek}713peMs;`EgK(92HOn!45zaIlN~lkn8{QMK{gb>*!%cc; z(X!HMsAC>NxNIKw$eaUVFKRu zgZY7YmMfLo<6Qwl22w4@_>A92DKQy>OnqN#%ha+ zz{8$EL11R!Q9$64MW6ssH1LQn@Cf}YyAAkrR2Fa;9dKY9u&)@f#~QHaiyQFZpYB^C z4xaTN@pBdjo8kHy`g8jS_-u-S7qh)9_<&;G7rekVUf^nm_mC)<+dD4G&wF;R2tiaKB=g}}H1n0j_8qPCLu+Ca8G%l6Ss zxHi3O*8kYRy)A5DUF$CKeD~u_W73wdnk2 zfnu?;(s^j!*<{|i!eAb0)=_SjZr0&%*1>5;Y1WQx*1l%i?qIrQ(w1ZrWYV^1Xwt@M z(%NDCpK%MbF|lzAz_`WONX4jSp2esc%BVTQ@aRX==a1_jO=~}%41|Ah8#owT=y4bz z>tpHb=ojhFtmr@J27fUDNc1Xn4Rn-rU3G7C2y`=a#&v{s>~&7HQFX!`w8O&qIKz%L zA-dqKDFrVt}C{rUHZ_ znPP@Qzk;xWgTk&nl0t-hjXYZ>iTrV<>~Vt}Yi2f;>~R4C&{giZ;HV%A2+Z%0`wAAa zjwoO%WN?iPJTPxehFm5O9(XGa0DgIgbfUCpE*#KN>QqCDudOXWQb}@NqF-WN0!bn( z%UG<1TfAQkT^wb9PLxbsR1{Y%UzATYSyWjx0#oD()Fdt%FB1L&0)p^F5kfHZBh)PnDarC|7Vp*i?|m z{VF(K&{?pTKSBUipoSktV1VDkhp&2yABW#OfG?4^kPnwnlvkB+ocDs~AFl&%9#0)F z2`^qhKW`vU7oP-=Ax|)OG7mh@cWw!u4({n`u5E52Zf)K}E}Z^pV^r>YF2V0*@LVb1 z!Wz#Ks>CM7%**o0S}@P@Csc$bw3#*3m!*+eP~Cl_xE=6y?P&mCwl)Wl9PWWhVs_r6Bo!VqzJoJ2u%j(hHK` zZhuIZN#lusyT-*q6T1_KeA{+OBlaQYB61Ghnk0&e*$N;E*>qYUjE>$6By2I zwP8sRwC*r~zn*{}xHgFw5srf6f~|qggWd99`hSG~ePHcjnPN#`(PDLD=3xe5VqrdE zY+>wUf<>{wTz6Kzn1PsoG4?SaFf6+;EWKDTEWOby&~(r(xY0eX5z)^|5Ced?2*$t(m#_AG zq;cmDgmGtdq-Vr&r*p)4#BswR#LBNc2Qla?x+3Z#wg9yef4Bh0fw+hS2-LtSphq0g z9UJII0}lf?V(<+A3w}g@9=;9U5$**p1kSz|UeuW8zIfC4RB!L>xR)yh#8PH~c>DS(adWPPD>errtu7@^(w1;AXB!ukK!iD~T zGKJ{VT7~L{8p^Wj)2v)>gY3=&{P+I?8Svdmmjkt{rI4cI~}#^5qtlD&9v%L zCLXm?0xW-iT)%xRj95WKbgL^YSEQy}srHw>eOOyR{QEF@{rjQ(M+wkvY1z&4_VQso zbn5r~(ZTrqArHtkGb4KXxPAQiG4%A%WFZIGc>L(D@ES9E`nda$1u))!V5Me0eqi2x z81ozb{*mm2$oTNlegl15F9o36z2?4Vy8d=838>R?&^SfEuG7K4sii`CzL5k-0`{-9 zwW0s4U$dy=Q-y-=UV4n=h)}Z zXX|HOXBxW~8p9VF6&D&Y7a{g=sO1i!p@3MLQZ%9JOFiJfSTT! z8sKE-xcfx)NC==^cVc}!bWDCC2&g+&Q)4+)7CIIH&>pKm9V^cq@dH|q91aYu46IBI zId*Ax5%!b-^!w~P^gD`x!##U%E8ik3C+}an=Xy7Va=JQtL7ri|=sRpW&&s(vo;vzE zJleg#jJH-am$mjb!JEG{mNoY_0ydu2VKkMjnl_{rHXYT!6owV5H>Cj53dI|N8=iUm z>w*sA?Q7yCYkSK>E8<(L%S-eCF}YPS*A>R)&?Voc%oWe&zl&nSEB;Gjw9c+xsbR71+gkk##Ww&UfS!&JhR&LZvDO+;OXN?Y zTMY#ukg6qctcgIYHmFjrlC0vbVyPmpvLgl%eAzEzn;HVO8Up?r0;(DUw3?|({F`do znwE;LYU^s}a(fE#%E0pA(vWh=(l*jw(!3H=64}!4r3b{XE+vX3DaGJoOi*zrA39qx zI&raHfnXt;X%TY4W`SVA6Dr`Tv=CLI5Y@hbI^R9dJ`W9|5Pds8DsLedE$ZvdSCxkX zSAepej{-oW%ty7!bHoFqAppMYIXfbo9$1y0pKh250HkN;eZj8;(@8S&(k>AP(|~E8 zsgJ3hdQFRd4UX=QD2jX? zjjDqg3J-*_gmQW3gzWod`O6i&8K@qJ{SWnDypNa9cfU(xKd`s4H@wfe57_(o`J&OI zf~xkoS5Nh z98nw~9g-aJ{?uOmXNPPDYbSKM4}U3OmuKf;_YK}^*VfH82+pbqoB_54n}M5Qt-_96 zPWBJBXRY{;#g1()sNs(+spc&8!BlSMR5zBCd=}*9c;=|)Q06aYwdNY;v*sInL?8F> zi6*4*!p5<`RwGRuOvFtt-ez}5;Jvn`O<{~z7)*)Vze?fH|F*Y@9}K_E8S>M#8Isc! z7`{^8@5q@7&L6zExK&r>kI20t_iL3>EIq~+vwsjYhovAW5fT}9Mv$@5Y~Xu zxK~Hh{G~C%y&$jlUF|`Am_UPE6<>8wwM30XHS(%Y)#Iw{3wA*~Bdkm|Q$3okWTm91 zr1-^fVpPIaLR9)td{Asq3{dn?v{p1w%CLx-BxfN8&>G8QRqui==M=SIGgC5pg$QK>&CQdOf8WMGF9eS zmg_#W{K+ZzlT7Z1G)Sh?RMugHPU`pYTo;36zJ&Q;h=_{_r&!YuF>{as2u|cw#2l0) z)K~*bt5*Zndka$vxeD3}nh0tLN(=G}vI$ZO5(z>H>UFtx^L10gS=lzF)QSt$+6y)S z1RHdPo&*};g=!m&1uzBZ_=Y;_i}_>tq4_C0>i+T_@agdJ)t|J1cs6)wc}RJ1co2Br zxo^0Sxi`2MxW~9_O!%rI3@Ttm=Dj5$M46ytI1(s;%TT0HG^Eg^AhJLs(0k)4hTyl!#PQPbUpe>&by<>ls-0QQ&9EmbN@k0bFaLJjlqa1RX!0)`o z)iRkw@sdpjI_ZWs;{kj656|iv1kj&d%#(T@8Z~XI;YV#e4EYC;H;m-ljsVKK`1^c0x+XKCT=__CDHwXS zlZh#)N5gKZb1%@q)%?e0mPvx+HXmoIW`O&js%{3jxdEy}+B~w1VfosYaZ30^IO`4y z-|`Y9)j^Xfau0+opo49H~gA0Gxr4mU=c9>^G`lp_c0%EdO7=<^$94Sjh zg*{gZ@H-2e%%Mh(M|!E+V?B@=2M9kW<436xDEKl#F+S0RCz` z@bT_M)$YiI!6ChgT=9il#xer@1drH zTXaNv^AG8cRoG8fksYffVHiZX%$8HW3DXzCip;W&@#E-A%%eCtx4k;5}UG*QUM=5Cw$?WX+dcxq37fw z%cU_Y4{VE=Ela8n zeIZg4rv25z&T+hq`IsN|LWqmd-&Wo3yo7gM%{hSXd|qNf;|_o6L4_664Y>2odSvID zV)r5)!m8nAs6XSDVLi87U4O%*iJaf!w8tqMMhuhhK!-LzSmw|?t#@Jx+|X)f^v$+W zHufiDDy?*d#VT<`=f*DQLm&6V+@ovdVZpolY4xF+IG!*6eW#6QC$IL^n7zWW4~58K zLTJ<^I$ICnPux5Svr$y^U@Df@{SbeZK5T=L=dd?i(!wW;l{R$14I|uX{@EIpoG(LO zP`YPT>9>^kvO6g7H4j@I;Vn{7UU*uW90uR*4E9p3jmwTQZNPTg3zLRZfknNe?Bnoc zu2p-9Nphp|?E;T@u}ObByBC#NBdZ%TC0Zcx(k$e&MAM?Jp|+NA{KU&M`UqQ7D?${k z9;j6!k07?>v>m5dH4&(Q$6D&$DcKZdgS;zAhI2{LA*+t>6KkQ()~)p;e1qr_|Dm4_ zDTn6?#rl~Lc;K;ot_uy7LeS>K;zPAXQ%RDOP$Zu{YnisLdsPr_l#?wx2;mp%$Vik( z21y@wHBiPWt!)1S=gfuH9B*W@?rlD*+A1>`;MYT3(-j`uCvo7Mpn|L}pOdEpyZCu> zzL@pEEN34jyw0fO@K@aIuch*QPiITGq2q2rX2Fy4IWvBwYETF<4|}=PUl(iU-B@*) zmXcur_JyUCLwkLKvL5zjH`H%?o_|*=fhxGn7!XD#Bz9r8-^1KTb2`?R!qOF1ESOd7 zE&Aj6EC+)Q@2S{325PoCp|ZV}@ZA-f5u#N$JPhf!~R zfd5$=`*!QzzuTU=0rr4`z64`MqK<;iv}*Ma>?UDbfema|C26v{p?Lco-?q$URV6{7+o4AL`L7q0u8 zQwWt3S)hU;SxtT}UfQv!;gKq!u!C>Cl(%1}L81>2<2)GeC@i!T6XP4^(jvau57+G0 zYRss5kkRq5ng6`R8MJH%42xA`Vtz|m2kHaHbx|2rEen6+SO0t{F>xw96l*#{m!xTW z(v~ZemKj#u*JlNK#;HJ?v0subF?FcvV#B!GMn$TvM|^(-G5v>;;8U^v!b8bvwzTa~ zlZ0QGX@b^ZL@4EPfgQjqhHQPB6b`Hix%=_4!6w3)nx=?U{OeV?Kd+Ep>VYTnZh++~ zjsRv8uM|pLZt>=47t?(u`!3bJIe8U>;36k$z`HUU?9iR(Gk*Is5rn)kxqdw^N{gfP z>IIKH-6ggOj$XQGFBa5V?1xIOkCXRL?B!Ncf1{2;+FSv+O^#??&W1{sO2`9o6lh{f zS}!$~OKTp__fGl67R@@T8nRw;p|Or1mG{;Pr=H zT@4*K+5R;Z#=|c?$2z4tQaw<&R(F#Dpu6|;{KtE>(zl@UV@N?}__G67q~OM$v% z5EBcIE>-#$MV9&*m)Kt+og}f}b>~)BRw%Le)KUj=LWL20v7U~vnU_l_(9bIm;UCos z;Qe7t1y&>l)Q{P#rhO#f9+$tF7}*-RuDobzANmLoXRBsZ&uksL7&~hq-Sg7_u<#9Z zQ%qK}Ps(U}p#=#YCH=rt^-uapJ^Io4KwrMNxH?ZJs4f9=QPv`4^v>mFGf1 zjB)vz@sXNu-L3#v*z?v1MMMOFEMlw=`r%sZj@6{?EMEH~LzdVX;j0s>>u7Mp(hYV~-R2BkZ@8VEV8yqu)5ps+z3_px@U5dmb~|?YGZhqsK(_@3mxGIkqnj9n z@ZeH_JWnTHRwsrb?+x;HI`9{l9N@bM0MIt{KFq@hGYE2ZqmuK1!G6r)wZgZeIvVuy zv2Y7A7I8e#lDF&D`y;#!ww;fS*{Tx`--GQ6Ef;pAF!llA&Le8)~gw%aauzk)6JHI=7 zp6P=NbU!{|U^Qu8)4updQVW5O9EU)Tc3FFWMX(2;tX^^|BH$6LHM{s z*!<`oN&&uD?O$`2SY-TaQNT)duzz!~(%X*sKl-*lg!v!7A=~edAT9segbZAhcW;kT zEfbNH!62ILpz(6pg}?Z_GM)c%9-@o(!}b#N+Wx@eq~Vm|aL!tF;F4>lp_CwMf1xlw zyhD1SGKdz!EWIa}Xpj9-V9X0GM!~&b2=5Xi=2(0!8Pv=#oqa7IncV=zCO{H!29pCk z3}D5=QU*n+YRyue4zrS=wbszl3{Eq4O_`aAJM*06BmY}GW!QsmiFKakIgN3N+dn(g z)(JQ+ep)c%eo);zd7!>2zje4zh&(4N#F!C~Ctx%UXb`5awQkk4O}3LcAw|<$acfR*cZHK6fzf z<15A=i{%nuBfCadC66AJlKh8mt&)3CRE#p#bwI>6aIpPl(PJ{>lv4E+o+`eT7PJ=w zRTQzN5L7>?Sa(y4;XlFTrS zvsQ3_!Ay0pt927TcPy2dq3+$ocjBtRQF58AP z!3aC+6krP?@H_#Fger1@3|XYE6$$8u;EqCoPw z6C&fn21LLz6By&1BCO$+96z%x-dqJe<-Dw{ zJc&wK=v71d!2Gx(N6&R46|R!fQVETt=62p8<@l;`b9qSZs`q?{hO>X3#nI^545i+21IV8{?<6}#^itLwnQEW*O+sP}xre9a8?|VGmF>t*sG&*OMNYB***m`t)*pg7oGQpFL=u1ODj+_q zfAp}$Jn5X=G4#M&9l+Zxlldq;nB(v83nKg|%!i0PO<2E(hH=)uBGxb}VD6q3WM;ZU zGsxTp%@3^yL!nLz8VQZZ!pxxRpyqyNblIe7R5rXzKMiq$<>ofa!IqumKH6D+%KmV2 za?Zg1@E?SU>|RoH}N>dVI@6UXfj zUesVG^P^7McW_yh-qcDy-yk3%VPP4=n3~F#z^%Nw-@G1fwEByGo9vnFo5Yfi6ONOU zk>MG#^~SW}nXqe#m60b#QMF1)ii@WZI5;GD$SM5EQ$ZAR+&VzSBI1qrE~~s$S7D!w0C+R|J&&qaA(7KF{+j z=Ihz_lK$tC}Ni%n-fvF#z+JURvS5*h1& zP(IbKi8``Jj(b9r;hJwf9~FZIYTs;FimK0Wq4>eAN}L-}9(4~$RRF$H zp8i~aKk5ISFU|A+Aoy|bY+k!^#7tjVVid*uf~Q4r=I^&C^qKVjX#KSPxj}r&({J{6 zKezeAJ2h|1U$x@B#49^UZemLJbog4>Am;s3I~{kk|Mco6lf z_}vnI9{ym7sq?VA?5DVz{Aenm{r_)9@0xQf7LOXf>OWTe&A1^=&K$%hfkb%WDFR#! z4FLlY9?h6giB^&@MgQibD+J%WIR_N*M#{TIEI8CGrxZgL zGtD1XcqKv^I*MsJZ0-oo72&5Efdhe=tAgG7_yUp2)_`LK^OB4388>;+R3OAX#IcI< zMqE0P%M7V}BRN{8<{`;95&p>}nS|Hz$n3+JXYn&VCGq>-Y_-urHhTLmCLm(mBzL~qhVC;nuiMGx#zirGtn9n z!D9awbP6AbFo&r#pBP$&T1Am_@m07C*Ka^`vdnUdF+&Bv2>|%s=HAektylj!2=qfo z*l6p)XU_ytp3%}J6E#TFthDT6eSN&B;3`WL3`38L6_(eOgs3vL>ra)|`oK=bR;v^@ z4PlH1Y3z;@XopY}M(w7NeErfeB+x_uQxrOGc(7YMHDzcKhz)D%fwpLTG5C_S@$MAZ z|JKbC$m4ZCZ+43xa2rT_hY#V5YXX-ZOG;X_q6^1<&Ul~Y$>*_SjO5L+(Ym4UNHuel zh#PfwbM%_zE9#^Er7d{P@ts4SeLpjAj@=mUX8V~^=%*k5`}hqxMntFxN}_XIkvs*( z5#y^US?i=z77Axke!Wj3qm7Tc>eGONZGO&xMuxZ3nK z*{+hK0-`0E`8KO7-L%^2w4JPWkZx)1vYR!%k!*jOt*mjhyW+Nr9j)q;isqpDo{I-{ zH%Sh58#)zw8lq~H?cjq$rIy4SNRKiOV+jp_esBvJ5gT#cjgC58?TOBh@?k$sw02W? z05Exck$Wy-_hbb|g1D}XAuU|b0ylc=M17EeP-zQR0B9q#X17LTLthMo<|e0|ZRR@c zwVB-grcOCMfF6Y%dOSo~@?0R~quVPd>S(>Smq$$&>vcg{=#MoQ&&n*k-}>ao?O>a3 zS06NHBGeMNN8aOHKG03biehE`;UuWH zf~JglQI{hY9cRMW6yCQQrrh-sy`ZpUAv^_h3gWo@@$chFhZ5OU)?2B=ttc06MBP~i zSL?7^bPU)}7<^H_NxrNnw1y%JAS<$^1Ttl%^8U~uQVS#t*5*+5-OgccScQ2{Sd=a< zQTx4+BFZUUUIso9UJ15Cx6PJnIxHP{#ZIQ-POP6E_)7ik>cbI!dq-7KWxV^P(cbLK z8Wu`JORn42n+E6VRa$5U%5JS8NgRL3+$AQywL{~`Lr+(w1)@_L*@4%}E|zo8!(27r zY);|M&QIIi{xj;=pHhYs!1@X2qV7W9C1#jnxXnUjcx(t^^fkF>WZGZh)o6fU?`b)j z5L-}N&_KdoQ<}fwbar(;A?*qpA4tC`Fr<2_X;j8 zRNy#4%sw*q9bC3Yup$j*&p?cQ!#RP^p}y#S-M~%VK(BRN3{=9FcQDS*uFNu5;kdgz zfvYn7qy9lS9WRC7n#*jDsNyv~<$XzEt2;M1&Zy#ssMncf7?fDtLXIlwcztuEI}LHB zGb~|j6~*=6{Bj|%^-N;P3^U%w1$(|_}}M}L*QG>{?Kd4 zK{7n&0ARU1GDxP3?m=qTRb<+W6EFr~hOwF5!T2q8ujXJ-#9S zz$#&a|4w}qY>IPWvb`N#+CpVg^$U2zqPse@fB(HuZ!7Rh_4ZYE(}={`mXQW?oRSn_ zSl6x2#Gw3zC_-~Dp2tdx9}k&|6;YMSXE6SzxP00lDLmp1rUA_}h|B?2>`8R6!@<`= zqqhSFm^G(oeU1sfTuM!!=$l-*q3{&{jot@X@_1i6mb~sRC1eOedI>IYA^|FW52S?> zsO-x!BDV6eG9|uoJ@q$GKJhHwXckxvj#|Lb*TtUVBV01_M_)NLCUV#Uz zVTp}1aEd}Fqi`f@p2rBfj3VC}R=0k!>;;Y!;#e|t8_TN2-2@9AlVZZ9cstcZE_6zz zk{#PYYx7?0(>vDjxz*c51NQQHrh4T5m2|*DRx$ zCXtt)@a0{SCBVUHDmO#gYZP5v`6G=l*E4EIL(YsHm+#^qdWfW1vA2*PpzA??k1O}4 z2@l14YXxIu37B1jd)z6Nj{+(>X|4EF3q$Jm-()empe@cW3l@F~@!9*Qg0~=eDDy3h z=^IThXovua1hjj#lAz=R_hz^GY#L%z3~4wKa%^_c1O+}E>&vh$rl3%wUa-|Sl%d@L zZmCHa394*s{p`LJO(L|aM?c)A;CwJ-F=?) zh|y_D|GfsRZ>XgytJgRyf|}NBiUSw-egx0rM~fI!Aj9hO!)8I*VjWcssN5Dr0u*s_=)%;@F#lGXb2kEdc}>HVPBHXTwm=h+`+hp1Tq#7e@t@IjS;) z+VUDoI$T53KoC@c>VHD6o2PKf1j`uGgeCc{dXCa!H&k?Ni#fbv^nB>Y-{kQ0E1LO|#X~(Q7#?Pl8%>3uF>_TLfs=fxzwHcW z{bRYn4_V=ujLF*i6VKgp4l9lO_QvgT44E)-UTsg=9okMk|Zua0<7zw zZZ!7+y^{@a5T4w^z9M~xK19k1qY9)|Cdt*ue zq1y^<5*S|!K2yrX&T$akFB)4fg_?>`2QmA&vHWY)=m#0u-4dWPtcfl+DkSg<*J&7i zD$Gd5^w}T>L;oX}peo&NoXxJ8eRQC>4al*_2EclRj`a*OQwFcmtgfl@w~~zEj}5A7 z`;ylxl-{c`9kIGUwo>~p>P{Ep>YPpJotPOob;Ui|<=6HlrW2NOwrf==Q^ddsAo}g^ z-$nZ=PniAmh1tv@HeonEUBXG(9cJszl&>Xao5YAnk+|*NX1b3UJW$Cb$P>a>LBzS6wZAnuKf{vQ*Oo1@HBC7#Q$}=V~5$G7x>B!*m@3d9C47O}u9#x?gl%5ul z#cEeU#L^UcD8Nz@ECERIv;wQ;{c_kot)B+_Yuf9RC{T!L? zVES6xvi;8&?dd$E>7>$Z`ox07QB-k|<}M%!`dJXpp;*xyMT*m~jZ8!2Ch+323MFt(h04 z_v+SWvu|-XPurXtYg>)BKC&I=9<78*7^);=O*oLWfeMz3=UgODm@d?!pYJWl4gOD6 z&yDY3>2zJ>T>dxP|A^pLUao}K4mgz1MaBUgNJqwN`@P-@sg%LAUR0CZx+)wyZQY-_ z`%q^{y8^-$uUA1@&GU*TV(ZAJQF04Z_?qkje5%ao`^fAhTykO2M^~48r1a5P?nOWl za&sg90qi0phaYwLEm5p>4kBW2tOwbzFvAfXUUx-yC!?Q&qJxMHeK4L@D!cG+Luy7O zl)oLtG)3+dW*m%{vLm|N{8bZy0_EPXY~oq5G*2-JoIn0{Xzqhq3+3I(MYW&w4HaP| z(4e7+?CWRTS(+prsIERjyJ7ywHCo|$fI1L!uPt+f;wjrpXYWKEI4CEC<9>Dbrp&+$ z_X`#F&T4W>2o=|&sG}{v10tLx{hdw zfIk_p|7~}{E)@dh?keKF1%9fJ_VK@96)fw`)eqb{MD8P8^&nBn2UA9z9Q==5!!x;j z=^txM!XX(*Sp$R?nb9o9L~!^sYT>r@>>iR67p_){*a!76oOSI_{c1k+pT?P}l*nb_ z6h1hMpK++5?b0llJ1WfpuUv5`Jnb_v5eO#e1!`2j@37pSoT_jx^SFYzoIKf*s(sG| zTj7Jrg7#^Szf(wl@|-lpboU#H{|iYRg1&TWp!&xD)AH=pU6c)#br&6wY?l|W$l@@>D<8)}=7yE4H+<7{#Ld^M$Cz_!tDb>kHJQD6; zRscfS{RL%j0T9d8B|I*z_e%or!wdPPPNia{*rjJBy(LK{<|TY3XeEcm9mTQ5#>L-@ z5sJl{1ZOuIFD^N5^%^E-avMb&f0fb9;5B-)FE*GpFdRITS{<-&ximyJ{N7)mTB^q` z9joWLADr5qYHt*t;(3aHw0wM-#F|2#B0XE2OqukW44n*^w5=pmUr?P^ zt33g_%wd+QeY!Zk*t=N10NwOo2;9_M{8Z7Rh-V zlRL)BsU0IYKFB5+!y0=UJs&kb&lz(X3m6;uBRM8LMlc3D_Bkp(1{f2*f*PY9`>c4Z z>KM&G`^%6z8e5KXFF%@96E~X5Q1_?!kH=llsl@2WFy{%}u*gZ?P+mIadB#!R5#kY3 z83DEDz}VqJ=@u2wfXo1};@4FMwR&n$$w{Vh33dNiaci-BCSNgU@pOh*aZQnA#$8f- zl1~yS2`*_WF(FYs5kGM!p(Md7fhplOz9n9>OQnmkOS(&}%V1+J-{)t_x2jFD^)Gp% z9Gx8X9D;3`T=*U7-0#Go+}*8XqKU0OqO>g_^_uBgSw?L}7XI}r!&+np zHy%D-{_6H>B(6g9eC8OQ`Ktd$b9y;mU3y(Q)2bRS<|-}j?n)9)&kDyANjd~x;z}J( z$C5+p^nZp+tf}7r{nx&9dx}Qu`lpvH1%>ia6&IA68R4H;~YeE-{B& zqdym!;DCN@m!N?07tMRNWA=T9Zu!6E`kBJ`7gW!g?~eO4@$O<3rdbF)QeRPg%6K*v3*ayTXqX}6Fqx3 z8#aM%%^6{?rkalh?;7PAPtF1PQ|b=tBlgdAp!<3&B z(K7Edfbz9+im?!>vU4G+$TJW#_tVGI+tYK?5VEB*gHg&!motkqu~UiWV&<JiEbzDU^YdHv zCi%R06ZZ^x?Rtr6P6Xlc3~*a;>j$=SDRDt_WwiT=B1T@{G@N z$V`mzx^QDM{WHHRF_~JKvY87w!dmP&quAQmiyD;%Z<+gr<0>91xhWDVugYu6oEq~?L5a&s$x1y*K}x4;-i*8nL?TM@FT(6`&~$CF`LR*5 zma^_K)G~gx$$b z%Pxui3J_&&Z!HPFw$eNnI6gU=I*K{~9nl`G9QGW7_uCx)e>t^a& z=u+vD68}>O{A%m`!c54=Ou0-EO~Fp#$>hsK%Dkd`0fS|YfruDsaz1i9=+o#FKt@?4 zU=+Hr9F?3tdZe_CjJ9-@)43JVBd3snkj_Q(nk3q7s3tWW$Kt~p*!;R)j* z;5p;o<{sj9;(2IGeBOoV;yr$PV=ahOx{|@s#qPe^AXQS`C>-+!K-0Rw_ z)~o(n{p-3#hVD`P6-3ta@AFx_{$KQzB-{7(c+`Agq#U~dm^E^kn-u&>fDb1ug( z<}WNSCgPnq_fs=t0fkwzqe(uKh zd=0t>{LHyj`A(H3l%n{H_+*jcj?}t9U@^M1u3+y7uJG?%@7AoEtkvza?iB99tL5y& z?I!I@>ptr#>kjLp>#6Ek>b~i*=`Lu1u!Lqtu1;hpV)J3rVVPljT|r$QT{N9j-5=e2 zoX*^n++^Ito9W!e-6!3}+LGF1+BMo^*;d&}**w`Y*(lkWR~A>lmvEoE+4P^KRY_DX z)k{-GorTsk)b~*flbW10)*IIRoa5CbYD^K zPi?eTw1ICzOjm95Y>2LTD@7|cD+DXAM;ogBsgSC{se7q^Xj5p(sFrV&C3bCHBl}|D zVrHXOBG;qsAhls;X|bc~X{Vu@p^c${p>v^Wp`afuAIKhuU-oISqL-r9Ug@BPUOZkJ zUecX7T?(H9o}!%ioiUsnoz)mGox__PoMUC^7TK6_V}P5bn3kACSN#hkMfV>kF1Z;jVO-qjOL8qj3$gVj**LwjoFI1 zijj)njK+!4i`IzXiu>Bn*|yne*(BMx*mT$n*s#`Y))3V|L1lyeK(s)SKvICCKiEV| ze?EV=`?dR!M}b!aEWj; zH8M4DD_ScwD;6sZZR%{xY^`jPY;pPV?SdX zWAdUv^(y zUn^e*U+iAHUY1^bUQ1pkUJPF6UB+FZU4UJ9UgBLfUKn2RUBO)-5ie8p5S~!(?9u4n zO~y@#NkB>XNH|F6N0&!ONB`p;v1tZt|1PrS+1?f5y1-m-9 zJQg|eILEie0cEWLWrbg;BOu^Evwve?;II%N3WbEhP(Tz21VdpkAQTFOLSY~n3BZF5B^+aZux&OA+)Ft<6W>(5p& z_S+n(3xaFcvUhOG@LZN?Dh%keTrzJobz@0UtkFcPcQD^Z^KCTWj@Gx)d>hTT(R>@t zx6ynX&9~8f8_l;<3{Kwob1LKuYzzM-B$bnpMbyS^N~rGdpmaJbDvF}el|@;UMRX)A zVm+W)?c4*7%LP9@=Gll{^uQ|`LCcj!(0St>V}y803uJ`S>b+AoB;J9OD|=-{WcNPx zTNeH#s3(lKP`=D+4zRWN)+}p`KviMW;LSQq?}|pya-|V;?|5S-AI=lX2I>b2HBFEM zLJ@f(M(V%G>7`c$K-><^G7Yi%Oi<6Hc=l*2QVKDH7sl^r}>6IE3rdgup?9eq6SPj5D0bPsEHvbZnY4)?TSn+fMd=IUC zWkCTtgdLmmelx{Q2f(FL5AG47KV7_7RHnGDAj>#<7x}V+uy-;jMvvr9A6AM3tZxz~ zQ+9rALjM%Tsbrz|$aV8aT04MpPkYjY+@EI8%Y~43M(>+A`xU^hHKMQHnX0xQzA;%Q z&t&E^6->}ThyKGBL3suZ{8O`V#3v~9{TeHv{w-yC8DT^|;56W+lxi4KsLJ%g`)+fp zAb#y%7?xe3{1AI>S@VH)+GTOU_b#%L!TTr_9d2$}El?ku4Au!QWq0M5i4#5npL3$z z@I6fhMNBaowuI8VC0X1(jHC)}H!OGyWSQhvm_q7k0!hyCmM3;I{E6npfSJa>S=GS| z65tNXmP$NLUIaa$Ou7|DWHrcw!S8KkhieSWUEr^i&Eq@ANhn63o_2N|=?ky6TSf?% zs*z4IBNJ}uyrg%xUrtPyh|i$^dKr>RDygI*^$^I1hlV8<2$nYaytZPjD4K^z^?k7B zm8_teMLF9zWmyUPbNLVPV1)&EI_n~DC)s0{2k#p?=E0&&_y9#_ir9eom@U1e!poH% zYqe*kgx6j+OrXqseK1d8l_h@)`b!t>x;_7k8gOOrIYJO`Z*OmJZ` zTQx&95;f~I(=?(qdo*J-GBgV`^E1LTn=^wmQZp+v6Eos6yE3CPaxzOYGcp1)+cCp2 zk}+#BQ!yej`!M4$zA&9IcraHm>F=8NLEQM zrXl$ua3RAXAR#Frd?4x{Js__i0w8c7!yh6absys%HXoWE$R0W#gC12L!yOhL`5k2& zR~w-keHvIAKN=1i=^4-&pBZ`?VHq$P3mNhl!5EwvgBVg6Ef^FS;}^acr5AJ;PZu^9 z1sC8J#}<|raTZt>Cl&%0=@qyYlNEXuRTVT94;AhdlofXsS`|7Ks1*AY)zD$kRS$p7 z(aaSNlgkDPFUKRt>IkpK1PIy(MF*<}{s!g-!3G}A2F}X_48-}M!JNhct^sKMDE;XC zDE#32nEOZj0hpG6xV-oP_!Rf>vwgF)kUH}v^ThM~^1t#%@*(ob@u$3fv48Vmv4y-_ z^Z&a}@m}yr@Su#}?;W~gx?Z}qxm=4vxl&(yxi9ZoxdHF~@ILJs?ZE7?YyRy;?ar&U z`0n2B0=G}>LaXz#KJ9n2KChHmN4D0{u66xgVzv!aqXXrxcCFtts#pkH!ZRbem zE9da$%jT};bLLLwG3NH=(dD$|dF52)H|6}~*W|k7f8<)^J>&x9-Q&RHh2vo3L*pLf z`{LH(v*I1%{o*t_<2mPNfd2uc|Nd7 z6tGE2+Hq%J@o;8dQO!2Z*V8M^(A0iLEN)kAFQ+A^7^e%T{-*J!=_NL(8L0fH;itx@ zOhPU~vO@RHFV7Rt_s;h~X=Dm=Yo?pejn8k-anI1B&eE{OO4&T3A)*ta1)}$%>7m=9 z&7nR%I$=v~WTYd^70ma``O9OWbZk>#6C!=1!=S35!f2;xjA(Ia1M=nZ&l`wov>I+| z9~qTqURY$BMwqCWH8X;j;+HftG>kKvGklg-m>QTSl?awFC}DGxyOWWV#!<3S$db8H zd|$7VHC{fFOJL%WE0O_{Gf+M)QBc2JQk_-rjGxOzKvj3OjbBnBvxdN z5RA);y^61jp^B4=g^G8IXGtduk&JhYjEQiGGl>z2Plx}8z9ZAI%(S^7ARzQ02SPnT zW=}PP1A)pN99)3bKc`I9fyNtf97G%&EgT#6e(QjyfKffaNmGBjNo{^PevL}BJimTL zN!5L+eYSgUd-Zzjdf|H4da!zvS9^*o#t96Yg@mY6r6jF&*5?h&Ct zPY_LYFm)4k_;lTLV-H0S$`2BpNt`g87n}}rP(jA0^9|Dsj4(Pqj&i3ASunCZgLA}?g)M>YCEWI zxCVJDIX8Q3SSo2Yf^A*};wOVO|I?M;}KK zM*~OoM(0M^M$1OoV2*S^(aI!ii~{Q=$c!t;{QXwMol4Ke^S^D*f$-!WJ+LNZv+ zEzVT0Qm<-*Q!F|x)hsP687vAb>MA+UuwZ||t(7x2<3xF{AT|0PH5z2lkVK;!1A z9oe}Ty5YIBxrrTW9f-MG8{>lC$#uLU-ygIxhy#KqvyT7r=lgIjXwDhO+!togK1@Q&2 zwzmQDI=BP5>$pztKMN=k>;LM@sCT)#>Uz0?sJ-hh z=>+Lfrz~b`lSz|W)%KFAl7x~%(x{PHk#y5Jkpj^}kZIBmkjsy$k801fj&_cg z&|8i&&h1L;O463vmco|GmMhE2%I3zO#)QUB##VqpfEPN3xCgknxS+V6b%%Aha>S#r zqi3UEqy3`wq5-1xq35CBAOW9%phceYo!Olbo!6Wwo=2Q6oMW5Xn9`Wan2?nYQ2bBw zPvB2=k)KZ|PpgnokZe?zFZE9^@ZB^`#Yawm!Y6)u3X%K6WXdh-5W)Eh~WEfxWIPis$MPYF=_PsdM&PuS>q%Sy{S%LB`L=HJMr$dJfc$g#&e z$5+M>#nQyP#Q8+mM9oCS!$HIU!t%m$4D$p0McV^e3=c>3Mpz861Gz<*13?VTMzTf{ z4Au)rL_q_}6hTEQ10ED9ML$OW0?8EkL=Hv|4faLP6YUeaMN;2tLRvy#09gPs05Aae zK!-pK|A+pz*;l+Oyc)dhyEnTZyOX-|x!So?xvn{GIiNT+IVL%UW~?K?;6HQT`~Mu< z6$y9;6#)#E4hXPaOp0^hzyMXe43AN^xHPDS*vV|;iC`bsE2VA5z~E(00&sm}J!Z4> zpb~p3>*REVh7cjYYy9MB<64S`wR%|bRvc3Mj>rSNpF7qzWUTp$1~^6Jn>HMp0DlK7 zJ%6y64Qh+>;n$bz6hx3Xnkp0)w{d#Bf9IN_f;*5w;wV~antF)+P(8AjzH=!l3%v_n@RUBUyy5f?l^N;p4&TgOO@S5TFElyKjF zH7rVYThj+40*(jSTM4124f4VDAXE)iJ9o8qOScK(?=z%*6c53+RcFAUw9BQOxTdc} zXeFY6=^!q!vPul>?_yO{n^ZuVsq@snDwd69Io1TO4whV@y(>9FZi0V6771Gq4zgk{ zj`cci+*PDxB$)W-RApLRFk6l<@^Xe$<}%N;IK0z&OEJ%dffZZ0?b7doSiKBL-uj^^ z@~i)#8V67&Veboz^JqMw=<{%!!x>@`fSj`Eiuuf%GVQ44k7jOhUPHVKK~W4&VYDcv zCpWxd_KJR`?eDD~4Qlhi80WEz8D>AKr9>03$=ycI!WalqqR&DGi*~w(K*KpIIWKOD zn_$)LEUIUUC~0&pKrMY#f8opIEPuJbq!E+T5u{S zQ*LTEnUSg~3lnU4$dUS`M_EE#G1W5^aScW5fxFXC<@TOEc^yaTOIs4uQmSOTu~v1uv35!c#W1kfpGj0C<`(?Hg>y? zBa~Dl3w1}!3Ggz?+04D@^1WI~M6!E73(nRcUvIv{?;qkScz&LH>?P&{xR z@_<#`ZWZ61nnWq4=%u3_jwMNi76$yzcPwA3mguQ=YwSXTrEChBON4yG)hiOW#*5sp z&28Im_NoiK*TT}SBjXIQ&V~$eMHkAA+C0QeQ@%$Foh?s&1jw8<&>iIj0>@prTnJ$% z3KeMu%Pyiilr=P)9sx?EWQ+v|NpD-)$_Aq!7qBvfyk^E?P$w@XmD@$xN)!iUm$&Y8 zc~1{Zcxypd)-o8n7?sm#nzeTB!l6R7gs*>` z@>(VZR{6~Z%>+SQK%hf{xk!~*uIyv|2qCB;j2%*p z@MCD03=%zmDe{hQSK?(8gStqn0_Skscc(W#)G>VmMLrWCvz&z*kQ@Kp88`gV!ay$l zV~#`&^PfN8WrK4fo@3>rd@)#5LH#X4s}?71zR{o3jeO52jThO$n~e5 z)zo(|kB#PGqj_vJ4;z}tM)TOzJT{ug4$Whud2BQv8_i=UF&N)NE*h;IMTyz}D4_jE zaS<6MXKFv0D=Ad`{!iz5o=@~F6T}wa*$ zOZ>GqC1v^}rKV66LWmh@m?%3i9SjzNh9yD6LeQ`vXtEGAEQA^sf`)~l!GfS+A!x7= zG%O^Lu4izu00^uw0b1l3H%JgDF1rEzg9rCxJH^F3bC6sT2jfBrK|;#>3)>b@;(AX= zAO6zNMpOep2qJcYndwSt-|?aT(3we)psuA8fDM+xhs^ft-T`3)T?1bO$JZ&&Nf=c~ zDw$QPBO(o9$00RJi`shAagpR4VY$Vt)Ezn_x1R>V^lz_o|Fm~*mg<+1B9tAmw2k&a zFFn!P7e`cY7tSbh@G8g1cUp?rTTvIu6RY`QG5Q%KEK=&gNNz*wo(Oq4g$a$(2n_BQ zFwPV=Nd|Qb6;*>9fPIjNJ{OYIU;3vOJ4M;{@SAlC6ghwM@$fY;AhKPZlJ}a~O9{rN z0PZa0EuaFDNrPBYbip}uFFy$Wl&-|}idpe)eTG=9l-2M+b}yD>e)4=fOr>iT`U#Nm zDJf{F04uL6By22Ms_$Br9cH*m9X^*fE;$DZvqb$;SJu9oict?&`4VXD@yj%;Hyj+N zR%)Om_lMLfew6jt4OOotgC~c$~Hdjf;pOU|VYn*UG+E2ioTk;a2tb>@^-+iYJ zrv|jL5S-t#G#yzeV#y~^MdUEyTx2lLo&UarTpfacN1a=BCb+f=LM3d7p&Qf^059?q zU##{oeDxLgzChP6e-Ei&qSRgIkjjTD=W@)TsVsv?X)|$4y25~Elx{oRt$OcVW)>6M z7s^GvaF7(O+pcs%xqyJb3!`X)TT1{6@dZMDGuHZB4XGR)fn&V1I5D)pfo!~Su^Lj> z+T3B858WxXNL1v|z3E?q8pFF4L7MlxdAf3B!oC?Rb4kpoV2T zLzp6Hnliot7Ge(wZqtRo2d2wMhKZx|8*a-Z=TjMfNDbpxyLAoSMR~q_%)p47@_1d4 zAjOFZj)aw%52HsA4+@%$j6rcGC+kaxok<4+sO3e|=D>e7-lFF)fEE%^b`Qki_Z@t~ zDTGgFj2H%gQ}KIYAOxJoF;Qy&;=k_(PyB3nUeY$i^6>m|aYkZiepijr^TKljUxEz3 zJC}eU|9y#B4)&|sigY7A(e4nTXTRt>Hv%O8eJ>EK^KKmyWSzEdkL+8h$#Fe|I1{0+ z-fD5yj%z_d;#Y{>L}P6V69HQJjR8G|euvbxyZUZ>4RgGr9cQkhi)XQgA1)ESQ?Hp7 z!u8oTf4rmbe`sdAUyu`c?Fq1)P2wsbn@%sT;tclD=6(k zrpuid7tJ1C>b`^k^8-v4Fl4}Rp|n8l1uWv^(%5pvDIcf9MIu+x6Jd)VJQeyAZ4dR} z$4L=4XhM7L(3t2_O!U3xaH0P_BO1}=G`T8*Q% ztPy2%;i=%6T_rx<;c&{hhVKyLVXk4T6m}%;v?k=O_!XI$2Oqqm6Xqv`9f6XH^5vHq zvKO*JXQL20o_9UGAQ5O>RXR@~3i%UOXy|%U5HHDApOqfk!>Z5e#F z7X%#$ypIKO=kMY6`wjpk?6~alTBaI#Yj|TN;0~{am3_E2B6iRgF7*c&JaW} zq+Wn+8i81f5ya{3sN{(1c8HoGPFs%g^+wKD!fD>a2KpPia+|M9`|522HloC4C4nVJ z*wKi=+00)*RDknM*whMtv1;qh)$sK7<_I5zb9carB449H`z+K+5+jw~jPiL+=B$H9 z+l*~!GJWsjMST@o2x!5BA54Hfu=Skap*%bD%LFf1^R9VI}1 znN5{F0rU5icP2!iCwg)p(Zu_WvfU6nih>8l&JpGczy?9B>29MrBUrf;y{1Cmg$|bHI0K_-v&Dj|UMxJs- zR>^fk`;${}jT|dPgqgoa^qCvaaT@*gyurQ+2jd$;5N-TaD@K+^dm)$*ISA~CAAH}~ zg-E*}A8Tr_$V=2->c{i}njf0h=|sy6NB~VtFqD}~^DO%CKZZ*AWZ-N1`n9Hs-O%;; zGwt6Zga=*@IGc(gkQm(G}Fz#!26jb1g!%uLB|bVxVRZ1B9`+SGb@)Q^-6w`+`< zM+C5)r+yv0I#>(DD0H$P9e(sHpUwtDz25f$uAqGp`Z6IS(-ecmfgpF7IaNTz}06lx@>I zuwkO$&el0N(-`3z2IjLWF*|nUD7Xogr0i`iPUQLohwmU{`A~KnR&Vj1f=JUR?W79- zR`uLpyq-3Z4@NGzmdGWprPLCPr5$_LB&A>uRc}6fo-%Y1wi(Jpt)hX`&nW^XBo}kw z7Teh2B85XIWZigzJh)L_lRge2szhsAXAiOPRCP@+%>X7Ohu>6G}QaD}wKo$e&q1Bb8p25z9BoG#Z^ufht2%{qJ(d3)*I^hf}z1xzfk$im^m5aqK5 zvce1tmFU*dxmSHqi=HTMOgORO1c#F$Sb|Q%rfeNIw3S^?Aq zP@0~-ytQ&w%CyL@PuVRG?fOo8kd_W-R^iJrP$+yVfry1l_w8QX?^gLV{}C&+^RO@! z8Wm!MAr6;@*z@4gpWq;1h`K)M_PSTK=)e zrEyTz+&Bf;_6hN$glv3NK#uTn7f2S_Z^qA?v|d;zHwJg~sZf9?jo|us37DI|E|FL-XV1O^?5$+zq!c6^`^hS}wW}30V_4YA8Vv4`!8% z`1W=zL|@}vTBL}3=&CZ}eKZo_(RD-ian(`}h8lu{a2p7<&*D^8IA?IAkOi`(h*te* zPok>7R6rGq905B>lFu#dw0tJDx5KA$`4NZ-?L~o+Yi4%@4ilxmKBYIB6AE8;hIcf9 z4kFsF*f&REJ&P&;RjjD}z70I1+c6|23-5yW-O)t-6#ASmBdSwqbTFb5Y-nq2y5%bQ zPA;JQ84yma6gJN*i<(3b-qwFe1&iAPBJg81H2Aa|MC2Oyv`Z>OBoK$IvvQT84+mPp z1wuP>^9P4^VJMgXlg-R6e1st}8CQP593GuV;7}h^o*1jZp|_Q{fJ2j39z&Mf)3!^R z!)>`DMK&E@*2h)8x^V>J!ZpyqIg9q@dFxRi`4)wPhuA|kRq2qYQc9IMEve2MVO_G1 zptbU^ypY>JX|I%)>8D)(>MPEx{J9P3BS>}d?+%Xu?O3 z7Zd^(B8UJ2Lqh-%7>NXfu~0x53!^lR3t)UiW+`k-^qH(=$RQ$9 z009I507M`F2_OKPZ+hx*#N6FHyar%@sqahw{s({u-~y{3!XVm-=hYddmxGg zkaj~)1fLX|i!y*0EKVr4dzgU5+oVn+6VaB%;`s-{?~1Mxo&SqBY-ZNT!z-9r*ySc+ ztVL(W(6UFbcmL)Epan&UG$2Xa=_AG46<)&{2&w3`pW46mYu4eg5n+#kQ)m`N1z(B< z32KydMO2N~10eF<>z{|1Aqjq(cEtP^0+5yak};YyF~dwlQexG2C6SMoxje?Esv3mE zP$srkgr3=7)ii!1nkYhTyWH9kx@X0MYOBvFq4q6lz1sMRccu7BqkNN>D zQv20axuooPr$Fu$mt-uPnpH(s{h2wB2$$-@8V+gvH*=gl zF|LGhts9F5HbmV{C_nzj{y@$*ekWPVH&z)B=Yw*B%jzhDI9lV_s z-9{GW%WM364-!2_H(R3|mfg+8Ho_1Azdo5UBm^DW%tYppktC(^RvOyCF}qetIYFj~ z+th^R5G=ep6Ux%u8*}@uoYI7^!vUHlxQAgO)IVAHJ>R0$QIkY6^;F$yKW326~$OvtJ5)>=Ja+&2ec}#i$Seb zAjI#bSz?g_h7Bx#8E*bgTU%_Ty)mUw%x8PiL;TO1{_YYDSQr*?$9=7E6dQx@; zaiD#Oz2i{c!v1F=Cs3&VPb4yI%?Lln2L6~(`Yah;_VbF4v94g$W%eUnUrUQ5mIyQP zJvz(ef`O0>a%Mqg*%m%xW0LtS@W9-PUR87)qlAeNNl7d{#G>k>e+I|&IhNQ5F)aE& zq*c_G-s;!=DIh794 zmj=u=i8x+~qOx<)#TAFHllBp(0Sp}PEKhWqhRSZN5e^I9PP!>w+UU%N(P$y-rR-k- zN~8k#G!+(jmyUC)5gb!fta`^Q5O4^SHZV=YeIXPbQ)E%^&bD*1+zGeKMeXr!GC1rG zOt9G>N{ctKs3bbKkYqiBIQ6{ue-HlRD4{K_9CQ&$j&R~^qH8p=tLLX*v?C=V36jXl z#NlE_n1&@<{FnEj7;PUR`8J#6=y0;~Fd-fT_9wEO<;d_permvx+(5muY-AfC22*gf z&G!ka_Tr_Cw8RKcO{3-p5e$x$>(mV@b}~Voi`oFF9|Fj~QT@Oayas~$&Gvp4VVDqO zg5Ge}VcP!x$t`lPhVYPjGnmMvL6VY3UBdde_Qa1`*DyD!G)bgt7ypn#j`DxSwl)T4_2E(NC7!dRc_i=S6#%hcz1dG;K***;t>4 zx0@nH1iMw^L$t5{!cP}g)U2&-?G^nGmP_0@au$lXMFbIoV#IBCUGir({u9@>^&Ar& zl@XcJH64mK)+#IIivSxdsc@YDt3*MA=EHP68F z4hCFvu<2H7Es>E?GJ$?uTUxT(qG`5iV@}KvR{pj2!i`>_&Jj~n2oPJ`dEkLRM6V3t zxGAcGAa=UrJtM6xLO9Vw9p9mvw=-kKicoXl`cGAa613~5z#c@&0FwV5kf*y{z2Jjv z<{NY=Cb`zq?RM*GaE{p|cIMDL3fO{QVp9W441~=vxGrX3RY?(%$1dOYfV#mW*M)q3 zqYv}w!^12kYmgdX)Q1vRFlsMOfC3ONB=p1fMF))g5*hxO2LE7O#2cb%$lqNcGcG_- zLt`|nq`*dTD|(=zgchN-lSpR){Xq|DKnN}c-OR>@Hgud9v{U!NkvdtBquxLAvww`P4d^-M}9 z!0(0o)kDG`6%viBjQm@8DbdZ$TQK71w9($>!-})~OEDC#+RVTT#?zfH2dF@(5EC}p zM|ao=Fxe<9Hn#k6G_ZxptUH!BYRr&4Du0KveOdw!7d&vX=oqm+lrc+0@$Uwr_L*+{ z0Pxq6G_KmEVxQc`2;NID!%$NO5d4xDA5Vu7k9t<+sV0~ZGi3rivqx#SYTJ!t5i-AAko@9w zN~02QfpX;OzjIz4OF3G6xcSG7reQcX{(twBc*4mra@0 z=hwdX6q&-r<(QDJTQCi_-J${)V1lqecnl6m8uM`w-j_+$0_q3f+d0DKfZ}fro_?cz zYn165ZhOCVtLc4a5ErS=Mq#F~sE=UwWxbuMq25UeYvnP@0Lp}0niH28awH*n)*kE( zyB}tS`QPGOL1cSTLR@6x{NR}Z4d5aKS4+7QB~x+Ex>E8JqBoja2A(-20Cmr1^K{t0 zQ)lk#7;91xBF>oTkD_784mv!MTh~n)l0PEMoh>~0%-68LGE&@Qmhxw|1zM}ZBT5iAXKuDlxNlI3;?x&cSrq$B}1f%?E&5-}!*%bjCjt(sj@$;&s5#~Fbld`}? z4&?p%Y$a}Wfz<{oty6fH30FIsj%3YYGj)7rgIHF~^Yb(SM%en^HM$Ewa&RGW-50^* zZe7ZEEWvFE03?M@Y+6Oy*2kWgBXs9j{|Vd<(e8BosBm>tRThuHuqS~z%XTh6{n>Lv z1>m<3=|T~ROb)*i(TRfo%r>bFdGR!1!bygmwYcY+X$s7&ZxHIPOg=HW3F6;$cYN$K zWL3P+y*ZTus^8cqvdfPc?bl-Vv|n}d`rpvquo)9IYujVx?(7f_47~3w?;uAt34|)L ziBvE{UJCHsRhx2;^PPwPyaWHt0ZeBG%7BsHA6TY`A~*DoZ)C}SJlu)XU)9E~8|n>6%;c__;qz5iDT|-inJv>QDWlMw zBO>rMVihS6BYDB^XZ8?DQE;$$CBHpX#VT=+pc_DExHnmN%xKt96y|IyiCibkJ`*{e zU(mgGq#Y$JN=rd%3rW@(i)o~h87~C$k!FOW9tLcACL|4b>5&4hhs)I6EE1+59O=L* zXDvpmNxK@1C8?4pIA0y_osq020N~|wQ~9^;PqC|1Auc~flI|f5Hv#Zht3SXUMOXJe6XRCscEf zR$w6SCtg(TB$|!Ax3h97dc6(oXxbShS#A90;8m4;w4GqqsdRg`H@a{7kMAWP{K2yU z1+UpI;VcLnbz}jV&HwjyVoAS!;Jh**?DUgT$VwJL1U~2snTgo zKYD;8c86R)deLt22Vt2a08KRGw5U3aBpL!!ObB?0P$?#X*)^fDs9hW?Ykx|&boMz6 z=1qxO-(7wyczRWc{D47)RIEH5Mo9!7swxtpw6hwJXDg+vpH+K#JyV+9gLbN2| zI*+nCq~)#D9cbPO5wA3Mj&Or?MrG-4G;q8TPd|7h)cXeiWVKWzX67OkNH&X^rJX+2 zFPna`(A}$p{^l=-P$2JupfE zn<~m<@jKXZnSu=YkSr8Q;J4E*2I7ta84g|ZX}QDze@z)nMm3r1h$ZG_g@zejy}=eC zBv9`L#C{;n0oK~k@1ne11Ex9zo!B|l6X;Gawi=~g^{xh-#=oqSq%wM*4n|IRX-X0< zMN9rigSTLAcf+ikxGc=pdC{UKpoM86zezOz-BS_#>y@&o^C#c)!GuP=Ol9yYuW%pA zvvp8Y&NAjN*FuYH>yr33S1;a#a&Bd* z0CI$f7V+G2APpEvB@A%b=o0(-BZJEK1RZXrL=3d*Sp^1T>WVj`U_KH-u|v0M`tkva zr;zZw%MD?Tgj#i^We*rJflV&86hZaI;V2+&6=~Hjbx@fU7|#Fs{B^yXv+em|2z0>2 z=-x(cBmIjJUvoxBA{%EG;*0(PZb#_Y{o3NatS@tDexE*^Lx-eA`ne zgTO?2c3ef?nz%|LWD52yNwkoD1^vlBm#K3{gPKzmJ*0l}D5^^0(vOdZUQIqElQUn4s-7T-G`^wh=l(UrAC@vZAeJy<@;@ zDq$v7!$ExHV#)$<93;wm7~15%OKqbrQM-gKTn_v-5J^8@hjdd1alRFMBl8l*a`lso zh8zX?(mQQbCSl@DEq#XD>7lGltxXkYZ8@BOBbkvM8U=w?b2+)|3=jw2;&5_zQyz6Q zlH^{N47DMhA^Vf$Hqp!6c;>*7&IH~SGp$`P#|v_zU;t53CmG4G7=gn&Bj4WwF2dLx zumWW}q@uj2EK1`oEgR(s?NkRKGoFnT{O6JHirh^03$md08mSuIQ#0E9N&JR9`FKYv zm>k;4ALv!qVJ7IyJama*&;aEkmeIN!coNqQ&1 zqn2fb=k4mBZX9dhB=Q>qb2-oX-5;-*%JL&9=|abTr1X5C4Q>#qairpLRR8I!nbWQC zx{Mr(DL}k2oE8#z>Kl10apm^K(lVw`JI-OsO?1iRjWOkxmsk|+Tb~bA8ByiCW=K&u z22~PgZu^Car0I&ce)Pxrv_@B1Z(D#@wU9k>YL#gqIvCgzCzSoS(PCCifpsB_QD)}( z_(ju7WtTRJmCYb*Q-58YAB`#d*im&^rDc+d;Ky0fpjzm$=O$Q>0)td?Mk zJFL|%c~AlErN(aiSuUlF);!aa)5-E42aaibX;ec9?gXJ>Su1vr$~0b~qMXl49Sqj- z8j57L0hSzSd!oy^YG!3b>1j97ll2|hB8SRE3qecD-;8+!V2EHF#iEvdJ3n}En-IX6 zyAB}D$|*N4%~qXE*d;1_NNgC(M@_WpW#XysDd$~E*&63cK#G(U=d=88X-*rZ%!YZj z*NE7bs#Nlfwq4GH(?{7nkH&BLRGGcKNZht$rZ7<3{kjh_?Brgq-pqO)EXw-4?%DG|=Pik}0V~a8iathS!L7cD}G1kEP5cdy>v3>q9qI`s;bm$nX$w ztyyxu$%5#0(A39ctBjbaRgg92F?PGc$@CtW)5kY;V*M(N%uf_4j7ll zTVw-EpD@7B&@=_p6)m$P5zqUup<1+AX|mTgv;k6&p*@+-lFDwia#^CmRSj;U8taP5 zX_HN=TZ;d}tPX{u2%II@P2ka#9z;22-B=TsV6A&kbuuqit+}+cGxr$a$nx<(CKJhr z-{R9LL9Cg#wCo3ur9CO%a;K}!$)_%a&ae(2`$< z5T%2s**edVZ56t}q=|#gvt|`=_o&G5i0xRKhLZnnx}x##ZQ|ld~`UeDT>X zIxQYK}n)Oy$fq&(-)Bn$LK(EZp1-ZiqIZlRf-smwy^oB4&d__A_1!>3V|e-nvlx}VjNg}a=TS8oD_n8!ymQPpqXaUVkma33+j`QSouv^En=I8fBxMS zfy+57QAtjo1UlKea{J)VG?`AA?epHx2nb1TgaIT=*%F+0h2;uLS9p z$HSg^UWW5#WhlF;jN<9~N>5N*??C`Hp`mhKl4l zals^n6B^Hs%HQ6%D9f{!fAb<`c+bQ60N=-3y;e-eT}g(bfkvC*>r;s#prfVjYIzU$3&friA0@5oapw&|G=>7 z_nI`gcPR*b9DfyyP7F`v$YQ^MO@%)#CjkvV1;EDOhRQy~qLju3^@Zcjzg+`QhCwqW z0TOJgsOQK~L1C(9Fol6x6!FN!1@44|v{;^n`~j8_ItjK71;>d6b;kv-%28f`=`kPJq!9~&(&h!{ zqt@jKkX?PHRFBsC#{~}B zf1&)3;sxc21&4wza)4oe#|1op=%eH8qCL0;VCduN7B2bSec1M9!5t;(s2*^}%Ekqm zO(uUqk^#mAis>zS97PF!p#cD7@%kA<>EwRYetp4<1vifRx*Pnq0OWk+K%fCtGaypD zT|>3u_YLXr`7&@7rP6O=!;nbBqHl$yLSaCjp+lY!o)oL88J(s;4snn#k$I+V6 zQ_(HaGtnc_$82qr`i@$ZBhVDk;geL2oM~pA5vgZ#XNtm{_4iOP5YX=TuzU3P7l~2+ zh&}3v*6sJxzqn*Q@%Kvh_bU_iW9Y-k!>GfE!wBpM@#%uEYJl!{M;ui&%VEue?AY0O$?S4MA7{ zLqtVJM@UIaOifNuQBqS>R##bKEFda9FE$8f00?aW2xI^NF*WBNz2<>^ad@{XM;+97otOO({xm4< zNg5%^Q(2&*fI|XG%|?%k0*?fQ3M)MoB|H)s6&5;_lz3!dRCohtfjyG)U$m#O#diQZ z)zUK629ULzi9eGe5ldoN9Or`Dar*1D4lsaf+Fa>4lrj<8q22)%N_!&&(W-PB{LnSt zI15C>r+Ui?DveM20RLm?F~kyctg)X`_~{YST?cJqLNH#XsuV;?tc3W?4xS@otF2`$ z)`7reUVTtRV^rYAS0Uzo=WwCXu09={n-MfwWitZd-N&G)rgp0k)^)*2DDZ|63Q4KF z%E32jVn}Hb!lm1X9r_3EGL~VKdW{jT79p}nUC-ziyLJ)c- zJGb*IKm(-;W!Icb)G8yLwJKN07G)rvEOi1|JM2Zw7DpVFulo@0E@wj%4X+Qs`;q#5 ziJtDeD5Pg^Y`pnVRaQs`W^Z?glR==W_ZnH8n5HxIQ1b_m!I*Z%ug)suwO!bYG6&wE zsx9#V;di2zXQ*QW#d2`M4y>JJM6X!_lQQh>?r04mlpVxgzH>+hvi`0F_K%|5MA=8e z_`dB)k_XMk4S*fQM>4R=)<)1X@V%M2P8ern_!ih~9& z2~pslYyyz~fq)_mF|0UH{n6+T!LWk#7!p7q^U$FR z9mHd|bh|b}Nb+b=Xf}^u>kWh^!vFGR|j^&{&+t^c{*@$rkEPaFjNGi5?|_m-K! z?^FX-0iRM~)<9w#5O&A-e1w_5)DOw%eBxB<))?tpjH&hmtov*7h`q zm;W*&wF^`mB&0Y3OC! z>RE&nfqt*tUYH{5B)vJ2;$19saJ|vVU#fE{g+WI}Tl=ASU}d-NSyad^ZL_BCTXqn( z+$WtycgJZpJBY7$I;J6pvOxG>mJrLaq7^ue%`X`spX1Z95EB0AJ1kTKm)CyRQ`5C- zmc|pph#H*PFE@xqd>sG-Pdfpu$osNyRdDUw6iF0GDLy&-*6M2Hh191?E1M1__pOP$ z1E5w^Fhw)>t@O^my(`cmWbfM&LdEO8B@w-$>?|9UeLEuT!>FL#w<7NLEwqBL3TjZ8 z+P707?As7ZeC%5gNGHC1TXWgBQcZMZsGyG$u8lGf(>enLi#7}_Dp7Ss%o$R0glZ*N zYBoLf3M{cFY;|(<6pNZR3@onam+I1ntfm?cY+&BlumP!u5wu!mAP1B5H5!wa8*)If zfoa3W1_Isfu?uKtRHxd8;malHyqHR^%?_#GpHfb zQ;h)up)m#-V@MH^lPD4oVv?A}AVY{4LxKq?5D6rZPy!LrloTZCiW@qx#{MUmZP0mw zeA0xdVka+d=rfswQ~UyogxgC8BBQ7t!*{|`hzq80U=nE;=gA$So6k#U(8U1- zqQH_UgW(OePfIX<+_Dtp zjxQ@~Ime1SB}mR8_@_?Y$uZQPk{nlfuNCAhS1y#>^6Fi`rmH2_N;l&ix2nX?PYicj zM8THR$EVju)c!PJna?VX9<0blo=pA9MVun6f5_atFvK;c?+u3u9_#* zpkn;^ylbo}1GV0Z1N%|@FBz+D)jOBfG*nRmahG+F7*ACP^c^UXw7ZH5U#izgB#o2s2cNBb(|DoVbhG>J8zu2Y^j_6U*Ta979Qp#i9!kGk|3E)b3X>{M++ zJw@w?**u`;gxy?ZHfW+gfKjqS9*0~D(Q~oKg5}al7OKtpdL~jHz@}=u_iVq0Bb^|V zu*vc47lmNm2&reQiCU?`cY3)(3w}OE?6h_J#)7rzBPHT@}n}L8fm~Mg2gH0mjZ54PmJcxn=pV^q| zD%4{+#rC18d$<>vt!Er7oC*{T+RVgjPx-TJk4tC)AT3?XsVwJOPEjLbGh;1j05ij} zQ+UGxS{qLY2k8`=r$>|bFcY8|mS7>LUD4%%xAzv8b6~^5DZ_ZK znvwDE^<5pRpsIo&xjr8T=>uy1$`Cvo0A`_radj6yfx3dD-*Qypw07p^}4D#&5Q3?*f0j7oHM}!5^Mlu z0A2vOD$Aqpc<}nw@#W}nSX!xQgW|YGcxU*^s4>PU8W>&+P|A)Zi?F783|6Q}u>k66 zruK_sriDsI=-0{oZNmLB#SF#3wk!!4+ph?iC9U5O^ksYjkwhsZqAv=%-w!sX-&%t2 zH|fa5$fYPt?gRGbp*vQ=K)qQ!oD1Nv&>=Sglf1i|%?(W4x(9dygzf;PZy4?dFs_*Q ztLw6fnJ2Zqal-AYaNQ}El8a)YNYHvxozyUqVab%pj94NT5+MkAWdeaCDMH-*x6+gL{LZ+1H{kK8mP?in(?Wjq|6?vDAiZkU`)PR)&g49@yl6jX*k zH_)!1KqA%8om%?|cCqm4Cryc;o_Vf_T;J2(1PF;}?;mu$r@WS**LVYb@gdzlP`0{H zShB~dYyzup6S<`fN;lhB<4O9EtkiuZdMI1$Ez%C25zb|DV;r~z$E$Omz)02!kk zk&+aok`7_7HqgLiDkvM%@Nw)}mH*AF&qF4Ecrla2zL9EbCVe#V+niq?Gke-h&>exF zw`{rkUDRR54iC)UCA#NWytpo{k28)O#xl=7wgcw2WK0dLT#m(9QY4_CV%B#Z9-P3L zoOy9s|5=65;>(DxKg8}gZ&{)PBgqWq6vOL~J82hrnQoYBL+&zMHIPyy6YIELn!&MzDeVEYC8$N|`Wa$omLu96ROoDm;)O zv{_GsI4FfNM}W>_2Ar*LwuT(ba3cM%LY!@aZyjOIdXIyA3w5T^))RL4)@3l`uzkx{ zjhk11Lo;xiOsd*&2@iBO`@*$eUNcKggez`f3J>QAALKys!wjz^h8!HdZzIeztS7@; zp^TvzTXxgLDMwDLOB+w{ZV>OSk+j6D_W>zoN7NBEZ79Xsw)<<4>j{-ekc)k z4f7Qz!#00t6kU8Mlw9;sD@j#qs0Z{zi&U&zssj~nJ`{)11_wD0tpR5}v;bSadn(i{ zWJ!RZz_$ani5&bV64KEe(?^}jtHBZbPv32X8~?e)?!~l!X3+N78HeNi6A8=p&m-?m z8);#@NZs{M4A!Dp_fHGv=s$_tDw_VMkof(luGaraL4N$F8|xFWFrWJO&m24ZCy@6? zE&OK>w)W2*ylHR!vj#i;lSbdrA^x*~UatOA##{Vn47{k0#rZ#9xm_FQe}j2EPuUz^ zo25x$zenLTZ4|uqcQpDI5+{%}5jTHFg2m;c--S35L=J@di^&+db)?+`oF(&M?|{ce zbYQXI9BTP@F?Xx)VPfQ5b<@9Jy*Lng{eDAi^}8)A-91`Y)c*dZw&AURr^2T$P+>kn zH7fmng&xKxyvX0J#8v1L^5pMSSf|$Zd(*m{wSHexneyB3L0Q#BsO{fF$bU9GyDtc= ztXKX1L9DcU0_$17J7JS*pzZ;V|BfX5T`2dvk<9!(iFzc+{k@1CS;=S+E19h^$uUG@ z-dpOPe^CD5`Y`O_n5E2Gb!c-ihG8O=Uyw(k7u#5CVO3aZHw9Rh*$Fr-?a+;4LJ@_k zFeb!#!kK4Oh@5&&#in4BYzlG;ZwV+R_+*$A>j3|`NHZk$sO!k-NIv>)P-T?&Y$d!T zIUeuG3wA2965+ZaHv~E4ID{S|+!1#`U6D{OWE9E?#e%AWbU`^lI*{_G=ITCJxExm% z0TKcx1VRXC?cG|nw)WQIIB@qEdw4yn52g>>2YkbC!yE3FySY4FJZcYS4`mNyj~ovq zkCw;GRST> z+O^8Es6S1U1AnSq#bA;B^l5nesgYRA$%OW&yPNq_oo)PS&<+3eje`C3w%Tp{(;3wI zQyTRB(;8TQsgQlC5l_FDUOlZZ1v9rV%|e3KOGkLA5gqu_DKVzyOMkptOZHMc0vB5b zwTKI4)+Z(Bqgq_3i8l+Z3iFH8K@_4N%_1j1Duqkky^o$C!tA41)UA&WZ>Nt^3E>v9 zx<>K<+)B@2xnlbTCJN>SgF6bnB)j0Ky0*N=VgkS!jfN4X1OWEJdfoPS_bI(gbI3g^ z+o5#V{*2}JJ+|w*J&RmwZ{qA%@NRmyLbq2D?@Zc0Mb<9GZBKLK+M&4j99|+{0%tid zUrGd%$dRy8&dwZ@Qd&kbNHW2!n3(#DZspRzL__Pvrt8AKpikvf%Bka&Z)z=S6^F$l zEx8t5R1iwHf3T9^}8~ulTDqv1%eil8=~2aJ-D)4eSkY zOo&W!G^jOz`Fci3Bb||L3D=T1gZBbf$onJb-keMV84%fz_5ou%>%sCt#B=1a+)>AI=SrnW}?IZenK3C`T=KSF5f%#}}E>Dg}#`0)E z1&9d5HkdW=1CBJwlnhLwN*n25?m1jRnOB6Gzx$?K^!fku5QQl0}%SDA#F`Pm8iyhuB|Ku2~I0Dpq`1i_#;WdjB1#|NmUrbhV& zpya1U^OjE(p&=|=03k!WO%TlLr%I?OZL#sW(ang4hK3By01UZk`YD_fx@cUVDNABa zXKRW9UO_QO(AgYQ%aUTnq+(`i7%VALCdGl3QpKc384E3xmF6G4t8H96Fj0(EmogL7 z0Vj+TviF4R$(>a1pzYjtY&*1CUDGKbOdvVK-8kBy$>the2N2OvqVZa5Gmbh-1G;XI zE}|~n7Q-^lGWd`ysu{(M;)+^@PE0tZm=id@`P3zBj=s^fp$CM`s59aO*Q&X{0kg^l z3X@c#kr@#YNumdng&-gd1A$;55C{YU0b~degoYpxf)F4Gf*=TlPz(fuv{ppvlK&~% z0!pRAv}P4;I~pG2PNB*IE3#VU%YqfzwyH^u^&bOQhJh5IpjH1E=rUQY z+P|KM4MM_%3OX7td)M^02QrOPAeSb=oo1_T(cOp`W!A+DfBV! zLu5hoW82LKe!dM0Gsckzl-0zs(Bg>lw1|o*?sIkD9ijf)8KN3o-uY+Jor0|h&kz+J zdEuoqg55~;V|5<;7^He`cxX{ye0KYn#?P#D8Y@9f+2ql#4p$o@;$95>1JIX2 z`#6q>Z9MK!RS%&QkUhjNHuCNr)_^t(MZESKl(t0&-J@V$)hWvl-Ppyq)0WR3$doD{ zI$pKEkyb}@kgp4K_e6{kYb~sJsDym$KJS30qpKv-OiAxxCow8dT!)KFyRN?N(BbM2 zZhh85VRMSuVQ_G@Lcm`veIN;~`2#gD(B_78C7YoN8hbIqHU+CLge%iUg@dO0-I(5t0{A);U*OC2sL!Xa7S!_jNn4T1wat*;B8Jn zS#DC~QaDSE9^XhN-3Q|GRUC6Hvt6>6UyNI9Tr9TVw+8tmoM2pQBRTJ zfw#MVUD%-tXG3=Hd;V+a*@&#ZD;zwW*}pdJST8o$`{E9DkbT_IxUG(QAbzuy4bg`p zXm8x%5!Xf77@>xvri%Lxg)Q9ue%Z0eYu0Y|jeqh_klsBN&xbR4LapJ|^pK5;D)pD5 zQT1nEl|9euj}x4o1&U<=t`^T6eXM6)@|-*Hi$bgMb2BcFuN=kOf3v4Wf%e~*9p=Sj zHgK7i`Hg>bJ(k9g0kCbi`~B{8e`nwBxWmP2clsZBjm*2__!TYYz8bT@IDdR|p7mZs zn_Ayo*kt4t zqTLk>7A~*fEzg+0^N4D@-)>vx@2AVWR;}NknHxWCm^+{s`7r?hfxdPvdO$BHn|o@r z00-TFUz5)4ldQ-Ul`xa)@Ar_FimC`rT%A5+jcH-SvO}lAHGSX{kSFXU#ruu}h7aA> zjWnEpn7C>CTF-Zm6-Ik-9nOK}pY$EQ&92)#yjZ&bc06mgb#S?8-~F<~g`>;&Z`b{8 zv1+O1`Y-GDujkECADwSsIck5&7&Dq5FWEQm-`6+q^y>Qlj;Z+AghL0NpPzT4#RpjS z8129E!5LZbXl3=ba>pk{+z;p4IJxjc_nNc&CeX(2_-fwNrLQiPv^u6(%DC~pR%48{ zm%j=y_?JZvFYB^468ICRNtNrfG3N-%r)QYG-~1uAw2U>BjZof|@j|S;G=!A>&4n9V zgTA6%61MMoN+w0{Hp!dNhC}71A2fORqpriWa*wy`iEuxdb|udn1gx$cKNXSbRm#E= zD=s|lbv)Oh`*{s}Ydl&B+xXQE)P|~_a{mP93=bpyW9&uSsbR$swywk$)dlI{uw`?e z?ka?J4kmA+5hJpvEicM@OSamH{(On`zKuo}uVsU21A%|EC{$A%W(t>cAlQ+0NlS!RZ+|ZG(y3J?o^~nX^x2W&yeR!=_ zw4Jla98j2XawZ@Py= zF*EhzvR*pWNHRS~K)!opDBTULWW~hnM31ktjDPmg_kVlWZLNae_@#MwUg(o|I+|8{ zS@;}u4Dgv;TdUko)H(1pt4sq;#zwJ3O~YT>>j{iywT+e6pz;+kqQ}g01>RGleWu?~ zBy(`osk%|yvzux)Lq~WQ<6MgU`<|mz<}r~@vSK(Ht_%+@8)w?y6Cd0Qq9&W{4!FW` zsOsD`TJkbEhNOg;PRLQAd9k>`WgWc(Dh{JRHWWhpG2^KVpXl*-%)ET0jrLMO81lDi z(+zZC0g4uFL_`n}gSk2ak7dr=`}L^kpq6HlkDYCHtXmaHTogUC1R;vXn}O!cJP?j( z+Urog*|%H?C@S=hQe|)6>1Cmt1KGBpNf|i=CImDDWFKt*>iEWcLq$YVni55JQ%H*z zaLI5YQ64EWc9C`rtGy9pZkrp1hzvtS#$r}?Ah@s;hRp;WG+W`}88TAk<(UW7ZfR40 zhUoO5Sy&_$)wxAl#o{9&mb@%IGXW{EUo%z%d^YH?q&hNqTIHq4V4gSA6e`Tz;4_ZU zoTiONkgoD*+Hx!GR)S=C872locTpYBP}LY665Z2f8idhI+iO=l^|mH-@dgl@I~%Z^ z;9^?7D40wHiC>X_$WG08KtV^P=b}gX^p-l33rK=vTg@>$%k9ltYpAfFytB!999dpQ zSJr9l3vNk91A7Xs?^QMQ+v_L`%L>+Kf9HWFrB;bkyNC0);sK#`l!q?vz`)cB4K5^{ zFVs6hel+l)jd7|~*`fSd(R1DJ{$|-=wd^QDb8bjt70W_xiyD|k3B zv>t(v#W9jR8u|PZVIvZt3a{Nq24FU7 z64Hgmbj`_}C(I6BC&^p9`1o;!CyM9YT?gn`Ptd0zwg8+vc2TEfJVTRwyfG4wB@%-r?+g{K_+{XHcC}K7 zUd^1z$u8299;Y&6iWk4xky7T2h>LW09Ub=T`TG-xCD`L)e z&mH`>LL-D1OCE7CdV8OQ7rWnBj`#ya@J34dcJ=ZMx9;i0946$mVhOy@rBZoJuG?(% zH!Enr!bL8Wn`y7BOnz*zp6+YI$bG988<5xP8~sE|ks4!UC|Rg~DnI>_zHwd9*fEtPPs^ zAJv0ta}~GkT3XqREGz(9S}3fhz+R*-mq%+ut+7Ef|D*ak2!7fy)Ai~)ShbB!nhg}? za*yKz8W>NQERHaqdN6B8x_fHJ1UhagAc5+BSgc!Q5cM=x6rE(Ts2RA%!B~?8ZxV^( zJ}H;;SUv+fdPngW%i4x9purF9QhlV&5;^YgR<^!iTV;^SdMvp zJ+)96&$5q&5x7PnOZ|euxmJMU8j0+Uhp3*hBlGxR%?LF!Rl;`SCk&Mc;rg@2O7}HJ z?sy2!i`WwhDC+q#$^&h1zQzN7zIh*9y=v3ioO`2^I3i{?J#*7!V`OF{CXUjYJI%T2 zV%hR6004#VL)}rGCd53D~Qb1#TFot zUsg!10GSbzj{2EUcs9NCqhhgsHOI{H{04I!=A+&$Czmq1t_a#f5%}R;GNG)PIew~F z>_eTgfzAX)Fbp$#qU=Lco{V0Y^1*Z-5Q-rRTNign<8ZzTFg&^z^D%;Q;Xh_LY6=;E zkKXvwt{%E=eSB^Zk-=5n8#sTC1i)`3qF?r-A0TfiBpM;t>L51?0ytp#BmD_?oH%P5 ztQ0`Kq&6A821rNCh@vDOnlT3?y9#C-t$|9Av0C1Ucn#8BOOqcOLDsnnq2)Rx+qxM8 z=k;pVaHPAG$UyWL-4|#8=ZV%&F<1WQsnB^UCmY|=YN0Q?`QRbG0=>PrLF?~ZBF(b0 zU$!m=1Aa;{J{^7gHLBDU8l`JE!HeZ>Hy;us==>ME(*C<6=a5NAMJAkbV{f4V_yAXR zu-V@|Z;oJ(M>rYkuA%#?rQ$}wk-a@Oc0rWP(z(;7;7ETIlJj9zwUQiHBRJ0+7hTM@ zE`Ud7PtMl-)Bq$I=Ole!|-eKf(C= zGO7f1UxBeAgQaYFsK6f}npvK!0?mSouB!|a)Wv>ACDLXQ(CVDW9P1^(wd3QbMrXbg z{1dv9U|Vx*V*0AC@JAJR33H1!V(A~gcaD^;5CrJ&>*z<=X)AiL8a3;5(c)jP?R#gY zNo~y~{z?u?_aHy?I}C25;h#=?C8g6eFfbl+ri+b)xb}2*J&I6%NZxLcvAo1w$dIiJ zEKAV-fb0%$6zkTCn_3@n+*LCIUfn%vD+Q<1Kp{GL+tbhs)A8Gup^HCo zp>coW&VH_`<DccUM$9-0}kByI>K$hzXp*BL>QX~&Xx)7jqg@<*^o9LvTXKvgF#C0+@{%CFlJumethEBL9ej*LM48n`e+H$4s!wi5 z%>Fn^x&v|uR5NtoFF)Ki;(XPGFix|h*3s6J&qk*C+5@BHzz@Gz=2gEw%Vo_7BCrG! zyWCSq(3k2^hDx6=(aAzdTNAo0Ue&aNoIIG-_K|3uYbh*&+~_JTO$4P0vBd?rg8sg3 zWY&lu$drWWaZ@4<*{-I;PacY3d_%#rB3}P0@)X&aa?=1wxNvYECP*Vm7X(GrYg;;e zaSqfq}8g%i*J7&fzD;JQ*i))B%(=yps$a4!)7k9k+|`pMt5RNj4`0 z=J<;N>5Go{2%{1o2~p(Xb+z%UgJzs)>(IDuTI%i^ zSOP`w%kB%HfktOe?qeh;|0Q;lnhAc9oR9j}C`MpGYw4VS%hpJ7B}J%ch zbs-tf_}k!5Mu7w~r$4e2UaC=`yOTbn3k&F3%^ybL)NIy|O)N9TY$$^edY&4WT}!n^ z4`&{#mMt#sjqU6dM|cjyot?#nZ#VWY${0BH*$jqlin%(kuQ5K+F?t+^w@UO@PK_-I z8c8niqpPlb+*U~u+fU=7Z{%`uXe+v^Mys_B%A;?e)u|q5E%FUc`KS#GVTE`UC}A_M zcZ(^W3ByfGx8h}(02$!}5S-lyFJq_Av6BOWW4oNELnOOJ&cj#_C&%jhcWQNEvc<&Q z5SEDM0XV>%2m4btgC=m8IxmKu(_uXkr_K4ttm9Z9PWdr8(EX4R%XB{-grs_gaEL0; zaOabmsL%SJa|L`wz}^vxQ{R@A(Gr&2!VOlJbaGv%?=$v5_xG$w_Z*32MM+I|ZVP}~ z`aK~~+qs~Y>%w0SQa_6fTI$W{5YWaUQ1>19I{2#$JWM(6a1BF=zHQ#c0L_sLk;dYr zr3Xei4q|hc!lH1RJM5M}5;_?HqoZ{ke$kd}iAg4e&n!_4I{7I>5vre>>O?})dFEZ~ z$5K8S$orA=IRtd+uef<=Al<1ra=|opoy<5`n%IqXeG_{X9|Zf@jPrvN?kdKd8eojM z46x^px&U_Uvr1Y{-m#S3F&n^FjXNtMcT#Rq6gIvvw5j3O?T2ta#7-!MjJ;hIpl)3b z0OqVNG(utcGiQeL(w)b`f_VOLQ;!n*CRF5}9N0C=@KN6{3fm+`BQ8RE8>Y{Y#ZuG9 z3JjAk(0~*kz)Huj#A1@FTrvpI+M$!?{0w>R1Y{hK4IY4G>H~5Qk1pH{JS@RdH_lET zfUAQ{LoZLY@tEsuB)@uO%6h=CzdX(*=$@$#ex#Vb2grz;aYm!ak#i9APLdvL(KA4TT~}6y-30fFptl1|Jj& zON_OVFwioUVgzUd07L)?Kpu*K0-P#htP_CgwG}d>fWh1Am1vBH8#T1_zK3D3)Omc$ zav5e7W?0ricT|^`{SX%MI|3g1t@^NQNin;a9!o$0B7xj~5>Wc(W5J*f?=>=|ZsDHt z8g^payQiW6rvF6d((SwNDaJdLsm(FK^Z_e?gz<;o-iZUwg`(@|lGsgf8$ViwZG?}1 zs?z*-fYUOte{8+lTZ{EH+aOT|IO$+E>`1dNtEO#nuzO0(%iSys1y|mzgy*g9P=~@Km1+n2>qO zl0%d5AYs4)sXiOkGIh@)=ok|UGiOBNU3%1B!-ZF&?Y;6Fp23mu=f?X5uh26iVn9fJ z&s`q$!lFs9wu884 zP$!*5Hf3|*GSIM82rffC?@UXU;4%&@SoqY?*td+^Oe3HJ1wG6vino++DwMWUaG7jf zqQVxaLErZN0o(hZ;4%eD<2LjHcBH)lCGrKS44rM{tSCKHR-#xvexq5->&>thP6{L& z4O1TEUI}eSfr&!EvcreWj>`bx`gn)m$QT}iQQ)emW#cs!V1<=MKD!67>N0B>Y} zWT&I8h)5STgV(Y^M(9S7(&t&GQJ%iyXu!% zmI`Vmm>AqYWk|}lRY6gn90_<9M@J#-oCu4#GWnfJaBEVV+{j(=y$$+EM{77>;d}Zx z>>$m~el@@wWPF4@^wiMAw@>y3l`}pNd`NxL@U}slv@7A1YpS_;>({g(aAh5E6VkF^ zBC%t~yLo=8+Q(9UxI?SX1=>P)wB8gTH+Cppy3HdjV)6wWaU&wdgp zZ<<#G6K#o^d*rchiP;A+lYU-2R=Vo?xg)kp;x1JrK?ql~#7lYDx5`I&TH(K`E@34t zf01mC`^1VLBH1mG9%f+f>2Z(o5bkuMu{)q@MYZ0OF)I$$4kh-^Oq<` z4rRVo4yu?ELK6bEcMbv-Pa_3ng_xX5<%?yzQpCUDA$_GVKJ{ZbL%8lAc?PuyjlS2! zRbEXf18~xt2_mGG2T+w02`rxg9=}A^hL5~vJ!<&9TG_wUSLVZ?=%}&F84WH8H`An^ zO8V;;6Z?|{-~k?H=J*08r(=l`U!F(N%{k61q^=LFVt+K4R(uhDws%yzn3&s;QG(2#M<;jhQ8f8 zPNHxlA@0_L5YJG6y5B3^R$FAg<9<54Blyk9U~z8sh9aI$N~Np`tx0Nj^T;UN^`Tq_ z{LNaan{}f(1B25{PBegJEmmOlEC#z$L`%Jiim3hsa@O2yMzfa9WU8siGrp98c!K*UfPf zwVVAi501fFV;SdlVRs1pR|5<|CsyYi0gmxkg_MOrJv%&H~ zTZg+`d%{<75#Zm?yytmoI+xqM{7GBCn*(@U-(ih~}Q7ZIy$yzzL}?kI9U*8K#`8ZjBZTxN7`S1=mnungAiAV}@^ z1+ofa=?WjscCr1g!ds0S#N_$w;&nX70B4E6Y8Q)*a4`WK%_`s~6fqclEEYI5t@l+H%=e)K$tm=NxHQupwxWy^Yu7rgcVS-ibE+zBDjw{q5Li;xW^e z4C4Vq0+O&9TtF4y%g||2BV{N?MLEeao~aPwiUR_;J64YhvKvSnEWDcM$GY2d#l;gO z1BHq@!agA_^^g>fP!Fy40JS;D@js_{GDwkN!cMd#IVF0aqX*}k$(U8G_#3_g5nzrAasA-6~V0gh59gg|}}utqRwxa~h-JrQfEH!Uauk$jeV>zK8( zpbc4B-+U?>NSQo$@nkL}X z{Z!1jpctS5ZW8vhN>vCjb;sBBmlNx~LbxLl#GC3O=J<|OJo8*1ZpCZ;{WBh9M`Bb2 zf<&wiVN75>OFqfmX|eudIY=i>!;3lz#fbmbgTP=pK1PvT!1_SFx<$l762WR}@PfgI zkls8Sm2w+XTENJs{z5mLDX0Y+pnIs3yp4^3?0iqr-^q6^wh3c`LZ4{FvE(HAZtF`G z#mUm0N=Q=gQngQ32P^vN#1|h2Gu$~2d=i!9P&c4iB379&-WX^fn<>5;;_QV6mG?T^ zfP=GSWBYp!IBZpurk2KXL<@BY`+GXYRs>m`v@y2zn50_HF$sFvbho?{90ZU$a%T#J z@JTTzN1-LUh=`9)bgZa19W%+}D1pzpM>(n8NAJr~1BT?R6R)|eEh=aq{bpACa8M0{ zpHrzzcaap{^b_ccrBafl)^c>YI=m@W?`R4WDtX`@47~L#H~xiNFCE*NS{S8K4yK<9R`>AG1i zS2dDlL^yv{H&!wT}64N`{6!#UqQqh&9Sa#6G1@eplOX$V)*H4(1T zIB5ZkywAK8-Z{ZH-iZNz)3P(pdit#vM=u3k@R5qQP7SZBnyRlP^(JW?Ai58pe_?^i z*6;x6z$LJg1%Z5l4#y0#Ue5vfgJCWM4XjwQW_0vsMuMohdk-Iqw?cQsJuFi0`BvCy z{x~rHuuZ??=hXYSH{HEk#!52~k*3&L$|MH8(jX^yjUZJMB;L4fa5byYNSi-8$%gR5 zyyZmTXcShcjY3O2OZm#d;_IgPEd4g@@v#-=6O0Vx^EQ8SSx05%e!xA)dgwF}zG$yK zdeXiU{FK;n8v4aFLx~9}+G}NefPD$oDc$;S_9>~-?rS%##JRZ%tvcd5AT@uRJmRdD z{Ul(4%Ry_JPx;|dObApHWzF3U9MMlk{Yq^Ue))6%QQ-QP*?2rM)m-H(SNT9Z$0Z7Q zB(bR*_bNjRYOAjkH*5wi3FEts9AueE#e4>AVr*Rn`W((%>W9Vnx3=h8?d`$RVj>^V zkY+7uF|*!TJ1C6R-DP&4n|vz1RwdQbpn1{^`#btoG>Zy-y>>Uzjfi!2#OWp$@v!1s zi0^jCA`9z_S{coVqhub3RmRIWvKQ{4GJE&y$iA?U8`#=a{gmOnJ9c ze1Wnj!m$SAsGRoW^VE2?x2o2kWz_;8$y9Z@p0VQ<3Ng!olHULw*+s_`e?`9AlLQ8^ z%V~cMf<A&Fh((EgtfBGU+s`#=M?Pg_$-PAOH5nf)Sx+!2Q#>~IwzcS0 z4?3ylJfdVhF~p+3X@Su8cIpd^lw?Fn3#<_(b%GkU9J_|MBqTRA>K-HdDsM#@=mRmF zZVn72RebUIzr7MLRCwOG!G&dOalOe&DE_iz`pS6WfA2RwISuD^aRN)yJ^Yk^VZrNr zaM>yLXXK%Fbi>T0hOfIS8>n0CQN)~5loPfZ+zKGt0(umV7TTL;`e2_Z1qNK^J9;ap zeDz+oo5t4u>*dQT?ee_n)b|<>?34jshzL;L6urkx?413@Q7+yiqE-8C!v{i!V38sh zY@J5)xsWV|mN9o2pK&Y6-2;#8%*j;&FPM)-Xi1NRqP9e$k_IW3#V$>#@iYQpGSZ=< zgvo<{dbbhNc29x?vR3AxM8f1%3>J*bzS*{O`%uH5uMgUo_l}<(iS32)o75}y7&l?T zDJ3xt(iw~gcCY3?bzT+{n-rsA-E+e@d1Z<4NJ8$WL=FR=-pc58?yoH^Ez=yJhx#h! z?-GlHno^kYilRgqJtPXvv8N3O4zqr8p2ED95ml#j*$G|9>zc0mT^w{IJa8ViOa#^# z^sdtGu0lFahg5CVV9QL&8 zF>-RFNa32fDr0HR5<{k#0JwI@jRn&5TUOVd4@p(G%V;3OVGx1f@kS5S+q-pX3&tU& zTGW#0B05f_ z2n7JOR)Hb10K)guHlK-C(uI`+OTPWfyL?swz*Kj1xb}@7s4ylKd=FT8)2-&>ICfQk zlo3XGDJ}weDTzitd7beN6nXf1H`u%DXcQL;LbWcZ>irZmEWW*{7T(#?=!#$nKsbr6LB{0P!c_+AXAj$<5hmqccx1OzU22&=8dioiAnb%Nsu7kL!C>lJ|L#gO zE6?C8dRM_J9qyz>$~$30z}WOAZlYB3u+CY}U?~kp+yP~-7N&0+^zkcR5fjq|-7DK- z_6*wBh!kp2;I^ihPTb>3vQMQqLBiZvdCOawz4K_@!3eDPgZhv0TVW`raoICm{f!_Q z{;hZzh8dH^2IU?id_%x=uxt7HO|No4;dfr_-97J@Jp>P@*Ze=4!Xfx63&7ptR)5V0J`=#R_ed0ZM&+?LM+1|6;-CV~3P9@1L#A)}c!4pU=jD(=T^{L6pR_jsgg*VTrG1b)OzNI+NZ5ypjqJ0_yxazCB~w`y zgRU8n%d%H5Z?E4^sD2fP9>po#4^sH362eOw= zJLK5Qie3pE7aBY!q+}_F2%hE&11~g zYJD5}bn`&?Rb{Fwpx&I0?Fsk(dWMb?KMZeQc|8?9zYyh3kEuUK%tVIhFuN=Fn9Uyu z%u+^Cw2>|B}TQA;lISnTN4v87(nU;-=Mc4?d$L^H7AH{-OP#YT}sw0&@q!*OKAA=jOh6gOBhoRvZ+q{=RZhF zAUYU3J}oqNL-pdGioSf(U-kdE}SbUdz)r+gXR#VrdUw5`J%1LtNOaywigd>f^Y6dQy_Ns`-jK~Cu* zZyJ854}T#UX2|UO6%~F7)l_`jmIlWQZV^eH+%yZYl|^@#%2zTV>2(p->de;bV0u%o zu(TOYIR;=WbxxqBg@Tc~YT&>Li?U;d1>wg9;q^-3ul6dVaD;wXERaA{5N)24D-rsc zU#GmvQ{~kxEYKK9W+2woN62Kifjd+Q{ADQmt(;4X77t634vV&4tz$`$^@XhHy_UK# z*fG~?Zjr6d6(ugqwgKJW%h5VnMVQ+PC5(p)rOtzG*b|)6ek5I7A&;?Z#$GpH+}qo<(;`@9Tv@0I(VU|^PKY-*3dvU)L6kG zjTDhpG?G5WAId2ttl)zzVmz@q{5aN^RcS+p%x<@ktcM@?!>|Kw<9KRwVGr9$FZ>t< zgmj%Rdx;@R(T+VSMw%uvf`4)|Fo*b3`GD!&u5 zy>n@V9Z6-DqM8A{MSnGmg%*NWeLh#|0nv|L6FY)Qx$b*79`HdR=j)r~1r{BnOpw}~R+ zRy`^7#!{7A*z0Ai=k{oRFVwh*n?fYH zC&FXm0NCiYbl)!jd?c`C!oJ~;I7Y+6snjSVW|)R`ReO07+ehAyY_)B{_bpru zk`}?l)@m6HLVm%!HyVFZ_!G4tj7hoIKN?8RTZ9fcm>)=(hax{KKrA1e-s3Qa)%U{w ze9{Pyy$sxH`YXjN8#%t*L$WY)RIS7EYb3 zB+7Z*_Q;&Vmq`QoW4w8Fw) zXq(QEC7Km*Bng#nmFjtbV?Dy6ha<81R%n1r8pl;R5nSb14(ewRm0;mb#nQQMnHn}n z&OjN1Jgr<>g*;4am?v7g(@o1TLitk5n_yQ96aW%XULlwQtssd{g#D5X4Y#m|JnM&;=;loudt{N5s>#E z3Vxh|!u(o9Kz?Cvets=HAitmn0Z>qo^HYFO0}sf{uLjP|t%d{S=85H0!2xn||C=}c zgY2vd7(iBbMtXXBW_o5BG$1Q0EiEIx6aYxig!+;6^in85Mn=kiNGpZ}q^Bn*|G0(V zfYj9gr4kd93&8-%DTzr*1)zYWWQ~OQd{990|433kG$1J-=6?hXkd*i1|1bHu_kaAv zpN}Rc#^M9;0SPf#z<`*n@Bb(nSmz%l7(l9l4T!u_!vds#MS7@V0>08BFaa2V&$I}1 zpFOXzKxH&QXrU4+fci&J0KpG#)vf_ba)^KcHCY6}q6`869uWQH=O0bk?CnkJ;~nhn z=j-k3$_RIXOD{9XUDrMHx9c9`gA)**QA;*!f&K z_}DpIIM_Sbc{^DDq}$lo*}|CF{b(y-Yb#AtPxR(wD_c1$8*6S88!H@RIe|h^W*cLidlL`mN24=D#XIY69yjtGf5jalX*xTx9 zVz7c0gG%i)6Y|?e0Drl9!o1X2%ZSdQ;sBperna4ce7)buvkn8Yf zJhwgnis9;V8RTRPWcBc|Jk(&^iYhi42HHFgQx&#DgJLGo8Y3Du68DCi?di~n>tJ+r zCwsb6(SQicD)UP@e=K6)CN<)(O+!7}5m2Zq$6_wbj+KW=Fk9U-gH0iV z5X!@w-@q+Q?9EYqpHON@{UB9}Nrt}eWrgc>8LlpL|N1%SbqV2p5O@e(5p zE;LOoKE^-ay$<9ueT#a7!&Ld#2j?yQn_$Z7NVRVlPi)(TwLYbNZX?jFRa48>d2?l= zLPMfiN^ACjrIX@IaGD{cFyQ0Zj$7#vM?Us1lltBowrDVaAyJM9L?y zxDj#1@xsXlt3=gL&PuI+Q*TJ-l5!8B8`$Qn>T@~Ik1X8k+; zvsYe0U7;UOnc!RJZB!-N*~(;&VTW}7dq8?}7_ z1x)F(>E&olllBIQq1%iE&BNY{3r@NXG@r@T!1}4?#8$%YS6DM7AToQ_Rn4R&qnFfH zg8n-C734wdvZ?_I3xxVW1`K)K6bkl}$v{n<&`9L}{sz{U{7kT+eW zv&vzP$AhUR8Z|sS)6vu0(=I?zhT(t|Lzf{9 z+Iq+~yq0XUtclaK;amWUVZKoIm1#v(B<{w!L|(W~kOqnN%${FZR$ zSTG6U>rv{?Y5b2GyEJyM$xdkzE*L-#Fa%GxU@!!rM6b}jm+ty`7>}1K!?3%|cRg>g z%kl;9-u)WxGUP|BkJ#kn#ysz)qS1ELbYYkZhsBAyzmg>VqkChbV|6FYcfpWkO0%8N z7+|7}H5Fa0;ObUcKvOBlid$U&dN;2KHs1+OSf&bBzA*XwYd!~V0XZlTaQTm2?`yzA zOe@q|kYH&}p+y(jh=v$0j#Q%K=s0uIcefdUPc)19<-4e!!I){hla4&?Hl>%GTK#D_ z*&L3f``zA~1v{+PUBm_9K1BR8jvJCu7llrYR0P2xK>txvDIoI8pownR?nc=SPWQ(1 zaPWBXn@)d)lyCQoaui?RPkVsP53vl4Ml=s*Z)0#E>qvc8vGywhAArmr0fwU!2Go4OYRK_1ONgRh-vq*dp1Ho2!jQ~TOF3b|E&xMWH`se zA#b-C?+x_MX!{J_Z-SqVHeVo#2ZEwe0Gk6L>>uZ%Q?Vu97IniiCMl&*d z9oo9@Njf6oAo(UFWGx8LqRo=x}&3M5A4ZNEb*qIkgM zSxCX7x>OxW$67y7xB{&}UoZ5nwv(U_(HJ;`Z4RTw9FJzb%HLyFrv<>|*RA5r91+Bn z)lGxSj;Syrj0=kzGnZ5XR^TFtk%G05kw5hI_%otJ3bNQoctB0aa!!)NT=&-nxlU>_ z8`}R52%tJ#GfX#Ol#@qw61suYUB?rFAz*zfi1?3#|9nB3TmeI60ccCZ$xSMC$$#G= zus8vV46+RiG$_N$tS_@wuW4?k){msOAIMLvX)QMzR}>uz9IU`I$$-=NV#HsV5=|H zc-N|Z2yflRcnalgzaJTNWgr1zJzv0udZy@0K!^-P?U6~rlAlPG4gGi=FVq-5+g#d) zq;nx-*XeoFQm6ZM{brWu<3E;9*bcd$VgTE?-OrVDks-vwnC~tsGvy&U>=Bq~i`l~j zM_~${68_|$Bn$4Ngzb5nLp(_}U`!#5z+d!=N1Oh(B=s{D}4|&lN)AdS)P0RwrlCFg^j_*b` z768#Sh6OsDW}wY4gG2cK2U0z*XBSXV+>)~B`rx;wb`(`X!4*N76rLEK$V5e@K=DDCb!=tPU=S zM@F*ZB+Xyoe7DfgkhhgJ&8n7FwpO;8o|u5A9519=CxSB%LI^NMLhl2ZU)q>@3M7%( z3CksPw9gioO0QT`>a*#i&7;kx;`vO}LHv}|Rn#?$)etj{ELL`2Tku=ES%L!lQ2yij zguTG~ZlHS%vY5l{im(e{^P!4i^CAVZq%wKQTKpv}3z9kFC>QM{;dbZtj1Mu9XqC#E zN{=8V2ruu#OXRanl$4#DAI>OHOSKXa&fCbt?9T1!?+_pu|MzV@K7|%d=PZ+yqRAWl z56a2KOmcET=wcKIo#!%zlrF0-8lnGPc@`@%lDe$ENJmMEg0S{+bf&9ub3K*>og|%$ z^D-IFxh9XvcVwJbUu8r-sta-nnl(Cyp;DYHsOC(8P1^x^+G=BS5@r^S)(MMCf%?4= z+vsRJ^6FumKxP6aaj5x+X~WZ%$^1Uqh_N@YG;0jRmWC$=55Pct8tu8atiyoafJ=aX z<&rm7Ut0=m81pJUk3^YS#zgwelxJ+LrH}2K-LC9`Wz~JmSQQrJaQG?l|D9#H;B4E) zB7wmDm20Hi=PMI5x-tFmdDV8|DOKjb%*~rM%}am=ubjTBlYiKQY4;@5J$6!X7!~=o z_+IZLH;fF=MR;9+@mDiRBvvmtsuI)dWg+7AgE#r92;&5`>*EysciVf%*VB&hx3^+L zMN*_i1+OpsUwmGC0^U{C4fwP3q~2x`nCc-;?refElIO)f4~zE_cDTnU4ncOG3z?Ql zb`dAeH0I+nBR;WEY=NRa>L;h?TDiQ~eI!s~<2ohZO#Ya%3Nc?UwsK|a7RiuC&Ar%4 zl@+|ImPvKBxXRV4lnc+6TAjM}tJ#-vOS7}f)}S8STYb0e`t=+lbxIx{nR@1Wslxl` z`{(ETWVg8$^57nJ?Ksm|T#XvlD)9Sb0MHG(zbg)Z*NMUK*qB&VzgSg%*jyaKO&|eN z75;|oiB+ zR5p=j=RR~xYJe)(DL6PYMBqvVhhVo}a;^A%A1;?1q6`gFff)BbMB&JBh!XccOd+cC z5TVE7Fygdx@EDCpm-jwW!))7=a1~?LeS}l;{XR-l!;Ig|Fp%yBX7v3Kt3NHuG5Y&^ zK>_BNfaru6!Q(g~?-`#>=P^+^?pW|;Le96n7<+}PLomEu+FlZ=jOQdc3Cn>=heTJy zg^5SkV@fNL!${&Vm9$s)V^VAP(M0z&t*;x4sj&!H2l$gky#Uy};oS-blMA-z5ZMQS z4q+NRlEuIvjc%vjjU@y6u(#)8)5%m`?92R5f^%E?O>^H#E_=E*F>TC%?H;^aC6I5(iZaSt?X!#B^9?bS()T z4Z%M}4z$eRAlBD#Vi^wvb-Ji$JPwP8YbNjqjw<#_&O^l77U~*6=UNQ9Q3fP3lWhSb zliG-HZoYz&*+?ZOZ*97QkxOl-Ge~R-$z%pgI7o4C2;17rZg207%Vu8#zRqqYa`(Yx zVNK-x8>3V?1Pu~nqJ+2-1B081ZYk-aw@}4mP`DkAHpP+La*EAWFZg(Q1!#FS1`JjG zL6>pjDB;ajIr5sE(aC;v&wwcI|*ri6_uPPhta`P_aNwDnebtEcFMZ^YH)7fgfaw zhS~wdfHOjyBn3B0oH`*63|J#0?IGeI>9YxCJcoi27xwlSTq7fS!pYFFP%{xvQ~w7h z=p-AiNj5YGT3m;?cF_nlAOtj|GijA_`2mm|5OHyr^Tfn>d>DcRVv@AvWG4Fz!%W4; z`hcG!0Z8&vauIT-6q(c%osnBZw}!5D8ycgD6UPp1y0obuBkLy@Eg$WgA}9Y7Led#y zmRGr z!anbHae@nqt>urpX=3s-ar61>W%%&V>vER5O|P!$)7#kFjP>`o4+Zy3etwQdOm415 zbqn9!GBh6YrVM?k!;|eVnUXKbWsW|IntI@ zs~A3%LsaEH>d+lJ3O}N^Hgrbv1)(8vg!&y`4Ccx8&{!P=xPchlsuBM1Vousrj+M%t z_zCllY$7j%m#s>u1%frWlBW{MCuLn??Squ>gJSqyepT8AKbB+Z@=zgjFG@SKjTLpGn}D5AeS zI550V$d;D|$C)*q!QEcKJU^Yp6`Yk0)P1GUiI|;IeUFkzs?tWhq-8T#p|g!3M3**vV|z zl%iDFs3K0!w2&5&TY-`rTXwLVgTG4Zdud~h7@iPH{iA3~iIC4sl}#uqx%SJk-Y%V5 zmw0d_lUo0DVR%!el73vGbp5(Sq>7QGij+7)EO!^Ck*DWZAheXtBZX&a_X7QdF$ZU0 zKH4XA2D=5aRx}VQb^Zu7-T?}hmmBka_Q{%tEBZH{f5NxKosz>$bWB^j6$h`N`44Q< zWwI(~nT*!Cbub+L0!QQ}lH(of&6*#s)3{S$o@`PbzWF}4bb9=kD3`6|DBM6>WC`I? z+ZZIMXhac*g{U*~Wr_-Y7)N_JmQ3!5y@neI;%uWXxS?cMtQ(;xB^zRfB{KU?rg$kn zC8>nDK7K`d-?GDT%r0yx*1AE`#lf1gUVVhy5m$XO!&vf(0Ek%>OB`y+s2&HTo8xqc zX@g{REiPxvM=IGP zb=LADmzw6r&8@B&p+6V=bZS@tC9M_;Bfpd(N?IU@-c zn6KP>pn6%@O#|O*Sw5o{N=5`s1Fhcvr~n1i+!xI>B)w$Obf`G)xz7)KUvK()t0hSh z3lk8U2O>6J(GB*x6l z)P_{SO(b_O_h)F&G_`!6Y(EBGCmYu9(GM`LW7X-TgGKyD=vQ73O&S06C~P{ZcGV!1 z;L3ICpds|s%ytOF=}Hv|VfhFj!+orLFp|5FUL>?z)1b=(i&MG-1FJqK0>9}$=ofn3 z5p1Ss&3Pk7^!Ik5fcx5$-a$rHt@Y}*4C7!`&1VehR31c>zX0S*(KR8C>FJs|6>~gs*yZs39H39(j&OXNbLBs|;- z(dZ-9!tsg}=(}nF!OL9gUMJmbKcVRnnz}sUMapY18x_$A_svM;aeg}zTT*Nwj_)#6 zjr4ukhmfkY)qY$K>Z3-$7^4RE4RXnIKtLPXdTN%FkUeQ~0~5_j z*D+kxMnNow<()S@=>^vGi~}F$$r({1q3Q-v{d9xEl z;FC|{Rb0=Q5|{$`oFh8a8D{>h>ES!7h&%#IU@=H9Fh0H>74!=~O1V9jRkfhKc45wQ zlY&?uyZ%;B8GLY2{OQ;hWO&5S_!*S>LkjFz76DI%UwI|OzVkp1S||?(PLBGVK!A*h z)jh!tJ96FCe{BTlB|wf<%0Y-ZH&a;Jnn0T7O6C<0BlxsyJ7mcED!9p};$4i}FiXtLs&H zA6#?M)p;M&pKjL6eM)_@TUW|ggsO;0VNe3k0;G%&9>@`hAGy;7$ooh1 z#P{YTOL*4(nTH_trxwFmK&`hA;j^oNgx*;&ke5Nq3BFEe3PWo|{^mp;`Nt&MT$Nwn5mb5(ey$_+^#vzYF!osTkZpcVFeG;N=gO> z%L|rK{*=SXDr6VR7xKn*6cYny=2Z@tOPD7o8_~Jskg`f;lud7RaGRZ7FNK#?`(J01 zF)0;DofcPcT3GtKqRX54uOfp3Q!k}^N;FU8hM!aIgWHn=#-fLL9 z>cgx*<-SFq1w@8Had#GF0mU}9Fj0C{ST|Jn)78W5_cy>@gMRh%)gxJh;S9v$aSw!U z%Hvpy*_7w#|GGaI64TY)O`V+Df_VkuOBFwT>x~br0HMX*1zt?nduz~D~ zv{Ji){0exR3|C8#Aockg2<~Nu_SuI)ul5e`HeFu+%v}B~|70+4!C7ZB*Eg~nYHexh zV0Cz6J~p*+Y*N%<)K=-Qln1}Mq5TB|UkeJsL20k~1H}quY|4>DaLER1MQgm&uvAnA zI{5!ZI$6-Pm4dYG=PN6&zlZTTQ?mg-2>HPRi%V2ViDiXyWvXP3V2Nyj>_t;gq`-+K z#e5_YdeIOe9v%@MdJZg>N~2|p){5f3YKxIdO=M+ieqD${ZBN`F8sh{4WWx|1@2(5`~`tPEba$^ zadCzX>fX-HZi~qS12&}UOg2&_GFdmNk&5~$WR%Vmh=57}z!E@pIRT)W1V{)dEiEls zbIgHO<4!KvbIds-V*`VL;`Zzf*An+UyNocv+@KOdPZ42KOG+gtF9%XVD8pe}m$E~u zL?aNgh{iJnfM91zTAM$>{Y+*Hgc^fYO-XSM`R#x!&S*kNbi|O^;c0L@nb@l@4(ea4 zF$7U1gHBFfV?ZMz_9&e>G0p6ky`4E-T*uJCWC0I+PFjJ(t)ru3zsM6gG_2*N?Qdvk z=(t)Rk(>?2DBp&L4L5h5KFY(LZ5OD_RitG{j;DPS~LJKL2gwQ<-$Rny- zB-!kJr;byk%X}W2&@;#sh8i==QNz*6(dGDa9=COgpCzz^!_%%)2n9Ex zhRAt2r?~*9vp}n&^FO28l(wR~DVbob2cO59CQ< zql6Fm@E2Dz&Qsf z@VeF8`g=YjbiBC|s|}};$Y|Xp7m>WtLWE{7W990`AyqnZ<=lq=cceTiu=gIVZq&$} zXWzUu)+Je_pNE$JwsgQ?S}%3c#wPkC8^pp8K=#PD$CkV}NfhJXTHo=ph!zzS2$MGS zBEi6$tJ+K6ZkAQQk1dC{h}34UJF>is9DSRQSRrPf(oL(=)6wzEwzQQ8Rk`_b{M{$| zX&fmMCC|Z24w($6(eQ78#&2-~G8%ZDi+p3yiY4Zjzf{|+Z4QAL#;Ve9X|yK`+~gvz z*zyJs9WXR7h1>_9GR45#YdoGNiRoVTxo(MGJm=}BpQjCa9N33;ifx7^(0SQn|9&}s zoq!Tn@6;BSRDgdZ4+;}H%z~h!xzS&`_M$*@e2+ICwzW7<6PA;jl7c#t<HHcqag zO)kVB^k0q~Dlxi6TSU@gbNN-$@cCT)UKV0`$tBb!yF7C$p=5@Zi8<|ZXX&~SM{#je?X1Jc@W`>it2qQ+q zVoS`uyYH-IACD~TN3$p1w9cSE3ft18ug3i#-ObLHvPGOnC}!eE>^gP3wrrr|o*uCeiweO?r?z!j1fku-92 zoks(K^MP~lOCY>wlDeTvNh>Ms9{v_olZ+F=?cv+Yt- zx8zruvHor?f9Drc9k2xj|s4XQLq^vX{1GB%Ftw z(?mN1TQxI^I)o`oz3!vK<0rq90NW${@M4fWks)%{VCmP=eLH;6#p23b97T%5HBy~b zy9%cZra|6eTTE_++VH`zvGYOof8~>o4WwZ>x0K+nTt(ScyyCU+(}-}N8d<=>$;#cl z79K;U+g@IS{i@kTyw2^5UU7jvJ51%}-iwqu&vQhuiRnG}M6!QGYrqkwJYapG5j$1k zCfFkvR)8^ojdbS>0ZY%UU@Zm~T5)08&zx|qGXqZg3zorP&Kv3eSMnzE^$ ze9klKGbezg&t$E9I3?pKT+h|Rq?&W%;uA6f!ncJUU(ya!J`bI+&-@*O1#!n{ujDIG zPLLvU>G~B&3-B<5Niti^j0#3A4T81#bBXBCsgmrv!jPn-)+CqBb$j5z(S!vntoBrm zw!S;Fc*{Di8-rlD7_zA-^m{Uiq-0`2eut(z){g$BL4fD6w;ZbtGOrv=h%6w+hP!auJ?8BHanQW&>Z?3{$Za8OHA z<2+#0Ln{G}c@XnEk#ww%MlsWw7*Rdd%fkq>^Ib-nFB%(2G~Z2Pp1}$}$oT#+__J;# zV@!c9(WYV8h1 zk&u3Wqw`K)}ByhV;z-H-3Loh7<_)-(1y%X(dL~)z!7Np-{xKEJ}MhU|qzW zo*a%uQPfaMTuII-lu&srQiWge8J31U2m^){1F<VilPrn^vkG2y>Xor!cwW? zXPO@jE=9=di4sAskeMXhYBz7{ldOv}z){1o26p}+Au$4Ae@+P-Nf%T&#Z%AV6f+B% zc`!^tJX#t8Z&CXm3NqEqXfTc06t+T~U=+hV%UP`ot|9F@scuZ$r#^PV^*g(MiAQMK z^z5SHX_n_{8x%yaC?t3}+ft5|5-AH9X)D<#V=+OoKWrexjokOu!wm&LfU%lL`fo$q zKW4}hwy~z@;F#v|E~fCmG(Ep^N5!D%9MIL|dQ1>AFaRVd{MpY+0!4A2nnSYt*p{TTKEDUy%ZG0iN!cV)@FpJYRsh%UI22CkNET`mV8MyB+)pD{pcGEeOZwBwN zqr=Za0Wab`#>-YC{fTB9;@k&HpMNfMFK|#dR zd`DwqaIhkpr{D%kG!~lqMwxe$fAf%JevuYow;30o$6WOv9nF{h;#>n}7h$&c)Iu4E zAx-iRUYU*`_Ak`YX>gN&|~?KzG_gPT$4C7cjL zOYGgF50%^z)wFRlQ`Qs@yd2h)-ojfTZ z(kxPv3zH#!Kn9VT0uHg7NDPsjln@tB2$7Ib5Q`5HANLv^gBXSf5i1rQ6&e{C5P}O4 z(-`>>9KjZu9ue*o5fQGaND85#pdc?VAB+U?Dcj{m0D%vI2Z0NL0}+J{;p>MDfdzpH zfdPRI5$aZ9L*}L=Phy1vfdX;k>f(~*?1BXGA32-?QU7z!U4|Vsr2l{LPtQioM*!+D znI&$U)@Z4%)XWfyFwUwKhYjA#C8!%*>UF=F-<#$|u*bMFk{BMBPEeMOvh}w|4`#4Z z(OTmL;S^X`;}*PNs^1eRlp}YL<|XS6o($B?76bg$kz+-(9bS<7ewZU8%Qj zMLsu$SWiJ?9*7N!3j$Oq0SS4J1=__m0{QR%z<1mqyRB~m|BQ6Rdq^OpX~b&%vj^Nn zXb?siVu61^g?9FUqDWr|pbf5ICZJBiKky>*r~L)K7}aLoL_S@A45bg1fF8g;ea zp?)fnk<@l4)oTY9#ONkWJ~7;%nH;n$6PWZu;u>sU!}bw-SZH_GsTN1T9)Y%iR)LyU zrn7c9$E}Sa7}GKmrnOE5oN_;E&hyg?+oMz?)goD%ld`F?MJPmw)kS`(s|45A_x3CN zO7~M^!-#si+aBIiHZ~c%oPp|&Y!Wxu5t*O7{OL(NPl1@um`dM&tslvnZ$M7@7 zySVQeMSa zF~2ylP}v+YqgF8#@A%=OUNI>i%Y6k1f;vVL9?948D6uT>Ot0s$A`6;pRAXLG>7_2Q z8^V{{CCcJmAFj~lE;)<;t~kYKo-ON!m1_164?S0|R_MiU@FV1hNe__}AQV6sq9_A7 zLfu8L1!+j?9;pyclvPbsR|zo^MvhS)kv8I@$^8;Oz*OM>C`S(UWpe)cmHA^F-d(DO z`aB)p*SO*PW|waT!u&>#?yqDKxUTDm@Spdu4&CR2@SpP)Razz8DwH5n7?OFCb&}nZ zJyUh3(53LCNbiX4D>-N#Y?>p;QK9qFyx8a2i9GS|J>=%B2)%V_f<5u`4&JC?`_zte z#=Q|@vR>sX3$VkWeSjb>_vhe#haEbpG*h3>V0_3ceG#{@S9mAq{LA1z%MO=VW)BNf=deyjQr@Q6>cg{QOiSbo?EI!M1Ro(P|sOHQa|478o2@{`8jg@FC)^QGX9V_{%*M1qPlJXVtOp(cP61eV1MCbJtX$sYt zOJ?hq$Srrz*}R(7O&fs|$zx56!igq->$pA2$oPIR-`IR!ZMIH< zz_22#(?4BKK z=^imy0oVvft?{j8pEw?3fTW$P#<6L;`O7AX<$q|RZeaSs%7=a$AMjZ@TlL<%2z zB4un7JN`G~H~>jx61@E7Bn^XTyz&VKgobu74MFzrI$vVxbw)F4x>gZ>x7NZ3(0Ahd zGCUhAQ~q=t|8#e*F4?oZf*!EMwH>EYrz-uL&$gsA-QPQfYJVR{(scb21rcFkfl86s zne=TIF;NP(%Z#A$Ko&+2Z*(?)_p82&0*jWiF2BMkOh#?P0f5qhCJKZdrPT3=K5{Yf zfpCEsfUY`gtI8T{ajK6z2EgvVdjDU3_Sy;k_aM$a`-#E+Z{GZ53fQ)}=&b#a6@NNN z7>ev^!r2^*1(2B>9tnu^Cz%^t0K&;CE6YpGO-)VZgTjlKod6a4?}6@)32qv|nUItK z3Louck|Iq6_Ov~P%YT>PPm^yJB25zw19jEOzymkyvZ0MCqM)LplHxSWX*Qt_*XXHFa;-3S{S#7SC6NI%xX zoIKMiGh<0Sxy~{ixB@|{gp8~JUWG4c^?8kD$qe>Xc7txLA?5&iX7PTH@&@Dx!uCA$ zb{}@OA8vadZf5{1I{>G>plPw$ewvlz2!5^`5`mywxpW%F>xm5tLkMe9{mmYo0T##7 zN)b3476=t#+OVIrAG#l{AF)4ybs#iBay8~6F5#kg?&&N3zvaTh$-kMCfB*b@C;hp8 zWWQ(9Z?tE^FZxG#f26*v2U(Dt96Xx(g$ zvN^i?au4$fYikJ$^9~LDp_l8=Qtb!MKXCfNS^Z&sPyI&ya(#CYY(47XS8tcUpP%2I zfBLfj;g|p2!PkG>{~}wyH8}Zs=XU?gza$1;c>GgL<0aaE8Yd#df`O`zE7pdRv6=F&3NJQUL^N@9l$Q zXs1l$*`Rg}Y!p?g(3OlC>HLqN%*;)-qb zZT~8vtMo^smknC9F3+Su5LoH$-DT|b?ST2~y$GXcjj z0Z**UtP8A*tg{*cj6e+Z^%wWs_J>Z|Pl_p*Hc~V~HQhJP_Od0<=zPT}HUjcwf(KahpqO{9P{ zEVj{kz%C&r==?B8VU%J8;4LarNj_z!d7oJ6cBc9wDpMlhCFYwUV|X(FEt|c=0smu| zr!|rAVe;uUz~`wYYlg)a*!Q?UgTmkn{Mn~b-@!q24h!8BD&3wTW2M0lLxr)|(HvpF ziSUHmsb9G>{TAu6P<)5Avnz@jlIzOhK{EvoMgmeso68By@yo%>LCYb^M$LxIM&Je) z$hgl;Nf%6~N|#TgNJ~#oOZ81HO8HEDOuS5-kK@av$t2E1{J#KIK&ro*#f#6GSDE{Y zn3$&`1*U|sk}HyJfD?oDfd7tnjyQnRjZ|dvdi;ofh0=y(NT0@2BlF;UO&Hk5WfLU9gKeAj zGb(i>0q;=1k%ZJYB}ylhPDxLt6js%loC%|16{RE2AaFd2XRNwNM#b<^GzC*7l4YFR zM!^E8Z`G#QnHr!5HdSe8pg0#wCR#ydD-^9#P++Jwbr^WnMe9^V!NfsjD8Z@2G}7n* zvHw6V$Nruow9R!<9LN1vWx4866<08&IUtrqOPZzvAWJ)nqu)s%I&_s|)*RMn)lb#K)FRXh z)PvK`GmbOBGITR$GcPmlGAPjP&)v_d&u`BB&66&N%?Qoy%%K$p`aK3CFycK1i0D=^ zJTZk81xcdIFN(t!{xIY)FBJt}E>ArMITi(IFP<eQ~7sKUL|7QtM2nM#tbe9$54VSl;CdQ!Q+m(QoFqKjD`Z)Fa_VxM(_4>K= z`rQKt!omQP4wBlD%8{0l2LeFrBkLKBy^LS|7}tC6`kdDd?fL-i`t$7i=Ir|1?E25_ z`Vfn?iqiUN)I9F`BIvE_`oXw#xC#0E_~ZC4>-xa>3hVmy>iRnOY|$v_`Vr{*3$~T^ zzUTU}=OFU4@zSnLe`&d(>hS7xsp-TidC_=x zczwggcVKrDcc|rE)@I~W-H_dW-DllZ-Tuht$aT%b z+@YIHni19)>dg&;>N+COu90<;+hGzd&IN0HpJ?~$-_dbWWvBpw zg0bYlqrmO5lE4_JtA9GMO_Xr2D3epJGkn&qzpa|Pc)ORZN36|Avq)b^Lr4O4yGNr( zO-D6H;&gPiUbU}3>73l0&zyvuDxDOa-<+153}`T$ftyL1@0!_~i+|EBx-D!iR4q=7 z^o-t&jB~u3<&C79N^=;G{*E1UHgjg1kBv^7hjhY@sE*2V9a?6pi;s(EiVuosCQT;y zCEF#MQ&A;3CFLZ|BzjV27?TQQd1P&aAcX7pSHfKbe6{@iM3^k>^=76b%+0t9YP zg>vW?W`EX5v*?WieJHR+#h5@yhWXJQX}0JQX}|ICnVsH~lv#H!wHK zHm^3-O|?zo}VD`+ZkDhMj=DHB2S zKv+KTJ*z#9J-|x^K7C6xOA$-LIwMMWF=j^uI5rwK69i_SHH%_0bOv5e1t-`y(qroJ>W(r=u4haUm9V!Jk9NZ~X z8Gh$g=HeL37?k6Jlc*vXwEgmKK|!*Ai~&+87!aWtgn}4|Vi1I35ClOG1VIplK@bE% z7zQC`n37m_k9HMSK_vNA(*t&tgFyfkdkG+8n$t4AHk*I9zqqhCWYwn7&*u9fXkfDnJ!Bp;MnjL|jRj$Sx$0w>6<#Sa!_(^{%in`Hw=f z2`ZvJ?6!;fsGgU=297H%cgO&Hud)&O>L{V0bT!Wn(bli)0zhs*Et+H&k;Ggg+Nv>3 zw9UED)u8zZDtI|X7d6q00O#-?xzy9sO&}N{AB=?h>b)XKwgfA5;dsa&vU)9tak~U0 zLapi`QRX{Do_(DU9frZzd^A{aH8_ktPIa612;4w*a*G zs@Ub=3;*kQ;Z#NgC=kKa^#}QoMT8jMU>X`hqwI&s2xj!<{kUe{!ZnOt&ia8kl@TfA zw)~t#8DGyo8fl}GEDg2py=e$^G_js@t{djIYkazR$GyMoLm;E9>{S1(R)lazX{3ECYxBy?Q7!|<4mDNqeH zuJE?_>U+0+akWrNv&8yi;6jAb6k-9!f+CY$_g2v&?dng+41%^1Xb+c7TQ`DAs1TaYu^0(?dlY>U z!~GIr^4o+Kex-(+i0`2)xSO>@Sy-H3@Ehso;{WOrT-lAQ($Xpvj#<2>SCq&nz-vqf zS+sAfVorXT1}vBWG{q6&boo%A(fGt31%MA29v~2m59S=I9Q6(34nz*o8wCyX4OR_H z3qA`e3l0my3#kfN3cd-k2|lQx@|31#@Lr@hq64Dhp{b#Zol%`GokR@iK&eFX|%{sp_zM{M+zA?N@z2#T~ zz4N=gi>CNi*|?pg(7VOBwzyQs4OI(OV4ql@V4ql@hMSI?7MmNJJDNk9+nK>vgjr)w8aXiWQ1*irI-Qik^x2iBgGih|GvHh=z#xhf|2ZhZ2Z$ht7vO zhmD8xhAW4ehUJF0h9HJ>hE|3Hg!O|zgByePg4}|uf`)=@f;)m1g8YHYfu@0sfm?w# zfgFMBfX0BVfO~*efINT;faZV9f17`He_Vene+GZ-e!G5_etdpQekOhle&>D0eW87T zeW-pCer0}0ejtAFeK3Jva|D5&a2`Kp0XrUUZis0>Y4~V3Xy<2_XGdo*Hcd5U{bWI8 zS!2#(v0{{BbYkFPGh*;z%V9AtWr|*PUNm1$UJ+i7U1?ofNfd21U-xV{NfKYbNd8>h zThCi&DrE~tYe#QKyhc+goI@PzVMYmCKStYH2wfIg@mSaQ^;2ctQ)L!b@>R=KvsHps zTUA3<5>@L|(^R5VdsJgoGE@sx^Hai8n^S{RQd28a6I0?+yHcZ4a#BlDGg1Ol+fl<& zl2L0>Q&A#O`%vRhzEGV|cu-eR`Cqa*6;d`j1LsfLPt8xjPqR;^PdYmTdQZMx?Kmh= z4pFvEpG`P90}EROHh)fKPWc(686H{@S_Jr6Lrl_H5==`%SbZ`!NgzqQGy@11Wu-`y zNLw!hct2&5Q-D)*Q(;q8Q$tfIQxa1>MIJ@^MBhZjM5{!QL~=w|L_9 zJw`q$K4m*sJE1y#I#@bCIu1JNInX(uIeIx^IWRd3Ir2EcIGi|xI8rz*I21VJH@-Ke zH*_~oH#Ro~H{dqMHkLMVHdr<%HUc*3HMljCHF`BwH8eF3HSRRTHK#R-HEK23G%Gdb zKm>6>g)fgi;XFkyqdPV!KQ}Ws8Y#avG$;xvbtl^`h=C>-D$m>WkMG3qbrkSM$u02mY(03?kgIcOKs0VEaNCzti@CM5Ut_E`kP6jas_65-ev;}zuR0TH$`~=qox&(g&S_C}=0tDRy zzypN?U;{$~9s~OV)&jEvJpwHQM09%q^8fg$0e$`WxBU30{P>3Z_(uEqD#;ni8OeX~ zIOizegYYxvAKt-5rbSOotwg}%M@?@{ZcxPp7UJjj_(a2A_4udcUsYMby8+el_*C)u zeZR{9QQqzH_)XrB@%XRv_;U03Ch+*?@A#JH%jHJe+uf>)v5Lp*_-@$NxMcFUWSqBT z-`2MH;p+Ha_=nZV>-c8lP~$b@8sq=sGCxEayyU#(m*j5Z9^wtLWJ5SRJ0GrO zR;~=~Cfq5j2db0Xkg9R1g{qOM{@NPduW6xI4Wu6AmIKR{{;he#nTHPSKe9x7e zB;A#|j?k-{WYC$LnVSm4x4E#fA;a3Z(6FHxh8QOwdlw)eu9#fFhrch!CC3=Y3&;M( z@y7XOX2?m%EXWba_Q!mbUXl)n}zZ$_B(8C@c01=ub zJi;Nu6T$_;_rdAG+riDj3z0;SO3`z!w8V24Wfw;mNf(2`oULQfBVx_NWWkf~#- zL8(ut|EBJBBmEoz>2tGk>~bV?7qU&Uj*w-e1EKnF+iqN-=C99<1)}zCpl)<-Rc&2v zX>AstJE8WVVXfzigP-Gyot|l)wTr~8@1AXn1)kZRwwrF7^_uIN;hNW)u$rTqwuefK z88{#~!e*mpC6CNyWK50$fGXx>mFoe$$@`jWPO!jl|z*%l?|1XVPth-Wcp!b zV&|FXfahoDK9hKY7V{%uWCLGhoSeNUx`cg?egwPkJH&Xeh%9wkFDf zXLDy|XIE!QXFF#tXCG$~X9H*TX6I(vX3J&?He?@FPIh@{&bkG=>AKCjH#B6$ySKZU zyPLZZQrTtMGh~M|WRWvuRAn}0WHV&;WaMO>a1~aPNs9d%ND}-QDrD{_qFReuv_Asv zV*}D-1HvL?m?2~uQVmi7Qu9&iQQuK`QeskwAYCA2?_%$I!&6K;O!Z7HOc_iHOX^BW zR|7F-Nry24xK)2KB1s5IHbx&tXD-^ zCIY86WSdG8Fl77&d&mYUYy=fI{x$&uWVZlhuQ8J`*DSg$a4n=Pkt~xtOck#!&=pB6 zH!Lh9WDg`{l_-cPdnj%wWGGrFNhdoe=oe5nw<&KI$MXvG-SeO&k0s9z0`f9y7-X;$ zQWNVgT@Y0wsqJFzWbG#H03YcdLkI#x7-V5A14=9dGAsiRECbLhND*Y=2*U^pwuSAe zGcZ8@0VCe~e{^$Dz(61r1_T6yKsXQxgaUz3FccC51wkMf5C#KAF$~9|9Lk}v%r^PB za*f1n;4(#K*2fF>v^RucMU+uWotRHuqOv(Lb1cqT%+u<`y$Iien-ojTqYNiS?Ik8E z5p~XZPB>VkX@)A_cIZ5p>2yMz!$R?V%iJN66=IM<)5s(Ml!}Zt*1l|;gzIi2$#%#{ z+d^eXI!4D3IP8y`+i5pblsJHnMwGqLt;G4^L5c?2%$Y$NGHt3IYZ7~>$0VJkpn5lv zBbs6!7;CC=N5Z9ombEEtN#{|htr%XSHW3v=8WB~!uELz-M*$|}U)zCEaMhGarkpa# zG!x`c51F81m?zu^u%Px#K!%Ir{G_~I@NC@On&y{)V>)^6@P2l%3G{1_-|*^6X3+{3 zS|?Iy&f7F9I$n7x|I+}Z&1>xt3*Q!pga)%to$LX6yj$}Rr{uS-YE@~9+Ocj>EG)Z2 zC3g#Ry^x~C<%~s4#tu59{BdPcMl4|bxJtIMSn@pa?adt30?9ePlRb~(9q%~4d>WeG2O+2_MR#W1czwGbG z#ySqP2yn1~b6uNTD7Yw3bR2V(1b`Y(w}b}E!Fg@GT#yQX)E1pyl$KkPn{sPdwQ6ag zfBFNky*op$76;^BNM1?6cZa-OPosU0WN)eMY0T{)oJcF~-}|UQd#X@2~Y;=N9!SpH%EuO8d-!(*02L>t~XzT z!3u!#3)6%ktt*j4@OhTgH|Pu`4ew(Qt?i?NH=tTshz}Lqz-rYZK2_ibs#S~hQ9&JD zt+vE{CcFUzkbogI8G#l>>lbCT+rB-}o+V6uZnP;5m;1`yPc2vZK$VI=P-Dlf%6QV=iod8=Q%i^!SxJ|XK+1(=NUS$#h%`JR<1dk zsQJG|E9Ku?MCG15YSi_c(~F-eODRjafMY2)z7XW^+{=$qy(FKKE}KVtzF=|&o#k+W zHEKL55cH*>cl!cb8$#txgr1GUSp!13}8V;U74jV8k? zImcikh!r9|0}Nw#c9>LNhPkoxLsmT24LKwKyC%PP5z9`U82!ubJl8nn1?O*hnj~oI zjKd$6(InKVYKM^rk_ULOT}D1gp5TG)82KRcfJe5+$b;kqyc~O#53{00o$A}n=P4<& z7{P)9e=aE=EELUI)6LepR#LgZBWCe(C4^?CL7yh!GU#o>*Jxw z8x`^uAdV%0@=%&8$5|N^SJHC3`u|oT@gC0ppOM#-O`tN18~2J+#-zRbo%`%bpM``> z0G*&Co2DhK)v3OR^l{LV0tRf^n=T2?1X#{E4jE$HAu2Qhn;wjEkVA=paWMipCR@d`F3Wp$>>zt zxO7TIe4NzAsq$eXtoI!My{;I)sGjhDA*6#LksWR|b(gjwc~j@)%ts3JP7_f0{M)lz}6jt`$U= zDbmhfe^do92m-MMXIf;n)U1F@2ZQz0qq3Syb4jlF{UiarWyxaZw@BAD8YBq;s^0uH zM-V8D>%W#L%x@kzn1mTG5+g##HAN>bif{~o0{pC(B=O=^f>f9kL*GT3aCsWs15TdR z6l$ufm}=xnFAZ4?pn;exR}v`$KLbw#Py;`ZBvB3E%fgX(o8lwlaRSmE((m+a+zR^c zE5>q}I0;^y<`RT|;uVxJ+b{+51<&II^YvcbYri)0Iy-2WRW2z)fW_7-m~`8&q{QW1 zf=`$8jFI2MgQm?hIr!q~;83xQ_YgDvMJRKr`@=YYc{w|<5$)Gx7MeEYoa|lXZ4G7? z>jlQkZiOUZ1S%v~QNL+%V;0BEp_>Whj_98T$;WcxP&JO}7GBOc3Av=Y#pi_t+IzM; zcyov$wwzscOF5gtld)LSY#!a0b{1$eJ0XcJ2gR0)i$3yz`ktK-ch#{vcKX%2otL(p zR+USImM6N0e`H>j4Gn;rX0IJ)#OjtAp2}*v{mDKmKvqUI-G;Htt1dM_%n@n&qL@sJ z_u~%$HsccCy}ufy6JP>us2(#BWxEilp?Xfj)QA&@YArHzZ$A&1)ax|Ao7AyVoGiY+ z<8A>@xwM~4al91K<-Ea6+LB`~DXoEWX}O%0lu!9q!s&44E+^C-cQ!+^YR2v9>ZQ2F_Iq0 zJMbJna!#hnUP){FBW(^(cta{efpl4=h<~uEQp`)6i&W*J>XDhu>Ge7E6DvNCw0hRD z%b7g<9ly?a&B_R-JkAOdnK@21GFY5^fekO$5;`^vE}Zi^9lNya#?bv5;-+Ikkm%Sj zb}XD$JL(YA?guJ^HHm)tB!an_&^-N=c)cWnXTf*VP!gU!S~9Z;0!2FEN(?jb>|Dql z%K}3ca?`I~(CIWAvk8AM&X0`ka@NxrNdF7whp=jCeI&(tV)eS$*(n7|Eu(H%c9`LR zy@pF9AT~XG8PgqnVn}!p=T8}b@OvOKf&gw z+Wfq0b2g`GykY^vni6|C_Uia3%uf2I;4kQOsWn4^m<7$z3B*MDeejcU=EE=XZ|E-! zEeV5+3DXHIZkkdsa1;t6fYYRd6?iHf%^Hv>6v}fOjy6zjc*7amU>F(Hq-*NoDB-Y} zQDMW33M0Tz7KpxiJ<%LGN1Ag8?Lx&E5PyD;j#Dm#njv=J4KTHF;7p5#-IfVpR+$ie z*Gu^s_l)bz&%y|bXJhp3#7P3~9CfkM-I=~)7vBpw_Q(W58>}*Ol_ii#2K!7$4j^=Q z!w+PmlkcD(xT1M9(NaQn&eX)D?KHZPii4!r`hbd$qavWYb@<9h6Ew8s(nkBEyBFxY z3|@(YbXUjHPCMKBe~``xeCCb#fh}N`T~O76w8DL zbilKJKvu7v7GK(Rd|PGb73V^4ob4d>T0x0hH9+yDNX1#{rDxzpC$Jf4C_tcpU!{Lk zrtlMfO`_qlZeY`0zpE+g7TwL9>fGR)6E+LPtErk=132OQNE3P1@HMQ6(h6tXB3l8Js?7%kKs=w8dHASFX$6hj2?4&pFmsqsV=t(axt zpqYeVKzFTa^qr!h90PRsitbX0iQHJ^LGw{36~i>0Tn3Ns^-NWO?&9b{-$eyrI1DXhY41T9(n$ma>QD0J^Kz_6gDacLQ|9VG|(T51KMK;Uyf!4HQ`( z@b0@!nS8M~ZQn2jx>IO7^> zin^F+PcoX({m%hkYpt-BYjkD=^_?ZlWHJ|;{R)P-WT@8FMP#=$s90?W?Y0#=Y|lZj zrOn2()5G2rF0vp3jr6W_P7C;|Do^zf|6x}+tIL^p`r_vx)xN@1#7MO|@k|e7UgQC0 z+GvR~*Q>t7z6cYKUVAhoOw_GsqSiPOk>g06K6p0>d`R;>BqVw`{8(jnrZ}!4RR%>u zalHX;CE0|@h;AAppS0ZDNjl9UM)?z4M7IK}TuM`@FkX;sE&>bXSdO*Y8Z@=2`$W5A z^4o7$Q;>YDCzWf&%&YJd*IV%>zV~u<&P)3Z%s5N=FKw;WTIV&}N}B4H7Ytlek@PBo zld5iUP_&b%xBWC412DzYgx-|elt2u(l@$4(W!*}*4vh5Tl zzhGZEi$T2toG-V{m01p?;MnDCx`HLA@bck4R$!%T0>BR(0H_}VOWO#IYR#tSNI$=p zA{bFnM2!C~#EQyFr9=<~CijZ$cx~|z%Wg(|%PLiDj>T}kT?s2(_VOJ0rJcpFsLQt+ zB)HWF!L9#p!`lxhUt5z$UZ_=KC+vBoaX;vINVei4X5xj*{nXN>YZzXdjlGZvNPibZ z_u7DxK0)vVr4#Ms{DK_`N+aPzLQjc5!nl)brTvA=nYurBVsc7tpDHz=xa*;R_aU+{ z%5Pv5fz}FU7VUL?0V5tF9AI7NB@F8~78WIE@a2HcG)Cw7(Ikl~VvAx0ACa`<$=EKs z$4qYU8Zg=?H_I+~A7VU`qvqWzjwU^Gwl{D{Z3r#@&+;vxmV0H~d{i(#Yg)jQK+>k}L zT~4AT<_R$q%?<<06Xk3`vJ1*J6pkDoPw(2X>?CN_u=EQD!3dm7PJ05<(`U@5&YNb* zP*(-*nqA5?=nW3Q*650}<{8^yIRbQQfu((C1x!JdmrAL$*1TU!G<(#`ShmWAz>=P5 zzw!W?CTiKG5EA3b^3*e0dQ^`?s22iV`H1}e!O(d@M~M)@_lN3 z4Hx*b0nq?>)*<)iB&2FkKm1Du<5HneH4*p~Ux~s*E zaAyabM~HNI@01)#@^250tob+rzyA%D{USS9r(Yz2kK=qJ6kc$NF&1Ns%gXXemZP#f z)d7tM2eN?qM?&~u@&C&CN2>mpBNOi#DE}+(UqGZWZoJUwp^+LEHAcfp2_%AMab!8j zUXZmxhW!uYhv&XG@I(IpMUZ!Xn`Z+Xb_5ywUbR2wrHNn~l;nquI*P*jVq!Itmi7<( zkf0=qLm>9U&b14E*uz>B8eh{wYp@1Ldx_(?XGyi(T9z#phk#U7+<3Zib670l!HR+^ zP$k@Nw&tJBOH6QpMM=|+w13w4&p`NSvx<+_BTQ^?Qjf18(ETmY;f-{;{u>gO!?iDAN@7A~FM0bJCXR8OD3A&nYYHP~Y;?`pY%{00< zARp*HVCz9(==ADl4>IavCm;H|1@Vv3AyPObq21~5Vc~4Gz`AeKN<*5AM=38NGd45w zX4bG!5<|l?sh9~PhVz@Q_9Q!OY$2*wD`D)u7&UFk76_!}4|uome*^M?trvkT8ou$Ov5#Nw;mQ#Odhu|=LYbue(n`w32%>521@)oKQl}{}Y4pX^awTxk1 zQXzh~*&U=yH|#yJ)`U%nTy4)cuMokI#qP?Sn~W`9)LfM>aBPhs*!*hr{gVVfp6hT= z#?V@vIW>l_5v>}%Hot4R_vGDNAfX!Ho6oCI)`|A35)zOntdre(@P-_*bB-eGG(>b8+A1tm;<$SpSj^2&0R0;H zSt&iQZ2;|*poZ9t4``PL24nzQXpDeHd?(z%@L)(#8N_Ag??p@o#{G+W@JW0=nbBv) zL*T)~us$(xx_g6u-OJ*s)V1RuI?yF9@Yf^HIo9F6sr?651L&22Pj(6Sdcz&0Q6c(D zJ+PY<24*q9m;HXyi}W|{6iqGaPe^e`7Kt#5$&B%!m6@Q4nLtx#ViM!WWWR&=xZ_A4 zK~J_+1VSjRzQ;Q%q0*B{?fHlsgg;oqw6EMJ-c)kNUaQmkOS~7@H;YJrO5^xmD0vF; zUSMD!&MNPJoe%Qm8fPyHtT4mP5UUexmDOH`4d45W!m$0NSF<*;KuM~Sk=Z8 z5hQ*{&@#0yzJllH30oc??4VVWS?gb@79(n40UqZ%8DW zv+DE)S$ad^Y~rxEL^vLNKq4B zIKrY`Z<~Y&i|SJYxye;zUgfqI)t6L^W)CE4f;hoUPdd*66k#RyG`ZGjc3G1xb*lrR z1##y>@jS;z<4A4^2$Zko)Lpv#k!bJB-!m<{8!q~$m1z#+GCE5tV$Z^8lo`DKdsvuC zN}+imw0W7fnW>cp04)u=-LpYjc{6G%5UD_T+p(#cK*tOmv+T_pfN%WzAAO?X6UfVVL{xq&EQS7)GvH;L3MeAeK}LgiI2$uNRL{g&KhiQs9o4OOzFK>xUCO|Eo( zA>KDFqN5LkBsq6I<-n}Py5D^!0XaN>^{L#$qT05MLdAs%5=gm0O8OCgjD#A0J>4(* z(3`FfnO+S}gG(~yqB1*27G#|qXtOn>3CYofLjk$s6C-Cl^DS1{#koKLsoiwn_A_Xw_i; zNZJVT08F&K!&vU?-5>z_B%uYxN5EovxMd|IjPI@&E7R;L%@eL{YNE7Q6l-QXNaUq9 z`e;2oClH+i%K-|t+o2C1$SQp;9fri`qfFTX>V7>>hK|Dg&6?){_Qld<)YBpjF=?8W zi7n$Yd?7)7O6amemGL`im%R)c$s7(f*}a3k81K&sN$?Y9IUu{k_LIRJv+>=`E)i|3 zZzig`IQLw;d}ndWptr^VTqd&0C>nB4sM4lM-G~N9`IS1)V2MHz7a+xLvj~Ue*9(gb zrE%NAPJ+F&29q3(D__<`IeKyKxtxMfQbXa2tD6=OQ zbq|uhKYrGsTSm5UJae6A7)2v+zd?!wR424U={whR2g<7wqRQS(FluDH(^ir$fYVTD zxRhCtjgSIcPQ@NpCb`!{q+3ShKTM6(xEpf=M0MWbk21$YoDQ#Hy)cC8GF$@p3C5|l z`V=0}7oaR7NGnitt~b?xpvWQH;K=f3%(S=MEM_X&Q_mQiG0RJl)DhosZo46&DmcO` z|KNk&ad*2LjopY2?Q9|CHTa}9LyJUlg3kekBA&2LW8CuFMxJFIc7P$p4o2QnvG7Ft zMJ%#A1_%rzP&Ls(v=5L$Y6w+5#W~QTXQIG~l}i#mHLc)~hy~bCj#{jrp>cwRId}I* z@zv1I&d$WT{n9%FF4TOjx0|lV&Wy>pNX)Y*=?<}7UP&!TEXCh`eE6dtRWEuzJdOif zuD^Fdj~2=!F-M*97?tWSP!Z@1n z;FYmJr-&m7Li2(dhlybf+XkosBU$r(P^(yg921(Y;9{?s_8*|rGr|mZTPbyWKdxc}7zx!ZVx%YuWHdD_b*mDLdaxMC=l6erdp1~HGN?&aYW`r= zj*Pei9dN@{vbuMl#slP-CV4z&DXgC14}HjV?x4an5L(B|i_93shBBrsCGPkUxo>mWV3I}hDWeej2S zQnnl{aBEpYLm!uAnG3{E@tJV9fna3rZhJgoUB@}Ekz>%)@OcLwX`Nb(X5GM~rm;s_ zp~~6X3sZC(>U)oY#ByUK1=JdbHHzQ@urm#_CFu4Up1dth7dtSR%r1B`T?E$@pOqu%*YsO->^_@6XxJApU-K`)hcXaN`{X+(h$cg z7iEsX5vh9eWVVyavzw6wwznU&N;!Gfq>_dT!abmFYF`wYA znC2@GWwrt-%QP_g&LDXzh&&RAL_?J2NGB~~5BbafrhG_0XtQt!Z9ETYWj9IV6wzoC zSn)Isv%@)N00{k_A`duq+yt|ALWB2aVAPS;QR6VX9n3n_-z3k00M5c97^&Rf`?Z_T z&0$hflr;aU=8VUK18--T$ z8{spk8SLm!Rx=|YsHS#+eO^Bk2;-CJ5qs=#50?<~fKBO{v~e9S=G6-uaVA;}#_Gz} zOoty_#Kw9S_E*dJTEtoX%?wT4h-EQPBTXqr6HT&1>fdFW0ce?jx$$~WlVZYUJ26J> zry>-xo$zAP4;+sk08s4Rq()o*|4(l8gs%GP1$mig_##=tDaYlSH)md$v*< zFPQ!0w+d z|6#>Kr3sRI4o%P&I?i{3<3{j1h+ZQgPMTKKskg`4Ev!S7@7)?ObG4#q428C~8b}8r z+O!Z?Zm*Z~PNjJqIQS~|e*^BluDn8eVTb}VC1iMt1pJ4nZ1@F{Ptj0(8oz4=_xQUe z0@u_Qv{Pq@?2e3>U(1G^I$-A!vVq`abYX#EEv`XN%1g0g!MPh{?Ru6laTqf{L3M~c zryD{JvtI5y>!mQEI?7PqVvB5y_bqHAB{H*zBh<(mfX!gE!OH3omb2V0>d;|%#PBC`2eu%ph53YRG|j3-^gmwX>l3A6StCwa#7c^5 zsEUH%yld*{@`_uDo|;X9B_`I5g;U^DYo{oxr){yIYM6zp533@|5ZC6y061xn`|*EZ>+(` zxwjY4;om@kIljclqF_@^pG+pMA|B$;^l+?v&QR?6?Hd{yfsQJIf&S`qnqYs2g8~Zi|kWH$&ovA5tqS(C&8)ZRe^&oI^qMuut2v zq|Dw!r77Cz8^K`GP>jahN|_4tjtUhkwiE3E6eo_am2c_dZi@&uK`;Kx@ggCrkY+kx zCgbanaA5t(Bdjh@#olY+ZY)x;6~De;i1D@W>Wt(Vrj?MN5jr zmbBu4GL|XHu*$xHoYJ%8q{h>;Zf3^p2NQC2i0B@;Bzd4EOy-O#hify9Xk%JjG$e*N z-m7C;jObpIAk!jU)X`MtMvHc>>nyj?IDegO)lF7y6?&%)L`bI99Dy;?n^)wbhRK6( z0VQKL{b}Bz<8YP;XtDg)9!%t%IzUnw{&x7!jnU6u$mNqrJkj4=i~MZLrT@XC<^?)s z0@(Kfb3iTJ8L{0tYqp0k7z2c5Zq)lia$gY$pU81$u+yYDG|?r94A^eBRRc9)H-eKE zZw!^YR$&UmopA7-p%x}z7#JH)B($_Jg**CBAuKBPfEg_kt9eDKv2BB&)AfvOQ=ed% z!xy0*{(o@T?VUA2g=kq4|7!{me(cWm+%YhM??p}iDc2MgP4bHNWYwH0nndge3x;mZ zed;F()L1#}OJ6j2!BIl4TxL)p(Wy zQJo-1)QNe@;Z3rA)P1~g<3@lF<GquHXFtJO;h3ws;k6cN%IiWw3%b-X@gs&wnSN$Vwy^^fjC z!wPH~SMxg5=W8)qVR~&fiX;dcHGZ}`{z%4UMpS)I@E8_Vk>jl0=M=C96Dci1&eW&LeKmT~ zz>MP=7#0}HA8a1+HmJ`^!6|EJQo1IO!?RjfeLJEsr=}6Oe!{Nng{3Et0Ikcj0 zz(gYXC!gSQHqKEeY2jLhsX++W zBZ|#FC@MKAF7~yC0+fjo9TV#ytK}LSG5{>0K~EErsrszAXbfodKE*JHEJbc?WY7hw zTOb>c7U|@PUNjQS%Fwf1c7FaoxK`qL24y7*>fo^Cu-u?}6BS-Q?l~wHxz|$m0ZxZh z49qkvT*Lq>1cg925D-b%0gRSy*AyYBa3Z)B@>5Jeyh?x?>D($!)VaNxh@y&9`yKMP ziVq2`-CW2@m9`cau<>pb0|fm8`~$5$MuDSry z-FkE_glNntj;N2Vq6Re*Bw9+>)3@ta+?F2E{;^GM+duBDTi9J*G8=obh=Ll9eX8U^ zZG(M8$xO|nZB$f)U7|GBN6Q`;eYOv@(TY^pKJ7UrxiwBdBu1OmXr~`C=_WCnYA3o~ zj7qF)-A_un>r-|Jw+$m#Hlkbg$bj30n|>5#ANs5u^|0kW=Nni@PCiUWS#8?(-6zpU zel$Rmgm#+`k)M{M(|Zc_pN8wE$3KfTRUKKyry_l{+N!I$KSu;afq z_!1P$AkUU}t<#N@Imm`Dq4_((mlXZs;7hvr5)1s-1OU9r8eb9`039%CsKWpcm|~tJ z3X(;1OG8dO~cxN$aKVXQ)sjZ$kGG1ll50tLI}v=EN@Sc*QQd@^vYEmmg(9GXvNM$ycY@hl3m+x1GB#di1sZ`eLNcM7 zPmv{*BHW@PB2@7trov>9g;j`!Tfx2H8sH@=L@*mQi#5AnfU!U~Q!$G% z%el~WLGS|oEK;q807pR4O;PviC(X|$}Xn+X4Yp}QNXg0PtRz*Fm6JKvT2){*@_b9~h6D-dsLC6BUkpt!n4G-_yuL5Bd_5;$0TS?Kb=C#YplA3!pjASkw$Lz1)I##cRwqWJLr56JHu6QkE7z1dczVQ8>BJl?tTywhBNBl!i}u zFJft9sb#608;cv+?d?XPw93@N3RfGeu-O!c>FL{I0dIjB7r9f_15v2z)4ns6v+hgF*((6KKl_ zk;CM1OsotV*p$r0r^JCjbyA$5gAtUO$FO6FWCGB+&s>$$F?8j-@EZ6MOj_Oq+m>m; z?63*57M+rr1>7?uSB`2u;$OV3L1D}k4#0@~ig;!)OvJNbg(aAk%uHdI7~woIiW!by zIkXwt$v`uzVuSfqJb?Ie=kq*4{7IvCemb{_jnG7%)y{h1!7+K9VEuCT94{F2>#(z3 z{5QTajy&(7AB-W-yDL7RfE(uqw$|LB*H)CG|7b49KHQWRqwkPgAAGVi9YKYG!Q?+0KpA)7S3W0%zEyQ0j&TyHERiLTs9PtAo+xh1N6k^ zL0*%i)~#$*vKAQwo2G3-20^}KbCL7NiEI~bDl#Sc^ljKqBgg8L1d+7yaQbv+bbQzt z+CFd&b83*)Jot%R)n>PSa(2li+F?5MGYl_NsB_pp5#yb6S-xrW!BEYi&3V^5=y-Jq zbvDgCcL4}_n*^*~fbXnt=DAo){WNDCN!h{=lQiGk<>yl?A2n$f6O2P`qY>&LKdm<*S6I549-8dq*SL$STf6;{hlqa zLsD&Qjt4iP{+x7k0vm>nBN)D9pjUf>fXh1?GibCKCH?@@;MxQ6=kPPSA8-|R)F8lz z_UAz2>OZ&ro-6SV_S`q`*@|oIduDK3aBpyfaLc*x4s|g#|EK$ZQhm^x6pDRkeO6yI z$RG8(?zO_W1>lQLx=L!szHrkt`J->ITDN|;o9@2bNVnmws9W;3)-AV(|ESyR=;oh& zG(`rv>sr=@P7hx+oCW(u*|f9@;~T!HoT6Ul7cFi7SS-_FFGA%4Dv5c`(e`HWuve-I4lvoVV=7Xx)Ece)g~i)D-Res2pa2W(_@buo~gPMPS-0a1U+kpO)F}j-Fd+Pj>ri z;0PKSuGpUu0#`{X1zB1@YW)+C^5eC!9;QHEi6zS2M#@2vUZ&hXm|F-VO_G`~nueIH2eYu>^}F#1&6K67IsA zCm;my0vE3$^Mh2e+FSpt5hGqDidVsKHHBEaI`7)hHJ519_19&}8UW&t#8@*5KvIct z;9=$=L4wYQJ^Qd8TEF7^&r;nMe%T=QMjmCipc0HI5>Xt3DutqNnc8XXajzI86(u}w zIjX}eVN~6#k6(-WYkOQ=+!VN9J>CVBKkZ3i8}8*Cd=6ef?XPtUlJaZw?(w7hWh!9~ z9B*-1C@02Zax7@%n6fc7IFWt;7$k;am4{dw9*#$zZ!4+!Z9yL)d^(|6>>q;CN0JDP$ zE`EJ)m;Hyl?RtHBzsMTJ_*>FS zH$fJFij>Nl1|^-a66S%9I>`gdx(n8jI@y6q{p|o;e{yiHOK^ZxU;CQOR!$E7e(gKJ zDlT0)RmQR_mHz7lQzx({bVMMb8D<7jO4cH+t2MZ`V9igu&nrdRl)$jH@Te zY|1qMBTZZ%xZ)tpA-sBs@Q>`;@9r0C-<6tux5_G=``nd%UO zIl;3(_XLHCqtUy%53yfY3G(|#5b&j{{S3 z4l(fm6_A`n{Qu7?@n>@8{}m?AO=_UTyjew%bAyV27QqpmFb)__8V=GI9K+$lN$Zhj z>4UE%M~^%JPj2jk(Fa>@>kKJ(l`E8mSOhR|XO1zy%d_U6G7$5Z%esvFSk~fWEZYId1$!B7bpgo_V?S7vbixmv4h9gJC8N zKO+w&3@FoQh@9NWUZC%GHP5J@lG5fJJMM1mHW?_>VTeq*or~Dv$b) zb@|kXWG$<$|6>pqgCB(-l1j_Qk8JyqDtcTWoDDwYlc8yUq^nbp4&_Id{m2rWUUXVp zK!5V&Pa>!hQDgTjb&%$4`RBY*%|=pwq_1fH*(u&aeSfCSXFIQ4cR!_y`Mop4uRP-U z?X(-E`EYcv>-hk|hb#D%DxIr}KYwxvY?+8r(Rs_Sv>J`ieLfuU!zn$}PF|l?D{SoF z62=q4JjaLs06i(X>SbSiOSOI%2gvzR@59?GbbHu$ojMO*hZHm$CPL^ctbi}V&n}Y> zm$9#!^&p}p3q=pD+Zpz;bh{ueOd@l6*MB)HdS`)4A+ZJ5M_!APTsk;2tohr2u%kz}$z)9`1eR(hz6aT$gKzOesIDi{Xfp)sU@ z+Az%CSe9WwK7ut8CQjp|)Lj#gvxKEwPd@&TJK-_iD~-ha`kW71r%DU>oN16iOiTVI z{c}dRY^)@qtov~Zmq0#e?x_Y-7D(?rQ_Is!C$h0=ZXSzB`>Bp6s*k=ehr1S?Mv!6u z^1391Qx!jcL)X{woREW9w1Bghd)S*RdKLgHSiU1%1 z0SN*CBxU60!{Nii;o*2d9t=YwQ8*k5;wX$_D1c!Y4#E%)BSFigD}Vq!3_w2g{ZY9F zsA*FN=fU(W+W3zRoqZk3KI5YA0FrTjzpF67FWbKx^1mkWy9$`|j1SIG(j}B0GAL0< z{NZ}LDu&?Auz(VZltb9hm%ZT{a1E?I2>KU1U@G$)QL87Qh;vMcxJNa$6obXv=_FdV z7Ap8Uc8854zX7_6OZY!>4-)0x)FRA3Sxzr`v1}8h0#cNk^U*T62?!?zNihZ5H2-|N zK84yZ(~+pW-j`VR@wLrLV_cNKDDM^5?Gjc2{uKLm#Vc<#33%2eJ*@n)BJC0)MCq8q zUr3E`CQ+T@bseN>-9+7d=>^d{Z>dP;K#pP#`d#=OkfO@GK}@Z()$$317(`1a0S#l` z!M=v)CQo|&r}?m$rj1B;BKu)WHatdBGcsw)jyVASR9>I#;wWpHE;oX_SgMM9_}9($ za}sUtSPGDqF^3`ulgxh1>nx?3B(_F353~-+poxIEfa6WE{7I1EADe@8gJl}36x_cX zg21?hU#0*{+0@0v2u87Oj|+K)M&9r&TEoG4ekC6gYL z*!&hM4SE0q*^c!4{U{A4Oqm%xRU>|s=05C^jK>Hzgls%F-B==_ov62H` z(A`Kq9e>*dt{|Aa5gnDl0FfRtP zyc70yTM8hN2084yu$!psQAyZFhRY}|e5l?n4Jto9rLg1699#M{o$JxH{?LQ5VkpVJ zN^{2@S#a02sfxz2U!wtpDU8XKV)*8CSgCmRkGjk$F9!heL)^+&GUS!x1)#;+8PEd@ zX*K_iEsh}t^)psispQ!LZvy2Ak(7A(eZ?5!hHjSSl5vQOIwo!n zf(~f{1rjME`{*iTrc;F#rx55J^6qNbB{<~pM;mT6 z3zQayrsP}oKD^&>cP#m$rabDU6`TTbN4xsoguMmI^s8128h;PJN({&w2tbq){M12mH0Zag zXp>!XA8f#f@}ja$e9p~KJI_N%|JG5`Gg#_BdudR|ljs=Ee@iZ3HSq-$nTfdSL?Y*E zDfj&U<;9seK*&7E>PMB8iT-G62hI{%Y0%s%a?2H_ysE~27yW9XL9BKoWSLb{!kt`eFPxLi^N0^ zupB%o$28?vDr~e{NDS42ZCQWkM|8Gw!Z&H|kC;H(JykKh<$m8h4e_1iE*Ah@Lj1 z#y)`buL*mv7pYNi4KEla*vXZy2yqg)dfMNQSTNk2n6E}})4<-O;Hk_~LMDtf(%nTE ziWcK%OfsGl#|T@p#N!K~RLV0=1h_;!e0=;qAWXMi0`*@JxQjn&XCD z{eZgTB5`-XdtP_;_4W&QOnrnpbt@@};PsR!ep32s)-8wTwIS99zIJw)a}=3+rcWp7al8d3m@E8noiOKVHRLd9`iE(I=}k}ijct(M{pGO}sG zV-sRfbQ_>$$3T81fe|U_&^n=HuqRL_|6sKnz@mWG2xE(2tdJb=rL{W*dk}@tUOrr` z^6nvgfB-6yXdqB9mMYExoLO6W2!|u}n5zb4>~rJVOu^B4{u?`H=pViyj~mzgLnyWn zH6)9U%C<0rhD^H;4pxKvCxD3GcZx9qBD6nJ5&L|^o#fA7uU%{j0_Fkj0l#w%83g%* z>%M;~4>+RCH>FgY!wq%khDG0O8i%syz7T`G)%2WJ70gdoNkw zm6ep~IvbNH;FGJ~NKOpM)0L@QZ&Q6ANsX|uoZm&(HAA_nnnRD?M@?kP<&nAfkg+y{ zd<*FT*(H-Ej_)95`v%e))!_6yS*X9?xgtGaX~vT_|BQx#h8-XuD{e?YfL{S8J-+{d zB)^O)kF}7oMNrFwmmMZuu)Zv|u%Oj$EY@oz%iB-R7L2BJ1p6wLd_SzItyc_~5UqCO zIk7DrB(g}B=IP{{vcif3dpu_=i;L%R5k~mXq`UxlNda$Y_52hmfs-}tIYMfZ0N5kL z#jb#WW@>Cm*|4F7^f-dtl8vS{IB-Z+0kv{XP&zyY8vZ@jkATk?FgVzhj7osRww0ubl3L-Kx!sQ@gL0ZCG(UJuQ zj4W2R?7;09!ty1_$`Fi~E@>zz2o?nE!UV^bp&e)rjFA!1kS+;*=@3O63>GaCZg+=1>HRYE@Fa{IhNN+pTxSxSlZ97U{phSDxQJ3%7! zyoAhpKGOD{gG^AftomD|TvCmM>}bHhLD&?|&WASr1yb5(w7*8ZHvbTj zdgTQ@T&ll3%H3ZgamXD0l{x**;Uo4J2fF@^^=yA_WTEosFYMe>ul_=C;{Mj?`TSiV zvwvxryuUME87cxk9tQB3v0Q(9$f(<27)9gX0#2>A{VVpEh>HFaAY%O;fax#K(Cn`O zt<_%uc67BuRP6q8(Y)@mePa6Wzb<3vC7v6gE7ut#1$w7|`M$b*ER4=Et4 zKE%QF;SDq8hcO<{2wN9^G44PXl@ZN1K5>g)*d37pkyyyRb>Ty3ow2bm0;i z*o9-poG90Y7L-;O@)&s+5{W4<96Gfw6x#VN4BFK$l!YMlV0KRsWDh#A^Oa46p)+Tk zDv@+C9uxx1?!h)+fDfMFCHA1L%k04zdG%leO%K-ifcD^+<_8zpMLn26dV7$D2j+t_ z(iOxsDw>>Tm$4k8C;&fVg9EXzlPzoT=pL^ZX6sRO`8`)mpiz@_N={C-v-(SRiG& zz~?H|DX7ezqd4oJPo%afRc#ZyB}yfv$Z`@T)meL{bIwt*0&8E*syd2SLxI$Fp8APj zSLM11)WwoD6R>7=z+QrECCpAj*Hpho!m6icEhp_bx*o#TKE(Q0Yc{m5VX9;Jbr0Au ztZ5h4R&&)YShW+dS4dlhA|F&Ysf~i#>Dp-AX3Axs@qyDM*xC$N^TaOW(>k)fKy??T z&H+~+(@%`%!qezc<9MA^Yb#t`rEMgxp3-Y6KON=QP?lPQ)@BN|lUPwR5w&=&WY$7; zlB29Br$(Y{BUD|)sfV1rHahB=E$s_p{X^>3K9sOkYL~a}G2`;3Z9#2IsdnPRV2oSfwNZbBIKiGZ> zdRu=EAC`UzTG?YeKQ4NRBBgpu`s#EJRRgSa6&toD=D^u!m5F-##vBy88?PDL% zro4OXMhEgSn;upRW#S&&@W$sc4ebm$96j!dVq7dLPp*2LWb)G7(9``WE$2)9z zJr)wN9{Y?>k7dYUKIVC0_AW2Zt#{c$*SxFEwRcJ3!s}gBuAJTNU2UFXyo&}kQ|~I% z0uKuTg(;{LBo>mI^_~H9M-q^vi6mu+L=#9fQuEWA6o@boVhAC`5JHF{gb*Si0z!y@ z7(xgk2sKVRqz|u3ea+@AvkRofs1}uphsa?4ZI@n&RTxe4KRAv zZW9f`uHAC-Jwyz&lutm`|G}_wi=f)0p9%fnoCOz26m+0x-EMC4 z{>74nvH5CF8I>}Lok0y!HLff{h5-{|}e&0qXmAC=IPnHo*lUkZ6HDU?GJ=6^bZ_UZ1nNBTk3~*75 z61L6bd1Jh=K;Jvjb3Ym<;oe{F@!AgPW%ATfF(JOdj)YgS7y6L56P_54=|cqjjJ15* z;sI7X7&AuwgwXh6iIC{X<>5|i3uoc=3FxRk;aD?#VJgbV3C?G%BAe<+&_xRh8T zD3al@fZ5vi8TnYLN`$Tg2FZkYyHKzG8$X7eJJWSkA1fW7-Qw$IirB^K9o9!1@M77H z`Hk5I*+4d1kaR=738Kdt;9VqgX{SOPs8y-6IYTI6>F@doq~-Yqzd$u97E6eL>_)-p z#T`Os?)>7iVo-LKiYJ@a2mzV3@~)OfC!7pXx!8cT3E4b0JV9^~K&yuucy5|zqb&Om zIw8LrlGb{*%GSrl`P_i}_GUJY{bg!2uZ_T_2j?nev2-TEO!m^wZGjgQS1?@FO(~3p zMOHS-`NVBqLo+rKPT{a(IaY|=B>SQfIxK{3KKiT~qp`7E{^pRd2wH#W2-AF-d<2hv zGtK>(U+}FY)GO_(W%hFy)5!$w%pcqCG91zJS(kXe?;T?pj|lNrpUa>^x(!n^3&#F$-oAtlSra z3{4sPl&RZYX1E2fJL{WuttL);HO^@sLWIXb$GCuukI%e5^I* zS?$Zg=LMZiWdkS9!~Z(V%}5-03mj}*UMkiP^~}R?7dwOVg6s|Oh$U)^nX%Q1yi^L^f)|Lu3qz@Td-!77; ze?X?|h>Z{#W7D`EP&FX9m*M$FZL!wAH(^L4{1> zmYowQozR@tL(I(DA7X+7UPt|9u{(DF0d+hb3tA5)(7u%QIDzkZ-a@uQj`7NB<-xk=# zok;=qAzxvD?5q;u`@F!$KX$@hnwL<#DYD2 z21h@72(`B9(8ua}yUb|?8;qtcfDZ{Q6qqqK8J8PjM~R+HkjfiM@~$P?z?1ynnjGe< z8i_-^(Z*(~z&WGg?bfczdb|7kpOx-jIRX~2X}DO1xiH8$Hm!~y$Tl`DxbJ24AvXr7 zvzM`HH1z5}vx`lG1&kJMV$*`0&c`nZA`!3xadEKCWTZ<{;6Irhq~$$Qcm|txEY-%6 zkl!qTwOZMYtPOZlZnXVOqgjOevw725 zDcg1jNsE4)v_A|$f1#{xhPzaA-Kv!_^@a;_mubs8x@NSlD3{6#NhixnUs=`Y z(@G1$){H2K5kYLtTq_Ji@BV~$F>S?NEM&ZI46}8Go%-ce<&F%sHuZ7O-EO&uTUX8VSR;YmNB1 zecIyylCkSwIy@f$256H^pjMf5dbT^cd3M#ack0st>Ocueg;s}@jbT=((ec{GQ=ykf z&-|@DtPIYDT&ymq4A(h~5nCxYQ%MthRU;ug`jdX7UK&1D7DbH$g8+K~djLs&vdOkt zyN1~`t8Q?13)KpCEo18hGGb02K;1TQTecmu8i!qg)&pK0fTnB!K*&z58m87SGi$q? z-J-JighQfl)+;;siG{1A*y((6(-Aj=@OQYGILZ)yQTPcAGbJ&T9t|tcAYQ^@B^Pd4 z%-&vn1PB}Py-OV~;=)AMARdCc0mOG`zd_YLwm!ppob?!zegSq=cndtgQT~*j!tF2g z6OKpbEjGR3qdUvnPRnkh ze$iesHY;o)srF&)BV`vQ+l8=iw*HB=&-t#gts~PiVB_GrLa%QEt0&1F$?UA~tn5Kt z2LelfT)pV~kJypauk3fQt|RF=jP8$!r=jMAK10?NtX)RU@KH-SE=_@LSP5~`Efy&rLF543~)&k4MU*nN6`Ep?5! zhd>=fdk+C`vj?k*q-*kMo2yMlQ1&4wRa2b~QisJsmvd@RZFpkNtOU%fn}N8DqnK~R zvW;5}q*0rV(99r}Tf>Y1mS2Q&OE0hRWYqCb?4MrAJEd=0-}E{a-J8DWk5 zo%v(ZF6HGu3hM9hPNsH)hfl8?1G~@>%U*gu-&$0>r1OyR+ zgdkxE5`-Wjn1LXM3%SiuaI(=B`7O@>&F+(W*ZeA-SOPMx2)yxPl&v&uXgoz7z(lk<(dI{{nH41UurR->J zv(;)11z%|q{$pJg1Kpxg@`x(iUqD3`%3GkWEt0TIpD2-T0Z;oU_(v2|~BdbPn)iH&wFIaGY4R2$2x z*J~QOrlyLZw7hV>rLtYxQ9~F$VmeHHsDf_Mc4-!2T!dYJ%Ii=uA1ZG;#xbs|uzW!F&nuTw z#}eNuSucH$lrxMXl*!L=?9RL&>K)d=py!znX`f&gHPyu`epbu0LgdNN& zU@I&vI4nFYE+BC{aoD1aq(r3zsrxju`zW;g_;j`VNVfaDn78{hx%<#;y8HOM`-Hvw z7{B|}l*#+>Y|8t1d~D47@D30WED@+#%vxAp#B|)1V5*?X{4CD!>ipmd&=J5X;4i>I zR6}rA{r~3y$p{36S^fWt6^R5(aYSvn0Y*kaK}A7GdF%sG0%1W#LP$kI0z*VfLPtbI zM^H>iLP0@EL~}(%Qb9pUM?_Z&LZnVeMMq{yZg@#ZL`h3XOi4vV13g%3O;&6GNSJE< z|4+vS7>WP@oOY~aFnRs|>Kg+C*#l_%PDe;cLm2``b3|@vuNI^$g1W8RuW=B?56~#(v=-H9uYT!<*;fpO4m7qEA&EEV5cqqBBAr!xy`T3({#{ug_UP zf5)iA`H>29#Hb$98LP{C#s3iFFi`imKLB=GwVBgY8aKFle3jOyHmYNf7gAmkIALEF z*4*Y2aX*2NGeD=U`f`zYa<;}y6g*zXQ+7)Cm=BQCRF%H=)N5wkhba|&_Vn+L7cEjM zk6cO8B;MKwDKRqdKTb{U0iAqA7uDUinM@u5slfHa*oQ;9dm*FOMe!gVD;6!-$%~<((qTO9~2CXxr36*#=I&b!=L6Y2HG4awco1WM$ z4KJ=@2b%#9a@12}=CXxoXJo$$t#^O}+dpMLx0j2rgF9G*9jw6~P=lj=mIE&${p-20 z1TD^NVd{o|7$3zr9vncd3RV=k)kjE-1Y$?$_#^Ejo7OP{i}{i8a`{aS_Th9HBcMNE zQhJP`vaEHOj*XWZHrzSnyrje((JAf-W3dD$!Jz|>pkCB)X-G>>zTqnc5&>Mv0Y*kf zM@D4*1VltcRfLd_ocO?%I4qV-SYU*VsMs8rB$7B>V03iwh#Z>ixIB}hq(G?jP^~aT zt}F<%cx<%9ptYp9Jh<@G1edu`bcpQ4yF8fD$h_|TFq!fFn7s4-==S|MjQRa!@T_S1 z{rvd*{Sce{{alCzs9Xm0PzOL%2vl&O6b$U>4{)6q_}m>LY$TkYJFp}@RC07+ci236 zTnK^WaFQ&elFXP1V0#b&y8^}4f(e)l3!p0v3(&COObZJT3oA@a;NY;Z(9oq`3Fv~5 zn5-C03P7U^3;PZI3oy`UVIT_tF*0xvSO)b05COPYXvhp8NJ!9TL+C|i=XD(81(m>o zqy)jRZ~+GpMj##%VhC{$A^{N)KnMUZ5IVRKz!3og0|f>U2hazaoSLW)&oRLNLTO?i zIWqMw0R7U|E&#yPJ1i_L{s0v4H1K5bWbyz1q}1#X@Tl+q{~#2gC}Tu)xbXkH;P7A( z0WcA`z^DX^xEMeNXa(3v1vCZ7B*3Tyi!=ogNChBh1=v6aAV8%75eh&c(73q3z{tqB zxJVEHGB-0fb1yVCG&D6fG%-v`Lq$$gMK&}vGczAH*bz=%33Lqe4VJ~lT3Ue-DbZ=z}ZFF`D zX>)T(NmE8tMIca8PgY4pMMNM%Ss+wMMIb>{R7g)!AR<9iA__rHL?A_2P*O!xQy@uA zP)tclMN=$9EDAzZR8&taMhZEip1N zGc-0aE@yf)H#Y(UtygPv+qf0|?q6}oGu_Bjk&&FZN!>J4TB2>vN}@_qaXjVD4n#sC zVv^wU5nKKBJplEflw|Xz9?J#^;NEl3eaZ~aN&N((PWd%Wt=rqcxOb=S#J%&+%y!pm z>O_{;^eg*sQ?nh05R&zDUZ;Z~;hj6`NKmFtQw&7nGRW(N0kuI&!@hM&{< z5Fe!{GzNde=kIvb0>UE+c-vKZu64$uV#}0MvMCatvs%df%*>Ocy)R8wi8oHg8{If`GqL;titQGM z|2T8!zT@w(gsYnqIN{2p|KPPOl$Gl7Hwssd$cv`ddmlsfEStK0@!LW8*!D-BGY=eh zwv!(uoLCe!C5tvBSH$wx){N)1ex?M&0Fd-^fnO7o4KrV4YWJM{z z;>a`nL`yF6bt@9Dj#loX}1;yVT_lN6$ovkD$u$xo^1}!G_kPlZE{cr4q5Tyw> zj%6uD!@*w&mR7P4l0}rXKFA7I>NJ3g??@9lAQTc+LkX?wvWaTA{n!fa@q)oESnYjm zwk4pG5=bG|=00iu;89sVRg{V+=ubp-eP&jLjtbmBT z$(Fd>yBa8nF<-GJtuK`F6RUgnKZiUthTojima5qAz-=S`8~v9%{gw*H@7>gH-s?mL zA0oD?wD)jl5*p6T4-KJ6L^7;5KT`N+r_kdWJfUyzW1_vYOHEg2&=quX#ZOb9mW4Wb8%Ms=;x@`d~nYkxCR)9hinu za^w;(&rh+W2i+67t-q`+1-L*pY%4AJVP%x4x|LToM*{$RheAxf68s5pKk3?TeA8_cX(c;+$kpmp((^$QG8mA$VXB^*<(F10^1W+Y zN9;3CQ^e4=`eK^UIo|fZZuEKfzZZ^YPwiQ76oR^g6Vkg<7eCUKdG+4ZJGRhSAy-?7 z>Rr0YU#O?ceu;pG^LDUwg+P&NDjr|xvt2GxrfRf_y?uLfx5Bh1wz3XFj`82xo;@4c zN9c8(?bEMK#`+YXCj2dPJ_2?vL?QJlId-eUwOUZ#o?^A2<~0)v?v@8j4J;=gui@$ zY7F;dWBAKQRiMZiVr+8ebbbz}Jt*Sa+HUToj}lg5hNLpzjN+JWk%1zW3vdl*=!lYNIDYq@&PD8;f-g`>YMxf!UHllS zo~pJGBN^kmn!QV2GtstMwp1-J+S8j$49UFThDQoXZ67;8$m0`yP#2|4WW4-ohd;#z z3?0sP*g!_yMEw5_kG3Y`D_5h^pY2@v8eVFrNX%Qj6zBp6kL+gRqb&I8Xrbo-H3M&F zA*R1pLjFdXfcab3OVuNI9?KG;gk9*=^|>Vg(TcbfUw7Y9w8@oR)z2ync2QLoJW^qW zOF{)(sRAl*L#wI|P!Yqyz2lSb-UbhrXA{;P$oPZ?BPi zOHWiyJ?1f<<7{o$HP@oxbgTa?l?CK@->4oGg61 z4-J8(6+;9F!M3tx;X9fdXBOC=x6qU61>L(3Fdi5!Tpeo;-I+EOJh6MKE_FLG|l8h>&W?CoKA*mt(kpeY;OZ|OGMdX7l`9|lj<;l>d$Ff}kW zHZjFpS##SumVVc-K>48~%}BH)Z@J2y)X)}fGgn)Sbe3w}N51;BJZkCLnO znH9vL18;fq*}2v}ZQ`SfX5W${Dd7=0YQbOZcG75`!{6WFvd|u`iaj66u4i1(smsW6 zy;?G#Mm+E+@J~Qo23>kITyUQRzPqkfG&&;y+yZ3w zt!aS*26uXoz_07!n0y8>U%!$n0<9fY#>`=UL>^cupm#y44;NbN>FERT(>fuasIS$? zl0Gov1tBAIMx!`nf<#N|!#{ywWX6OO@+q5pf~@EQZbhV$ z=ti=lIn&Sq4IfjNFMJPB9E)HcJ<^aJ<6BK_8F`5u1HEqmVPlH`?P66?v`!kNAG^@j z#Q~E}$SMpLA@#^S2nqGL9}w#B8G$Q5c3c)je8z}i|BRXMFaez!Y7Fb!U^uc&D;wu_ zM9wRd`K26eG9QzFz(ue^EeN>$lT79&_gArc_HlyOK^&uTE&a@-hQMF6-KL< zJD~oo+=+)1ZpsKuv1{G3b+j#yMp|w>UBkK>nxkNXQE)*@n_(1;n4U_OWG3O$C@hlv%;^RDwAJqFWrCIF*lkt5x4 z;*dJ)Nh1h3JciktH0T^jHV`wAyL{JZp1zw@r!oBe@8-$7-lSm;tVx5DDqx&~Lt29? z06M7bF=8J`$eh4~F=x;z;{P37OFqFq5FSY(z=wov&V5#Z2aGyFxC#;>-N2zPcncmr za#0k9`-*XxdbQ4unF+rq4d4vl$JYz@Jo=;nprJ@xXf>P7SD5Fa(-%$Q86t0TB1Oz2 z>DiI3j40Hj;2w8r2u|H!L`(6O+%8VWn~nLS*FBF(g-tfGY{!ii&IKsEQOo zenDLb>Ir2Fx)Q0=1E*rG7@NJ?qo7M{B)WRWd_R!rF(A$wLbgze%`@bOEDBjhXZu;Q z+rJ`IzF?jQ%M5Teg65FUY_Q6=68u0bJ5-c5sm`g0KB(Bmgg}v$9B+lV`3sViL&a-B zD$K$)Q8I4&g^%rK*%5D(KpuIt#2_8SizQjan0BJ*hm+I#X>wi=cJSp8tCWI3uLQUu zbOn+=aTP9p^&FK?{Xq3IIdsw&GIb~=1ap}aK`rB}xw8s6h(tt$ zk}bgdhJi1Q=7nrd5WMBKPUmgyx1U2LhcSP}jZzm^BTfLnkFHIjc2yN8oY zDiYxT54pXcCAV1Iyqa99s{NeMob!cT?R8=D&Iq_Y$VRa8fcHgIsp@V7Rvx>g_1kan zYd@@o$0hTVs)j@H5<)R3%bN-!Wlt;cN^JJ4HDLUh1|~AK(g?n$Zc4QOjCm-DI1C<+U9u6xMt{^s6preM(NG{-@c2Exf@uiKe-Fy9 z{5a5EJWgEz`(rd-_5ewd#^esXfF1likB^KmmQkA4s#ud#`b9m3*f*z61P%tB3{E8n z>PP4u>~u}ggB9V+*t$az0P-_j&D0#JFwlgGYvqVlCnX14C#2*P)ZC$T0o#J*;-blw6jFk<396KV z?E+Q;krqkw-Ai_8;zC@RjppXCDh*7AxDz|-4it5gG2Lb@C&AD}96WM|2odp1k8x0Ab6i{+V>b(3_l6}>#>3HrdwWa1$GHRNrR zMxVPb*g{ph8d8k=*+8_E%SLhND}Nv-4tA9|xRS>u zcb4Qa2=4`vJCc})vnNO>@VGz%=>RXqL*Xw4nKrtThCm%X8N*Dw1w$WlW7M5?zy<2~j_ z7(ucND5cxAG$z5o#aI95q**7YXLWMkMm@i87BzXkl@wKbD0Pu63YYRb7$Jm= zN#?dQqU$mlmPwv`1;)ZSsy6#Lr+?Xx{ex3Ocj zAjhx;4-=D;=;g9lt>i0{V8zW2O}0Suc_F`pB#>=ah9LuON7?4ivzjyg-HHPXDb#^N z#GW#qvQg&Nx>ew@P?*oe%n$~Kc;8DRpsbcEI=(NGdG58VR{ID?u3m#Wrjk~xKY zN(qPqlZ!|e{DG*+%` z%Aw{+PVv3ePoam>(txbVzMp3 zkT!L4njJ&rxJ;FE|$+9ASy3!R4;ju#S}-7_DSdDqCIJxT%6XEwU4y6?8t4#tOf_!pzbu$AP{80afE^lEwnTI}1*)?VCTmonAKAF)U4QY;j&&)2w(SskG3 z;||fmRS78W!OfnWbk16>N#m^bUP^gZQ|Ii{gWTk-L%0VrJ+S1AU$S`MtV`!bcN|46 zi1QD*DiMVcGP48X!Te7t=1smSo1YOy)cH}oWEYn+Q9G1?J{R^>mUv}E*4uc4q-RIn#1tI;wOprOQ4fb$$#z;0E}j`8LQm{bUw-fab1wT>rQgf8WRg&T zi+&+;2mIF|o*j9HNc*&XgQ0B=HmZX@rckr^f+#7&vv0FmjzE2uxRPh;xoE{ew^OdZhs zae0artDt>QZrDY=s*Faz7Gf)o-bBq{}h}LJWA<>D9RmH zSLOi$PS#{a2>xsX9}MTXlzS}P6FW$IA2z^H;4H-kWXxiRy*a!zJD3GdjFXzCsyqfQ zsq_znD&!`v$TgBJtQMi~lk_B&RIVXok(DHERDMhb{jX)70!fd|+`ua_e-?ybO7IlM z^l)k_0>E0qE+M;4wm+rF>1RioRf!dI(5&Dkj>Z|4l>q+bL7X2H`Vq7S<8_Zu<3j>ZOr0(fNhM?Di>fF8#Bz=o`~ zPRzko@2+bOZtCRn&L)GQO?qbEw4s?jtjmtKUn9e7(l^Few{WRnnmyD0Cda!r?E#L3 zpMU9)$Bk|C>aM4c$>?r88d`u6pm$B{s;8TMqpQK_Fd{KNLv~H9TfNsSN^)rc6#cSi zsQy5ft~oZYYy_SEx&jUWMXye*k#S|>596x=koEDmI!b*t99YKR@1PMpBwf9)-+%B9Wz=B=TbBbv7eEL+ zMp^DGQ&M9NY-2pWlV{p$Plwpc7t=Copb^u;2BsSJiwiKgn~elGDAj21SKe_4gx}qLm3Ex7(_va5JCtsga`;Bgb)ECgb;$%*vu%60lF^3 zNIY%A$VzN!bn}-saX-g2v??2LeL6$*h${V+H3KZ`RN7YP>D8KxZ&?puO{wFu0VTLQ zZTKd(NFA^w9T20rk@IaEXTbpAvbJ%+wrAOa7yyZOWjsL}11hi<`&&BNr%@Yn`m$-l z;UEF9q4YY2an|tuuyiYG^$G6jCHig^bX6qSTxps_8<36z>WKe1b9aV}Vl%7_s%C@9 z;j)C($dFw|&BhtpVQEyiaUbg~#7mqW12ES%mne~S8k z#+|hDXK0#`upsGz<6o_)3oYqwz~n}lwoZxk1AK_fA;>_XB}&ZDV;ltP=|clpxVFti zENX?n8kx^Zd6?sD{8h;KLkJ{QugSLusH0@!kgBuz(2{Fl*)&ip3C_2ZS6@cUilEd5 zsBr<|ZGarL{U2v6ERA0_QhDR$FSNOnodm=)FF9P=D!2I>qnjh?sGvUW1qm{%ZJMhCJgSHrzE6d zV&X^%5>PDK!e8KfJN>e1G}KSoq!cd7Nct0;Eqj%^bLFL@DxSDHx)eUelmXGq;`qGH zW~tI&lr!3*MmeL`wXso0eI8+L^@THxOPqtrqiR5c`>Q*`ZEI!D1aat#1ZeSfeJ0r4 zGdcFM%2V+p9V6uyC;LMwbz9d+Xp=j-CcP9-JgN2`Xs#t2VB5|cg(8920v`@~794!| z*kK1iFOf3SLmH4hJsW_C7IxWXT#%!ulEXm_#^{6H5$vzrN--pbARHStq^@FODskpz zC9tug%4k3mKq~xcWy?sCfyInLrM-ZBe2rAP*oj@kcExHyLPwkWLCC4;o}87GF8xVT zDvC-<=FQGj*m)wAZ4(0gGpeJnpiG>5V3qXx9@bl7%s#24s(6U9@j}QCHMduje zZ> zUMXx65khx1Bq4P7-EpYO?~zT0oApGhd~HagM06Ih?FadAha{)zhF5l{++zTQCVpq& zys~PsI>cFdT!t9-5f{O#yP}s%X<22iY-={l&el4<0odoA00VFdVURN@Q!@75oCc`W zv99%Zf!SkYN19!}z`CLcP;VFn&k|*N>|hu`EA-GZ{X<^jtjL}wG6`}8jVO=8MvPw( zGKykI3PD+xy0C>M=|y1<%-C;d=?WYmr(J(Aw1KC-E?+41ieR#NIkp^vuW@M1E-{;2 z;XN;){0YwehIEskuDh~tKQD>*vIyfN`;Gwu_ty3IR$-5thmA8-F~|ihKEa>!_1jOX z$Kh!WEcmX$8Id&H@Ttl8#9-V#H4B)tOpk8*IcBh6Rm1f`o79_n06McWmrt0zd-VsA`7;D)Ytw literal 0 HcmV?d00001 diff --git a/mafft/mafft-7.487-2-x86_64.pkg.tar.zst-namcap.log b/mafft/mafft-7.487-2-x86_64.pkg.tar.zst-namcap.log new file mode 100644 index 0000000000..66b9abe221 --- /dev/null +++ b/mafft/mafft-7.487-2-x86_64.pkg.tar.zst-namcap.log @@ -0,0 +1,2 @@ +mafft W: ELF file ('usr/lib/mafft/mxscarnamod') lacks FULL RELRO, check LDFLAGS. +mafft W: Referenced library 'ruby' is an uninstalled dependency diff --git a/mafft/mafft-7.487-2-x86_64.pkg.tar.zst.sig b/mafft/mafft-7.487-2-x86_64.pkg.tar.zst.sig new file mode 100644 index 0000000000000000000000000000000000000000..45ddd9dbb36eb37a229b9548fe450ddd29bef34b GIT binary patch literal 438 zcmV;n0ZIOe0kZ@E0SEvc79j)<510F9gt#F_(l6K7=OK2I*zWwZ%bDg} zzue*NsJghjstIH8Ve__f2M6Gf6RB->={f70V1d*8qs{ye*8ITj(HL^Kj|`?9M<;IR zaEyFOJ<(DWKHH}J)VicrLNpp$4b-4q?=OWvekRHNv6w48Jp7hh#iOb(3>)0?ZQgJO z=OKVjaA=CZpe@nv5^-&{;%XLOqYUGq$Lg4A18gTap`5Qvc@q_TACQtUYeNhfLz63h z&bdats= z_bNlT;2WCx9yh4-r^WBhnH>b#dvMeLSe|d;rky95ERp?T-E~=a9$fp}zT6?OG08qY gAv$W^4=C(r{VyB7Cg9+Uavf@Lf&6ya(6i!B@o|aOX#fBK literal 0 HcmV?d00001 diff --git a/mafft/mafft-7.487.tgz b/mafft/mafft-7.487.tgz new file mode 100644 index 0000000000000000000000000000000000000000..76a8f6bb94ec675a1f21b1a4620b2949cca32a3f GIT binary patch literal 739805 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

    *$)XiA4A=D;s?}u7F(h;5z)FS6)EMS& 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

    >@} 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 R^>b~X|38ZO>fHbUMgT0aSik@P literal 0 HcmV?d00001 diff --git a/mafft/src/mafft-7.487-with-extensions/MPI/Makefile b/mafft/src/mafft-7.487-with-extensions/MPI/Makefile new file mode 100644 index 0000000000..c3e8f9271d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/MPI/Makefile @@ -0,0 +1,80 @@ +PREFIX = /usr/local +LIBDIR = $(PREFIX)/libexec/mafft +BINDIR = $(PREFIX)/bin +MANDIR = $(PREFIX)/share/man/man1 +DESTDIR = + + +#CC := mpicc -cc=gcc +CC := mpicc +#CC := /u33/app/openmpi/bin/mpicc +#CFLAGS := -O3 -ipo -no-prec-div -xHost -std=c99 +#CFLAGS := -O3 -std=c99 +CFLAGS := -O3 +#CFLAGS = -O0 -fPIC -pedantic -Wall -std=c99 -g -DMALLOC_CHECK_=3 # for shark, valgrind +# CFLAGS := -O0 -g -ipo -no-prec-div -xHost -std=c99 +TARGET_ARCH := +LDLIBS := -lm -lrt -lpthread # -lrt? + + +ENABLE_MULTITHREAD := -Denablemultithread +#ENABLE_ATOMIC := -Denableatomic +VPATH := ../core + +ifdef ENABLE_ATOMIC +STDF = -std=c11 +else +STDF = -std=c99 +endif + +MYCFLAGS := $(ENABLE_MULTITHREAD) $(ENABLE_ATOMIC) $(STDF) $(CFLAGS) -I../core -MMD -MP + +OBJDIR := ./obj +ifeq "$(strip $(OBJDIR))" "" + OBJDIR := . +endif + +INSTALL = install + +PROGS := nodepair_mpi +SCRIPTS := mpiscript +OBJNODPAIR := mtxutl.o io.o mltaln9_mpi.o tddis.o constants.o MSalignmm.o partSalignmm.o Lalignmm.o rna.o Salignmm.o Dalignmm.o \ + Falign.o Falign_localhom.o Galign11.o Lalign11.o genalign11.o SAalignmm.o \ + nodepair_mpi.o defs.o fft.o fftFunctions.o addfunctions.o \ + pairlocalalign_mpi.o MSalign11.o +OBJNODPAIR := $(addprefix $(OBJDIR)/, $(OBJNODPAIR)) +DEPSNODPAIR := $(OBJNODPAIR:%.o=%.d) + + +all : $(PROGS) $(SCRIPTS) + cp $(PROGS) $(SCRIPTS) ../binaries + chmod 755 ../binaries/* + @echo done. + +install : all + mkdir -p $(DESTDIR)$(LIBDIR) + chmod 755 $(DESTDIR)$(LIBDIR) + chmod 755 $(PROGS) ||: # in MinGW, it's ok if this fails + $(INSTALL) -s $(PROGS) $(DESTDIR)$(LIBDIR) + $(INSTALL) $(SCRIPTS) $(DESTDIR)$(LIBDIR) + @echo done. + +nodepair_mpi : $(OBJNODPAIR) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@ + +shmclear : shmclear.c + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@ + +mpiscript : mpiscript.tmpl + cp mpiscript.tmpl mpiscript + +$(OBJDIR)/%.o : %.c + -@mkdir -p $(OBJDIR) + @[ -d $(OBJDIR) ] + $(CC) $(MYCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -o $@ -c $< + +clean : + rm -f $(OBJNODPAIR) $(DEPSNODPAIR) $(PROGS) $(SCRIPTS) *.o *.a *.exe *~ + rm -rf obj/ + +-include $(DEPSNODPAIR) diff --git a/mafft/src/mafft-7.487-with-extensions/MPI/mltaln9_mpi.c b/mafft/src/mafft-7.487-with-extensions/MPI/mltaln9_mpi.c new file mode 100644 index 0000000000..7634567b50 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/MPI/mltaln9_mpi.c @@ -0,0 +1,17073 @@ +#include "mltaln.h" +#include + +#ifdef enableatomic +#include +#endif +#include +#define SEMAPHORE 1 +#define NSTREAM 1 + +#define DEBUG 0 +#define CANONICALTREEFORMAT 1 +#define MEMSAVE 1 + +#define HAT3SORTED 0 +#define DISPPAIRID 0 // tbfast ha ugokanakunaru + +#define LHBLOCKFACTOR 2 +#define LHDIVIDE 1.0 +#define MINBLOCKLEN2 1000000000 // 100000 pairs * 100 sites * 100 sites + +#define N0LOOPFIRST 0 +#define YOUNGER0TREE 1 // --add ni hitsuyou + +#define REPORTCOSTS 0 +#define EXACTLYSAMEASPAIRLOCALALIGN 0 // test you. itchi saseruniha guide tree mo ataeru + +#define RECURSIVETOP 1 + +#define ENABLEMPIDEBUG 0 +//the rough expectation number of chunks which will be assigned to each process +#define GRANULARITY 10 + + +static char lockfile[1000]; +static int lockthisjobonly; +#if enableatomic +static ATOMICINT *lockaddr; +#else +#if SEMAPHORE +static sem_t *lockaddr; +#else +static pthread_mutex_t *lockaddr; +#endif +#endif +static int lockfd; +int createshm; + + + + +#if 0 +int seqlen( char *seq ) +{ + int val = 0; + while( *seq ) + if( *seq++ != '-' ) val++; + return( val ); +} +#else +int seqlen( char *seq ) +{ + int val = 0; + if( *newgapstr == '-' ) + { + while( *seq ) + if( *seq++ != '-' ) val++; + } + else + { + while( *seq ) + { + if( *seq != '-' && *seq != *newgapstr ) val++; + seq++; + } + } + return( val ); +} +#endif + +int intlen( int *num ) +{ + int value = 0; + while( *num++ != -1 ) value++; + return( value ); +} + +char seqcheck( char **seq ) +{ + int i, len; + char **seqbk = seq; + while( *seq ) + { + len = strlen( *seq ); + for( i=0; i output\n" ); + reporterr( "=== \n" ); + reporterr( "========================================================================= \n" ); + reporterr( "========================================================================= \n" ); + return( (int)(*seq)[i] ); + } + } + seq++; + } + return( 0 ); +} + +void intcat( int *s1, int *s2 ) +{ + while( *s1 != -1 ) s1++; + while( *s2 != -1 ) + { +// reporterr( "copying %d\n", *s2 ); + *s1++ = *s2++; + } + *s1 = -1; +} + +void intcpy( int *s1, int *s2 ) +{ + while( *s2 != -1 ) + { +// reporterr( "copying %d\n", *s2 ); + *s1++ = *s2++; + } + *s1 = -1; +} + +void intncpy( int *s1, int *s2, int n ) +{ + while( n-- ) *s1++ = *s2++; +} + +void fltncpy( double *s1, double *s2, int n ) +{ + while( n-- ) *s1++ = *s2++; +} + +static int countmem( int *s ) +{ + int v = 0; + while( *s++ != -1 ) v++; + return( v ); +} + +static int lastmem( int *s ) +{ + while( *s++ != -1 ) + ; + return( *(s-2) ); +} + + +void scmx_calc( int icyc, char **aseq, double *effarr, double **scmx ) +{ + int i, j, lgth; + + lgth = strlen( aseq[0] ); + for( j=0; j DISPSEQF ) imax = DISPSEQF; + else imax = nseq; + reporterr( " ....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+\n" ); + for( i=0; i<+imax; i++ ) + { + strncpy( b, seq[i]+DISPSITEI, 120 ); + b[120] = 0; + reporterr( "%3d %s\n", i+1, b ); + } +} + +void intergroup_score_consweight( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + unsigned char ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == '-' ) + { + tmpscore += (double)penalty; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + while( (ms2=(unsigned char)mseq2[++k]) == '-' ) + ; +// tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; +// reporterr( "val in _gapnomi = %f\n", *value ); + } + } +#if 0 + fprintf( stdout, "###score = %f\n", score ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} +void intergroup_score_gapnomi( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + int ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == (int)'-' ) + { + tmpscore += (double)penalty; +// tmpscore += (double)amino_dis[ms1][ms2]; + while( (ms2=(int)mseq2[++k]) == (int)'-' ) + ; +// tmpscore += (double)amino_dis[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; +// reporterr( "val in _gapnomi = %f\n", *value ); + } + } +#if 0 + fprintf( stdout, "###score = %f\n", score ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} + +void intergroup_score_multimtx( int **whichmtx, double ***scoringmatrices, char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k, c; + int len2 = len - 2; + int mn1, mn2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + int gapnum = amino_n['-']; + + double gaptmpscore; + double gapscore = 0.0; + +// reporterr( "#### in intergroup_score\n" ); + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( mn2 == gapnum ) + { + tmpscore += (double)penalty; + gaptmpscore += (double)penalty; + tmpscore += (double)scoringmatrices[c][mn1][mn2]; +// tmpscore += (double)scoringmtx[mn1][mn2]; + while( (mn2=amino_n[(unsigned char)mseq2[++k]]) == gapnum ) + tmpscore += (double)scoringmatrices[c][mn1][mn2]; +// tmpscore += (double)scoringmtx[mn1][mn2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; + gapscore += (double)gaptmpscore * (double)efficient; + } + } +// reporterr( "done." ); +#if 0 + reporterr( "###gapscore = %f\n", gapscore ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} +void intergroup_score_dynmtx( double **offsetmtx, int scoringmtx[0x80][0x80], char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + int ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + + double gaptmpscore; + double gapscore = 0.0; + +// reporterr( "#### in intergroup_score\n" ); + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == (int)'-' ) + { + tmpscore += (double)penalty; + gaptmpscore += (double)penalty; + tmpscore += (double)scoringmtx[ms1][ms2] + offsetmtx[i][j] * 600; +// tmpscore += (double)scoringmtx[ms1][ms2]; + while( (ms2=(int)mseq2[++k]) == (int)'-' ) + tmpscore += (double)scoringmtx[ms1][ms2] + offsetmtx[i][j] * 600; +// tmpscore += (double)scoringmtx[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; + gapscore += (double)gaptmpscore * (double)efficient; + } + } + reporterr( "done." ); +#if 0 + reporterr( "###gapscore = %f\n", gapscore ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} +void intergroup_score( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + unsigned char ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + + double gaptmpscore; + double gapscore = 0.0; + +// reporterr( "#### in intergroup_score\n" ); + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == '-' ) + { + tmpscore += (double)penalty; + gaptmpscore += (double)penalty; +// tmpscore += (double)amino_dis[ms1][ms2]; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + while( (ms2=(unsigned char)mseq2[++k]) == '-' ) +// tmpscore += (double)amino_dis[ms1][ms2]; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; + gapscore += (double)gaptmpscore * (double)efficient; + } + } +#if 0 + reporterr( "###gapscore = %f\n", gapscore ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} + +double score_calc5( char **seq, int s, double **eff, int ex ) /* method 3 deha nai */ +{ + int i, j, k; + double c; + int len = strlen( seq[0] ); + double score; + double tmpscore; + char *mseq1, *mseq2; + double efficient; +#if DEBUG + FILE *fp; +#endif + + score = 0.0; + c = 0.0; + + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore * efficient; +/* + fprintf( stdout, "%d-%d tmpscore = %f, eff = %f, tmpscore*eff = %f\n", i, ex, tmpscore, efficient, tmpscore*efficient ); +*/ + } + /* + fprintf( stdout, "total score = %f\n", score ); + */ + + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore * efficient; + } + } +/* + reporterr( "score in score_calc5 = %f\n", score ); +*/ + return( (double)score ); +/* + +fprintf( trap_g, "score by fast = %f\n", (double)score ); + +tmpscore = score = 0.0; + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty - n_dis[24][0]; + while( mseq2[++k] == '-' ) + ; + k--; + if( k > len-2 ) break; + continue; + } + } + /* + if( x == 65 ) printf( "i=%d j=%d tmpscore=%d l=%d\n", i, j, tmpscore, len ); + */ + score += (double)tmpscore * efficient; + } + } + score /= c; + return( (double)score ); +} + + + +void upg2( int nseq, double **eff, int ***topol, double **len ) +{ + int i, j, k; + double tmplen[M]; + + static char **pair = NULL; + + if( !pair ) + { + pair = AllocateCharMtx( njob, njob ); + } + + for( i=0; i 0 ) + { + topol[k][0][count] = i; + count++; + } + topol[k][0][count] = -1; + for( i=0, count=0; i 0 ) + { + topol[k][1][count] = i; + count++; + } + topol[k][1][count] = -1; + + len[k][0] = minscore / 2.0 - tmplen[im]; + len[k][1] = minscore / 2.0 - tmplen[jm]; + + tmplen[im] = minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +#define BLOCKSIZE 100 +#define LARGEBLOCKSIZE 100 + +typedef struct _generaltdistarrthread_arg +{ + int para; + int njob; +// int thread_no; + int m; + int *nlen; + char **seq; + int **skiptable; + int **pointt; + int *ttable; + int *tselfscore; + int *posshared; + int *joblist; + double *result; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} generaldistarrthread_arg_t; + +static void *generalkmerdistarrthread( void *arg ) // enablemultithread == 0 demo tsukau +{ + generaldistarrthread_arg_t *targ = (generaldistarrthread_arg_t *)arg; + int njob = targ->njob; + int para = targ->para; + int m = targ->m; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *ttable = targ->ttable; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *result = targ->result; +// double **partmtx = targ->partmtx; + int i, posinjoblist, n; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += LARGEBLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int m = targ->m; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *result = targ->result; +// double **partmtx = targ->partmtx; + int i, posinjoblist, n; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + return( NULL ); + } + posinjoblist = *posshared; + *posshared += LARGEBLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; n", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + +// result = calloc( nseq, sizeof( double ) ); +// joblist = calloc( nseq, sizeof( int ) ); + + + for( acptj=(acpt+pos)->next,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + + if( j ) + { +// reporterr( "resetting in parallel!! j=%d\n", j ); +// exit( 1 ); + int posshared; + generaldistarrthread_arg_t *targ; + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + + targ = calloc( nthread, sizeof( generaldistarrthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + posshared = 0; + pthread_mutex_init( &mutex, NULL ); + for( i=0; inext; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + } + + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; + +// free( joblist ); +// free( result ); +} + +#else +static void kmerresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, int *tselfscore, int **pointt, int *nlen, int *singlettable1, double *resultnotused, int *joblistnotused ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + + for( acptj=(acpt+pos)->next; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; +// else if( seq ) +// tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); + else + tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; +// else if( seq ) +// tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); + else + tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +} +#endif + +#if 1 +static void msaresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, char **seq, int **skiptable, int *tselfscore, double *result, int *joblist ) +{ + int i, j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; +// double *result; +// int *joblist; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + +// result = calloc( nseq, sizeof( double ) ); +// joblist = calloc( nseq, sizeof( int ) ); + +// for( acptj=acpt,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + for( acptj=(acpt+pos)->next,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + + if( j ) + { +// reporterr( "resetting in parallel!! j=%d\r", j ); +// exit( 1 ); + int posshared; + generaldistarrthread_arg_t *targ; + posshared = 0; + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + targ = calloc( nthread, sizeof( generaldistarrthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + for( i=0; inext; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + } + +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; + +// free( joblist ); +// free( result ); +} +#else +static void msaresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, char **seq, int **skiptable, int *tselfscore, double *resultnotused, int *joblistnotused ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + + for( acptj=(acpt+pos)->next; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; + else + tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); +// else +// tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; + else + tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); +// else +// tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +} +#endif + +static int getdensest( int *m, double *d ) +{ + int i; + double dmax = -100.0; + int pmax = -1; + for( i=0; m[i]>-1; i++ ) + { + if( d[m[i]] > dmax ) + { + dmax = d[m[i]]; + pmax = m[i]; + } + } + return( pmax ); +} + + +static void setdensity( int nseq, Bchain *acpt, double **eff, double *density, int pos ) +{ + int j; + double tmpdouble; +// double **effptpt; + Bchain *acptj; + +// printf( "[%d], %f, dist=%d ->", pos, *mindisfrompt, *nearestpt ); + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + + tmpdouble = 0.0; +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( eff[pos][j-pos] < 1.0 ) + tmpdouble += (2.0-eff[pos][j-pos]); + } +// effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; + if( eff[j][pos-j] < 1.0 ) + tmpdouble += (2.0-eff[j][pos-j]); + } + + *density = tmpdouble; +// printf( "p=%d, d=%f \n", pos, *density ); +} + + +static void setnearest( int nseq, Bchain *acpt, double **eff, double *mindisfrompt, int *nearestpt, int pos ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + +// printf( "[%d], %f, dist=%d ->", pos, *mindisfrompt, *nearestpt ); + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=*effpt++) < *mindisfrompt ) + if( (tmpdouble=eff[pos][j-pos]) < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=(*effptpt++)[pos-j]) < *mindisfrompt ) + if( (tmpdouble=eff[j][pos-j]) < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +// printf( "%f, %d \n", pos, *mindisfrompt, *nearestpt ); +} + +static void setnearest_double_fullmtx( int nseq, Bchain *acpt, double **eff, double *mindisfrompt, int *nearestpt, int pos ) +{ + int j; + double tmpdouble; + double **effptpt; + Bchain *acptj; + + *mindisfrompt = 999.9; + *nearestpt = -1; + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=*effpt++) < *mindisfrompt ) + if( (tmpdouble=eff[pos][j]) < *mindisfrompt ) + { + *mindisfrompt = tmpdouble; + *nearestpt = j; + } + } + effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=(*effptpt++)[pos-j]) < *mindisfrompt ) + if( (tmpdouble=eff[j][pos]) < *mindisfrompt ) + { + *mindisfrompt = tmpdouble; + *nearestpt = j; + } + } +} + + + +static void loadtreeoneline( int *ar, double *len, FILE *fp ) +{ + static char gett[1000]; + int res; + char *p; + + p = fgets( gett, 999, fp ); + if( p == NULL ) + { + reporterr( "\n\nFormat error (1) in the tree? It has to be a bifurcated and rooted tree.\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + + res = sscanf( gett, "%d %d %lf %lf", ar, ar+1, len, len+1 ); + if( res != 4 ) + { + reporterr( "\n\nFormat error (2) in the tree? It has to be a bifurcated and rooted tree.\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + ar[0]--; + ar[1]--; + + if( ar[0] >= ar[1] ) + { + reporterr( "\n\nIncorrect guide tree\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + +// reporterr( "ar[0] = %d, ar[1] = %d\n", ar[0], ar[1] ); +// reporterr( "len[0] = %f, len[1] = %f\n", len[0], len[1] ); +} + +void loadtop( int nseq, double **mtx, int ***topol, double **len, char **name, int *nlen, Treedep *dep ) +{ + int i, j, k, minijm, maxijm; + int *intpt, *intpt2; + int *hist = NULL; + Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; + int nmemim, nmemjm; + char **tree; + char *treetmp; + char *nametmp, *nameptr, *tmpptr; + char namec; + FILE *fp; + int node[2]; + double *height; + double clusterdist; + int mpair, mi, mj; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( nseq ); + ac = (Bchain *)malloc( nseq * sizeof( Bchain ) ); + nmemar = AllocateIntVec( nseq ); +// treetmp = AllocateCharVec( nseq*50 ); + treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( nseq, nseq*50 ); + tree = AllocateCharMtx( nseq, 0 ); + height = AllocateFloatVec( nseq ); + } + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } +#else + len[k][0] = len[k][1] = -1.0; + loadtreeoneline( node, len[k], fp ); + im = node[0]; + jm = node[1]; + + if( im > nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + +#endif + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + +// reporterr( "prevnode = %d, nmemim = %d\n", prevnode, nmemim ); + + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + + nmemjm = nmemar[jm]; + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + +// reporterr( "prevnode = %d, nmemjm = %d\n", prevnode, nmemjm ); + + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + +// len[k][0] = ( minscore - tmptmplen[im] ); +// len[k][1] = ( minscore - tmptmplen[jm] ); +// len[k][0] = -1; +// len[k][1] = -1; + + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + + if( len[k][0] == -1 || len[k][1] == -1 ) + { + reporterr( "Re-computing the length of branch %d..\n", k ); + clusterdist = 0.0; + mpair = 0; + for( i=0; (mi=topol[k][0][i])>-1; i++ ) for( j=0; (mj=topol[k][1][j])>-1; j++ ) + { + minijm = MIN(mi,mj); + maxijm = MAX(mi,mj); + clusterdist += mtx[minijm][maxijm-minijm]; + mpair += 1; + } + clusterdist /= (double)mpair; + reporterr( "clusterdist = %f\n", clusterdist ); + if( len[k][0] == -1 ) len[k][0] = clusterdist/2.0 - height[im]; + if( len[k][1] == -1 ) len[k][1] = clusterdist/2.0 - height[im]; + + fprintf( stderr, "len0 = %f\n", len[k][0] ); + fprintf( stderr, "len1 = %f\n\n", len[k][1] ); + } + +#if 0 + fprintf( stderr, "vSTEP-%03d:\n", k+1 ); + fprintf( stderr, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][0][i]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][1][i]+1 ); + fprintf( stderr, "\n" ); + +#endif + height[im] += len[k][0]; // for ig tree, 2015/Dec/25 + dep[k].distfromtip = height[im]; // for ig tree, 2015/Dec/25 +// reporterr( "##### dep[%d].distfromtip = %f\n", k, height[im] ); + + + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 0 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { +// reporterr( "calling setnearest\n" ); +// setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + + } + fclose( fp ); + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fprintf( fp, "#by loadtop\n" ); + fclose( fp ); + + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); + free( hist ); + free( (char *)ac ); + free( (void *)nmemar ); + free( height ); + +} + +static void shufflelennum( Lennum *ary, int size ) +{ + int i; + for(i=0;ilen - ((Lennum *)p)->len ); +} + +#if 0 +static int compfuncpair( const void *p, const void *q ) +{ + return( ((Pairnum *)q)->npairs - ((Pairnum *)p)->npairs ); +} +#endif + +static int compfuncpairpt( const void *p, const void *q ) +{ + return( (*(Pairnum **)q)->npairs - (*(Pairnum **)p)->npairs ); +} + + +void limitlh( int *uselh, Lennum *in, int size, int limit ) +{ + int i; +// for(i=0;i size ) limit = size; +// reporterr( "numpairs=%llu, ULLONG_MAX=%llu, nn=%lld, INT_MAX=%d, n=%d\n", numpairs, ULLONG_MAX, nn, INT_MAX, n ); + + for(i=0;i INT_MAX ) nn = INT_MAX; + + n = (int)nn; + if( n > size ) n = size; +// reporterr( "numpairs=%llu, ULLONG_MAX=%llu, nn=%lld, INT_MAX=%d, n=%d\n", numpairs, ULLONG_MAX, nn, INT_MAX, n ); + + for(i=0;idep)[pos].child0) == -1 ) + { + *order++ = (tdp->topol)[pos][0][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, tdp, child ); + } + + if( (child=(tdp->dep)[pos].child1) == -1 ) + { + *order++ = (tdp->topol)[pos][1][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, tdp, child ); + } + + return( order ); +} + +int *topolorderz( int *order, int ***topol, Treedep *dep, int pos, int nchild ) +{ + TopDep td; + td.topol = topol; + td.dep = dep; + + int child; + + if( nchild == 0 || nchild == 2 ) + { + if( (child=(td.dep)[pos].child0) == -1 ) + { + *order++ = (td.topol)[pos][0][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, &td, child ); + } + } + if( nchild == 1 || nchild == 2 ) + { + if( (child=(td.dep)[pos].child1) == -1 ) + { + *order++ = (td.topol)[pos][1][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, &td, child ); + } + } + + return ( order ); +} + +#if RECURSIVETOP +#else +static void topolorder_mudaari( int nseq, int *n1, int *n2, int *order1, int *order2, int ***topol, Treedep *dep, int pos ) +// memhist[][] wo free sezu, recalcpairs4thread() ni wataseba, kono kansuu ha iranai. -> V7.383 +// memhist[][] no memory shiyou ryou ha, saiaku no baai O(N^2) +{ + int **memhist, **localmem; + int i, s1, s2, c1, c2; + memhist = AllocateIntMtx( pos, 0 ); + localmem = AllocateIntMtx( 2, 0 ); + for( i=0; i<=pos; i++ ) memhist[i] = NULL; + + for( i=0; i<=pos; i++ ) + { + c1 = dep[i].child0; + c2 = dep[i].child1; + if( c1 == -1 ) + { + localmem[0] = calloc( sizeof( int ), 2 ); + localmem[0][0] = topol[i][0][0]; + localmem[0][1] = -1; + s1 = 1; + } + else + { + localmem[0] = memhist[c1]; + s1 = intlen( localmem[0] ); + } + + if( c2 == -1 ) + { + localmem[1] = calloc( sizeof( int ), 2 ); + localmem[1][0] = topol[i][1][0]; + localmem[1][1] = -1; + s2 = 1; + } + else + { + localmem[1] = memhist[c2]; + s2 = intlen( localmem[1] ); + } + + if( i == pos ) + { + intcpy( order1, localmem[0] ); + intcpy( order2, localmem[1] ); + *n1 = s1; + *n2 = s2; + } + else + { + memhist[i] = calloc( sizeof( int ), s1+s2+1 ); + intcpy( memhist[i], localmem[0] ); + intcpy( memhist[i]+s1, localmem[1] ); + memhist[i][s1+s2] = -1; + } + free( localmem[0] ); + free( localmem[1] ); + if( c1 != -1 ) memhist[c1] = NULL; + if( c2 != -1 ) memhist[c2] = NULL; + +// reporterr( "freeing memhist[%d]\n", dep[i].child0 ); +// reporterr( "freeing memhist[%d]\n", dep[i].child1 ); + } + + for( i=0; i<=pos; i++ ) + { + if( memhist[i] ) free( memhist[i] ); + memhist[i] = NULL; + } + free( memhist ); + free( localmem ); +} +#endif + +#if CANONICALTREEFORMAT +void createchain( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int shuffle, int seed ) +{ + FILE *fp; + int i, j; + double l, ll; + int treelen; + char **tree; + char *instanttree; + int posinit; +// char *treetmp, *tt; + char *nametmp, *nameptr, *tmpptr; + char namec; + int *order; + int im, jm, mm; + + if( treeout ) + { +// treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( nseq, 0 ); + + treelen = nseq; + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + treelen += strlen( tree[i] ) + 20; + + } + + instanttree = calloc( treelen, sizeof( char ) ); + posinit = 0; + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + treelen += strlen( tree[i] ) + 20; + + } + + instanttree = calloc( treelen, sizeof( char ) ); + posinit = 0; + for( i=0; i k ) + { + fprintf( fp, "%d %d %f %f\n", k+1, jm+1, len[i][0], len[i][1] ); + } + else + { + fprintf( fp, "%d %d %f %f\n", jm+1, k+1, len[i][1], len[i][0] ); + k = jm; + } + } +#endif + fclose( fp ); + free( order ); +} +#endif + +void loadtree( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + int *hist = NULL; + Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; + int nmemim, nmemjm; + char **tree; + char *treetmp; + char *nametmp, *nameptr, *tmpptr; + char namec; + FILE *fp; + int node[2]; + double *height; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + + reporterr( "Loading a tree\n" ); + + if( !hist ) + { + hist = AllocateIntVec( nseq ); + ac = (Bchain *)malloc( nseq * sizeof( Bchain ) ); + nmemar = AllocateIntVec( nseq ); +// treetmp = AllocateCharVec( nseq*50 ); + if( dep ) height = AllocateFloatVec( nseq ); + } + + if( treeout ) + { + treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( nseq, nseq*50 ); + tree = AllocateCharMtx( nseq, 0 ); + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + } + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } +#else + len[k][0] = len[k][1] = -1.0; + loadtreeoneline( node, len[k], fp ); + im = node[0]; + jm = node[1]; + +// if( im > nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + if( im > nseq-1 || jm > nseq-1 ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + + if( len[k][0] == -1.0 || len[k][1] == -1.0 ) + { + reporterr( "\n\nERROR: Branch length is not given.\n" ); + exit( 1 ); + } + + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + +#endif + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + +// reporterr( "prevnode = %d, nmemim = %d\n", prevnode, nmemim ); + + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + + nmemjm = nmemar[jm]; + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + +// reporterr( "prevnode = %d, nmemjm = %d\n", prevnode, nmemjm ); + + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + +// len[k][0] = ( minscore - tmptmplen[im] ); +// len[k][1] = ( minscore - tmptmplen[jm] ); +// len[k][0] = -1; +// len[k][1] = -1; + + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + +// mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + } + } + + + if( treeout ) + { + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 0 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { +// reporterr( "calling setnearest\n" ); +// setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stderr, "vSTEP-%03d:\n", k+1 ); + fprintf( stderr, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][0][i]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][1][i]+1 ); + fprintf( stderr, "\n" ); +#endif + + if( dep ) + { + height[im] += len[k][0]; // for ig tree, 2015/Dec/25 + dep[k].distfromtip = height[im]; // for ig tree, 2015/Dec/25 +// reporterr( "##### dep[%d].distfromtip = %f\n\n", k, height[im] ); + } + +// reporterr( "dep[%d].child0 = %d\n", k, dep[k].child0 ); +// reporterr( "dep[%d].child1 = %d\n", k, dep[k].child1 ); +// reporterr( "dep[%d].distfromtip = %f\n", k, dep[k].distfromtip ); + } + fclose( fp ); + + if( treeout ) + { + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fprintf( fp, "#by loadtree\n" ); + fclose( fp ); + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); + } + + free( hist ); + free( (char *)ac ); + free( (void *)nmemar ); + if( dep ) free( height ); + +} + +int check_guidetreefile( int *seed, int *npick, double *limitram ) +{ + char string[100]; + char *sizestring; + FILE *fp; + double tanni; + double tmpd; + + *seed = 0; + *npick = 200; + *limitram = 10.0 * 1000 * 1000 * 1000; // 10GB + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + fgets( string, 999, fp ); + fclose( fp ); + + if( !strncmp( string, "shuffle", 7 ) ) + { + sscanf( string+7, "%d", seed ); + reporterr( "shuffle, seed=%d\n", *seed ); + return( 's' ); + } + else if( !strncmp( string, "pileup", 6 ) ) + { + reporterr( "pileup.\n" ); + return( 'p' ); + } + else if( !strncmp( string, "auto", 4 ) ) + { + sscanf( string+4, "%d %d", seed, npick ); + reporterr( "auto, seed=%d, npick=%d\n", *seed, *npick ); + if( *npick < 2 ) + { + reporterr( "Check npick\n" ); + exit( 1 ); + } + return( 'a' ); + } + else if( !strncmp( string, "test", 4 ) ) + { + sscanf( string+4, "%d %d", seed, npick ); + reporterr( "calc, seed=%d, npick=%d\n", *seed, *npick ); + if( *npick < 2 ) + { + reporterr( "Check npick\n" ); + exit( 1 ); + } + return( 't' ); + } + else if( !strncmp( string, "compact", 7 ) ) + { + sizestring = string + 7; + reporterr( "sizestring = %s\n", sizestring ); + if( strchr( sizestring, 'k' ) || strchr( sizestring, 'k' ) ) tanni = 1.0 * 1000; // kB + else if( strchr( sizestring, 'M' ) || strchr( sizestring, 'm' ) ) tanni = 1.0 * 1000 * 1000; // GB + else if( strchr( sizestring, 'G' ) || strchr( sizestring, 'g' ) ) tanni = 1.0 * 1000 * 1000 * 1000; // GB + else if( strchr( sizestring, 'T' ) || strchr( sizestring, 't' ) ) tanni = 1.0 * 1000 * 1000 * 1000 * 1000; // TB + else + { + reporterr( "\nSpecify initial ram usage by '--initialramusage xGB'\n\n\n" ); + exit( 1 ); + } + sscanf( sizestring, "%lf", &tmpd ); + *limitram = tmpd * tanni; + reporterr( "Initial RAM usage = %10.3fGB\n", *limitram/1000/1000/1000 ); + return( 'c' ); + } + else if( !strncmp( string, "very compact", 12 ) ) + { + reporterr( "very compact.\n" ); + return( 'C' ); + } + else if( !strncmp( string, "nodepair", 8 ) ) + { + reporterr( "Use nodepair.\n" ); + return( 'n' ); + } + else + { + reporterr( "loadtree.\n" ); + return( 'l' ); + } +} + + +static double sueff1, sueff05; +//static double sueff1_double, sueff05_double; + +static double cluster_mix_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) * sueff1 + ( d1 + d2 ) * sueff05 ); +} +static double cluster_average_double( double d1, double d2 ) +{ + return( ( d1 + d2 ) * 0.5 ); +} +static double cluster_minimum_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) ); +} +#if 0 +static double cluster_mix_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) * sueff1_double + ( d1 + d2 ) * sueff05_double ); +} +static double cluster_average_double( double d1, double d2 ) +{ + return( ( d1 + d2 ) * 0.5 ); +} +static double cluster_minimum_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) ); +} +#endif + +static void increaseintergroupdistanceshalfmtx( double **eff, int ngroup, int **groups, int nseq ) +{ + int nwarned = 0; + int i, k, m, s1, s2, sl, ss; + int *others, *tft; + double maxdist, *dptr, dtmp; + tft = calloc( nseq, sizeof( int * ) ); + others = calloc( nseq, sizeof( int * ) ); + +// for( m=0; m-1; m++ ) tft[s1] = 1; + for( m=0,k=0; m-1; m++ ) for( k=0; (s1=groups[i][k])>-1&&k s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dtmp = eff[ss][sl-ss]; + if( dtmp > maxdist ) maxdist = dtmp; + } +// reporterr( "maxdist = %f\n", maxdist ); + + for( m=0; (s2=groups[i][m])>-1; m++ ) for( k=0; (s1=others[k])>-1; k++ ) + { + if( s2 > s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dptr = eff[ss] + sl-ss; + if( *dptr < maxdist ) + { + if( *dptr < 0.5 && nwarned++ < 100 ) reporterr( "# Sequences %d and %d seem to be closely related, but are not in the same sub MSA (%d) in your setting.\n", s2+1, s1+1, i+1 ); + *dptr = maxdist; + } + } +// for( m=0; m 100 ) reporterr( "# Sequenc.... (more pairs)\n" ); + + free( tft ); + free( others ); +} + +static void increaseintergroupdistancesfullmtx( double **eff, int ngroup, int **groups, int nseq ) +{ + int nwarned = 0; + int i, k, m, s1, s2, sl, ss; + int *others, *tft; + double maxdist, *dptr, dtmp; + tft = calloc( nseq, sizeof( int * ) ); + others = calloc( nseq, sizeof( int * ) ); + + reporterr( "\n" ); // Hitsuyou desu. + for( i=0; i-1; m++ ) tft[s1] = 1; + for( m=0,k=0; m-1; m++ ) for( k=0; (s1=groups[i][k])>-1&&k s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dtmp = eff[ss][sl]; + if( dtmp > maxdist ) maxdist = dtmp; + } + +// reporterr( "maxdist = %f\n", maxdist ); + + for( m=0; (s2=groups[i][m])>-1; m++ ) for( k=0; (s1=others[k])>-1; k++ ) + { + if( s2 > s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dptr = eff[ss] + sl; + if( *dptr < maxdist ) + { + if( *dptr < 0.5 && nwarned++ < 100 ) reporterr( "# Sequences %d and %d seem to be closely related, but are not in the same sub MSA (%d) in your setting.\n", s2+1, s1+1, i+1 ); + *dptr = maxdist; + } + } + } + if( nwarned > 100 ) reporterr( "# Sequenc.... (more pairs)\n" ); + +// for( m=0; m _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) inconsistent[acpti->pos][acptj->pos] = 0; // osoi!!! + ninconsistentpairs = 0; + firsttime = 1; + while( 1 ) + { + if( firsttime ) + { + firsttime = 0; + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + } + else + { + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[i][j] && (tmpdouble=eff[i][j-i]) < minscore ) + { + minscore = tmpdouble; + im = i; jm = j; + } + } + for( acptj=ac; (acptj&&acptj->pos!=i); acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[j][i] && (tmpdouble=eff[j][i-j]) < minscore ) + { + minscore = tmpdouble; + im = j; jm = i; + } + } + } + } + + + allinconsistent = 1; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + if( inconsistent[acpti->pos][acptj->pos] == 0 ) + { + allinconsistent = 0; + goto exitloop_f; + } + } + } + exitloop_f: + + if( allinconsistent ) + { + reporterr( "\n\n\nPlease check whether the grouping is possible.\n\n\n" ); + exit( 1 ); + } +#if 1 + intpt = testtopol; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + *intpt = -1; +// reporterr( "testtopol = \n" ); +// for( i=0; testtopol[i]>-1; i++ ) reporterr( " %03d", testtopol[i]+1 ); +// reporterr( "\n" ); +#endif + for( i=0; i-1; j++ ) reporterr( " %03d", groups[i][j]+1 ); +// reporterr( "\n" ); + if( overlapmember( groups[i], testtopol ) ) + { + if( !includemember( testtopol, groups[i] ) && !includemember( groups[i], testtopol ) ) + { + if( !warned[i] ) + { + warned[i] = 1; + reporterr( "\n###################################################################\n" ); + reporterr( "# WARNING: Group %d is forced to be a monophyletic cluster.\n", i+1 ); + reporterr( "###################################################################\n" ); + } + inconsistent[im][jm] = 1; + + inconsistentpairlist = realloc( inconsistentpairlist, (ninconsistentpairs+1)*sizeof( int * ) ); + inconsistentpairlist[ninconsistentpairs] = malloc( sizeof( int ) * 2 ); + reporterr( "reallocating inconsistentpairlist, size=%d\n", ninconsistentpairs+1 ); + inconsistentpairlist[ninconsistentpairs][0] = im; + inconsistentpairlist[ninconsistentpairs][1] = jm; + ninconsistentpairs++; + break; + } + } + } + if( i == ngroup ) + { +// reporterr( "OK\n" ); + break; + } + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + eff[im][jm-im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif +#if 1 + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } +#endif + } + } + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + reporterr( "\noSTEP-%03d:\n", k+1 ); + reporterr( "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) reporterr( " %03d", topol[k][0][i]+1 ); + reporterr( "\n" ); + reporterr( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) reporterr( " %03d", topol[k][1][i]+1 ); + reporterr( "\n\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + free( testtopol ); + FreeIntMtx( inconsistent ); + FreeIntMtx( inconsistentpairlist ); + free( warned ); +} + +void makecompositiontable_global( int *table, int *pointt ) +{ + int point; + + while( ( point = *pointt++ ) != END_OF_VEC ) + table[point]++; +} + +typedef struct _resetnearestthread_arg +{ + int para; +// int thread_no; + int im; + int nseq; + double **partmtx; + double *mindist; + int *nearest; + char **seq; + int **skiptable; + int *tselfscore; + int **pointt; + int *nlen; + double *result; + int *joblist; + Bchain **acpt; + Bchain *ac; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} resetnearestthread_arg_t; + +static void *msaresetnearestthread( void *arg ) +{ + resetnearestthread_arg_t *targ = (resetnearestthread_arg_t *)arg; +// int thread_no = targ->thread_no; + int para = targ->para; + int im = targ->im; + int nseq = targ->nseq; + double **partmtx = targ->partmtx; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *tselfscore = targ->tselfscore; + double *result = targ->result; + int *joblist = targ->joblist; + Bchain **acpt = targ->acpt; + Bchain *ac = targ->ac; + + Bchain *acptbk; + Bchain *acptinit; + + int i; + + acptinit = *acpt; + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *acpt == NULL ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + acptbk = *acpt; + *acpt = (*acpt)->next; + +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + i = acptbk->pos; + if( nearest[i] == im ) + { + if( partmtx[im][i] > mindist[i] ) + { + msaresetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, seq, skiptable, tselfscore, result, joblist ); + } + } + } +} + +static void *kmerresetnearestthread( void *arg ) +{ + resetnearestthread_arg_t *targ = (resetnearestthread_arg_t *)arg; +// int thread_no = targ->thread_no; + int para = targ->para; + int im = targ->im; + int nseq = targ->nseq; + double **partmtx = targ->partmtx; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + int *tselfscore = targ->tselfscore; + int **pointt = targ->pointt; + int *nlen = targ->nlen; + double *result = targ->result; + int *joblist = targ->joblist; + Bchain **acpt = targ->acpt; + Bchain *ac = targ->ac; + + int *singlettable1; + + Bchain *acptbk; + Bchain *acptinit; + + int i; + + acptinit = *acpt; + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *acpt == NULL ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + acptbk = *acpt; + *acpt = (*acpt)->next; + +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + i = acptbk->pos; + if( nearest[i] == im ) + { + if( partmtx[im][i] > mindist[i] ) + { + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[i] ); + } + kmerresetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, tselfscore, pointt, nlen, singlettable1, result, joblist ); + if( pointt ) free( singlettable1 ); singlettable1 = NULL;// kmer + if( pointt ) commonsextet_p( NULL, NULL ); + } + } + } +} + + +typedef struct _compactdistarrthread_arg +{ + int para; + int njob; +// int thread_no; + int im; + int jm; + int *nlen; + char **seq; + int **skiptable; + int **pointt; + int *table1; + int *table2; + int *tselfscore; + Bchain **acpt; + int *posshared; + double *mindist; + double *newarr; + double **partmtx; + int *nearest; + int *joblist; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} compactdistarrthread_arg_t; + +static void *verycompactkmerdistarrthreadjoblist( void *arg ) // enablemultithread == 0 demo tsukau +{ + compactdistarrthread_arg_t *targ = (compactdistarrthread_arg_t *)arg; + int njob = targ->njob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *table1 = targ->table1; + int *table2 = targ->table2; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; +// double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *table1 = targ->table1; + int *table2 = targ->table2; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; +// double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nrep1 == -1 ) return; + if( pt->child0 ) reformat_younger0_rec( ori, pt->child0, n, lastappear, topol, len, dep, pos ); + if( pt->child1 ) reformat_younger0_rec( ori, pt->child1, n, lastappear, topol, len, dep, pos ); + + topol[*pos][0] = (int *)realloc( topol[*pos][0], ( 2 ) * sizeof( int ) ); + topol[*pos][1] = (int *)realloc( topol[*pos][1], ( 2 ) * sizeof( int ) ); + + topol[*pos][0][1] = -1; + topol[*pos][1][1] = -1; + if( pt->rep0 < pt->rep1 ) + { + topol[*pos][0][0] = pt->rep0; + topol[*pos][1][0] = pt->rep1; + len[*pos][0] = pt->len0; + len[*pos][1] = pt->len1; + dep[*pos].child0 = lastappear[pt->rep0]; + dep[*pos].child1 = lastappear[pt->rep1]; + } + else + { + topol[*pos][1][0] = pt->rep0; + topol[*pos][0][0] = pt->rep1; + len[*pos][1] = pt->len0; + len[*pos][0] = pt->len1; + dep[*pos].child1 = lastappear[pt->rep0]; + dep[*pos].child0 = lastappear[pt->rep1]; + } + + lastappear[pt->rep0] = *pos; + lastappear[pt->rep1] = *pos; + dep[*pos].distfromtip = pt->height; +// reporterr( "STEP %d\n", *pos ); +// reporterr( "%d %f\n", topol[*pos][0][0], len[*pos][0] ); +// reporterr( "%d %f\n", topol[*pos][1][0], len[*pos][1] ); + (*pos)++; +} + +#if 0 +static void reformat_rec( Treept *ori, Treept *pt, int n, int *lastappear, int ***topol, double **len, Treedep *dep, int *pos ) +{ + if( pt->rep1 == -1 ) return; + if( pt->child0 ) reformat_rec( ori, pt->child0, n, lastappear, topol, len, dep, pos ); + if( pt->child1 ) reformat_rec( ori, pt->child1, n, lastappear, topol, len, dep, pos ); + + topol[*pos][0] = (int *)realloc( topol[*pos][0], ( 2 ) * sizeof( int ) ); + topol[*pos][1] = (int *)realloc( topol[*pos][1], ( 2 ) * sizeof( int ) ); + + topol[*pos][0][0] = pt->rep0; + topol[*pos][0][1] = -1; + topol[*pos][1][0] = pt->rep1; + topol[*pos][1][1] = -1; + len[*pos][0] = pt->len0; + len[*pos][1] = pt->len1; + + dep[*pos].child0 = lastappear[pt->rep0]; + dep[*pos].child1 = lastappear[pt->rep1]; + + lastappear[pt->rep0] = *pos; + lastappear[pt->rep1] = *pos; + + dep[*pos].distfromtip = pt->height; +// reporterr( "STEP %d\n", *pos ); +// reporterr( "%d %f\n", topol[*pos][0][0], len[*pos][0] ); +// reporterr( "%d %f\n", topol[*pos][1][0], len[*pos][1] ); + (*pos)++; +} +#endif + +static char *reformat_rec_newick( char **subtree, Treept *pt ) +{ + char *newick, *newick0, *newick1; + if( pt->rep1 == -1 ) return( subtree[pt->rep0] ); + + newick0 = reformat_rec_newick( subtree, pt->child0 ); + newick1 = reformat_rec_newick( subtree, pt->child1 ); + newick = calloc( strlen( newick0 ) + strlen( newick1 ) + 100, sizeof( char ) ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( pt->rep0 < pt->rep1 ) + sprintf( newick, "(%s:%7.5f,%s:%7.5f)", newick0, pt->len0, newick1, pt->len1 ); + else + sprintf( newick, "(%s:%7.5f,%s:%7.5f)", newick1, pt->len1, newick0, pt->len0 ); + free( newick0 ); + free( newick1 ); + return( newick ); +} + +static void reformattree( Treept *root, Treept *ori, int n, int ***topol, double **len, Treedep *dep, char **name, int treeout, int my_rank ) // my_rank tsuika, 2017/Mar/6 +{ + int i, pos; + char *newick; + int *lastappear; +// int rootpos; +// for( rootpos=n*2-2; rootpos>n; rootpos-- ) if( ori[rootpos].parent == NULL ) break; + + +// reporterr( "Reformat, i=%d\n", i ); +// reporterr( "njob=%d, treept[%d].parent,child0,child1 - self = %p,%p,%p - %p\n", n, i, treept[i].parent,treept[i].child0,treept[i].child1,treept+i ); + if( treeout && my_rank == 0 ) // my_rank tsuika, 2017/Mar/6 +// if( treeout ) + { +// reporterr( "treeout!\n" ); + FILE *fp; + int j; + char namec, *nametmp, *tmpptr, **tree, *nameptr; + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( njob, 0 ); + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + + } + + free( nametmp ); + + + newick = reformat_rec_newick( tree, root ); // tree[] ha free sareru + fp = fopen( "infile.tree", "w" ); // my_rank==0 nomi + fprintf( fp, "%s;\n", newick ); + fclose( fp ); + free( tree ); // free[] ha free sareteiru + free( newick ); + +// FreeCharMtx( tree ); + } + + lastappear = (int *)malloc( sizeof( int ) * n ); + if( lastappear == NULL ) + { + reporterr( "Cannot allocate lastappear\n" ); + exit( 1 ); + } + for( i=0; i&2" ); +// system( "df 1>&2" ); +// system( "lfs df 1>&2" ); +// system( "cat /proc/fs/lustre/lov/work2-clilov-*/target_obd 1>&2" ); + reporterr( "error in fwrite(), retrying, lim=%d\n", lim ); + sleep( 1 ); + } + reporterr( "error in myfwrite()" ); + exit( 1 ); +} +#endif + +static int writehat3node_noaddress( int n, int i, int j, int ii, int jj, FILE **fpp, int tmpint, LocalHom *lh, int *uselh ) +{ +// reporterr( "node=%d (*fpp=%p), i=%d, j=%d\n", n, *fpp, i+1, j+1 ); + + { + LocalHom *tmpptr; + double opt; + int len; + int size; + char c; +// if( i < j ) // iranai + { + +// if( lh->opt == -1.0 || uselh[i] == 0 || uselh[j] == 0 ) + if( uselh[i] == 0 && uselh[j] == 0 ) + { + return( 0 ); + } + +#if DISPPAIRID + fprintf( *fpp, "node %d: %d (%d) - %d (%d) (%c)\n", n, i+1, ii, j+1, jj, tmpint ); +#endif + + opt = lh->opt; + size = 0; + for( tmpptr=lh; tmpptr; tmpptr=tmpptr->next ) size++; + +#if HAT3SORTED + if( fwrite( &size, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &opt, sizeof( double ), 1, *fpp ) != 1 ) +#else + if( fwrite( &ii, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &jj, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &size, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &opt, sizeof( double ), 1, *fpp ) != 1 ) +#endif + { + reporterr( "write error, n=%d\n", n ); + return( -1 ); + } + for( tmpptr=lh; tmpptr; tmpptr=tmpptr->next ) + { + len = tmpptr->end1-tmpptr->start1; + if( fwrite( &(tmpptr->start1), sizeof( int ), 1, *fpp ) != 1 || + fwrite( &(tmpptr->start2), sizeof( int ), 1, *fpp ) != 1 || + fwrite( &len, sizeof( int ), 1, *fpp ) != 1 ) + { + reporterr( "write error, n=%d\n", n ); + return( -1 ); + } +// reporterr( "reg1:%d-%d, reg2:%d-%d, len=%d, score=%f\n", tmpptr->start1, tmpptr->start1+len, tmpptr->start2, tmpptr->start2+len, len, opt ); + } + c = '\n'; + if( fwrite( &c, sizeof( char ), 1, *fpp ) != 1 ) + { + reporterr( "write error, n=%d\n", n ); + return( -1 ); + } + } +#if HAT3SORTED + return( size * 3 * sizeof( int ) + sizeof( char ) + sizeof( int ) + sizeof( double ) ); +#else + return( size * 3 * sizeof( int ) + sizeof( char ) + 3 * sizeof( int ) + sizeof( double ) ); +#endif + } +} + + +#if 0 +typedef struct _calcnearestthread_arg +{ + char **bseq; + int thread_no; + int *posshared; + int alloclen; + int nlim; + double *selfscore; + double *mindists; + int *neighbors; + pthread_mutex_t *mutex; +} calcnearestthread_arg_t; + + +static void *calcnearestthread( void *arg ) +{ + calcnearestthread_arg_t *targ = (calcnearestthread_arg_t *)arg; + char **bseq = targ->bseq; + int thread_no = targ->thread_no; + int *posshared = targ->posshared; + int alloclen = targ->alloclen; + int nlim = targ->nlim; + double *selfscore = targ->selfscore; + double *mindists = targ->mindists; + int *neighbors = targ->neighbors; + pthread_mutex_t *mutex = targ->mutex; + int pos; + double tmpdist, mindist; + int progress; + int neighbor, i; + double (*distfunc)( char *, char *, double, double, int ); + if( alg == 'A' ) distfunc = distdp_noalign; + else if( alg == 'L' ) distfunc = distdpL_noalign; + else if( alg == 'N' ) distfunc = distdpN_noalign; + + while( 1 ) + { + pthread_mutex_lock( mutex ); +// if( *posshared > nlim ) + if( *posshared < 1 ) + { + pthread_mutex_unlock( mutex ); +// reporterr( "freeing tmpseq1\n" ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); + L__align11_noalign( NULL, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); + return( NULL ); + } + pos = *posshared; + *posshared -= 1; + pthread_mutex_unlock( mutex ); + + if( (nlim-pos) % 100 == 0 ) + { + //progress = ( (unsigned long long)pos * (unsigned long long)nlim - (unsigned long long)pos*((unsigned long long)pos-1.0)*0.5 ) / ( (unsigned long long)nlim * ((unsigned long long)nlim-1.0) *0.5 ) * 100; +// progress = ( (double)pos * nlim - pos*(pos-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; + progress = ( (double)(nlim-pos) * nlim - (nlim-pos)*((nlim-pos)-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; + reporterr( "Step %d (%d%%), thread %d \r", (nlim-pos), progress, thread_no ); + } + + mindist = 999.9; +// for( i=pos+1; i-1; i-- ) + { +#if 0 + tmpdist = 0.0; // test! +#else + tmpdist = distfunc( bseq[pos], bseq[i], selfscore[pos], selfscore[i], alloclen ); +#endif + if( mindist > tmpdist ) + { + mindist = tmpdist; + neighbor = i; + } + } + mindists[pos] = mindist; + neighbors[pos] = neighbor; + } +} +#endif + + + +typedef struct _calcnearestthread_arg_mpi +{ + char **bseq; + int thread_no; + int *posshared; + int alloclen; + // int nlim; + double *selfscore; + double *mindists_partial; + int *neighbors_partial; + int start; + int end; + pthread_mutex_t *mutex; +} calcnearestthread_arg_t_mpi; + +static void *calcnearestthread_mpi( void *arg ) +{ + calcnearestthread_arg_t_mpi *targ = (calcnearestthread_arg_t_mpi *)arg; + char **bseq = targ->bseq; +// int thread_no = targ->thread_no; + int *posshared = targ->posshared; + int alloclen = targ->alloclen; + // int nlim = targ->nlim; + double *selfscore = targ->selfscore; + double *mindists_partial = targ->mindists_partial; + int *neighbors_partial = targ->neighbors_partial; + + int start = targ->start; +// int end = targ->end; + + pthread_mutex_t *mutex = targ->mutex; + int pos; + double tmpdist, mindist; +// int progress; + int neighbor, i; + double (*distfunc)( char *, char *, double, double, int ); + if( alg == 'A' ) distfunc = distdp_noalign; + else if( alg == 'L' ) distfunc = distdpL_noalign; + else if( alg == 'N' ) distfunc = distdpN_noalign; + + while( 1 ) + { + pthread_mutex_lock( mutex ); + if( *posshared < start ) + { + pthread_mutex_unlock( mutex ); +// reporterr( "freeing tmpseq1\n" ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); + L__align11_noalign( NULL, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); + return( NULL ); + } + pos = *posshared; + *posshared -= 1; + pthread_mutex_unlock( mutex ); + +// if( (nlim-pos) % 100 == 0 ) +// { +// //progress = ( (unsigned long long)pos * (unsigned long long)nlim - (unsigned long long)pos*((unsigned long long)pos-1.0)*0.5 ) / ( (unsigned long long)nlim * ((unsigned long long)nlim-1.0) *0.5 ) * 100; +// // progress = ( (double)pos * nlim - pos*(pos-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; +// progress = ( (double)(nlim-pos) * nlim - (nlim-pos)*((nlim-pos)-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; +// reporterr( "Step %d (%d%%), thread %d \r", (nlim-pos), progress, thread_no ); +// } + + mindist = 999.9; +// for( i=pos+1; i-1; i-- ) + { +#if 0 + tmpdist = 0.0; // test! +#else + tmpdist = distfunc( bseq[pos], bseq[i], selfscore[pos], selfscore[i], alloclen ); +#endif + if( mindist > tmpdist ) + { + mindist = tmpdist; + neighbor = i; + } + } + mindists_partial[pos-start] = mindist; + neighbors_partial[pos-start] = neighbor; + } +} + +typedef struct _jobplan +{ + int node; + int start; + int end; + int subid; + int divided; + unsigned long long npairs; +} Jobplan; + + +static void flushlockinit( int my_rank ) +{ + int namelen; + int ntry; + if( my_rank == 0 ) + { +#if 0 + lockthisjobonly = 0; + struct stat st; + system( "lfs getstripe . > _lfscheck 2>/dev/null" ); + stat( "_lfscheck", &st ); + if( 1 || st.st_size == 0 ) + { + lockthisjobonly = 1; + reporterr( "Use shm lock. This job only.\n" ); + sprintf( lockfile, "/mafftflush-%s-%d", getenv( "HOSTNAME" ), getpid() ); +// reporterr( "Use filesystem's lock\n" ); +// lockfile[0]=0; +// namelen = 0; + namelen = strlen( lockfile ) + 1; + } + else + { +// lockthisjobonly = 1; +// reporterr( "Use intra-job lock.\n" ); +// sprintf( lockfile, "/tmp/mafftflush-%s-%d", getenv( "HOSTNAME" ), getpid() ); + lockthisjobonly = 0; + reporterr( "Use shm lock. Lock other jobs, too.\n" ); + sprintf( lockfile, "/mafftflush-%s", getenv( "USER" ) ); + namelen = strlen( lockfile ) + 1; + } + reporterr( "rank=%d, lockfile=%s\n", my_rank, lockfile ); +#else + lockthisjobonly = 1; + sprintf( lockfile, "/mafftflush-%s-%d", getenv( "HOSTNAME" ), getpid() ); +#ifdef enableatomic + reporterr( "Use shm, semaphore, use stdatomic.h, key=%s\n", lockfile ); +#else + reporterr( "Use shm, pthread's shared mutex or semaphore, key=%s\n", lockfile ); +#endif + namelen = strlen( lockfile ) + 1; +#endif + } + + MPI_Bcast(&namelen, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(lockfile, namelen, MPI_CHAR, 0, MPI_COMM_WORLD); + MPI_Bcast(&lockthisjobonly, 1, MPI_INT, 0, MPI_COMM_WORLD); + + +#ifdef enableatomic + lockfd = shm_open( lockfile, O_RDWR|O_CREAT|O_EXCL, 0600 ); + if( lockfd == -1 ) + { + lockfd = shm_open( lockfile, O_RDWR, 0600 ); +// reporterr( "Trying to open existing shm %s on %s, without re-ftruncate, fixed mkdircommand allocation and handling fflush failure. Fixed a bug in flushlock\n", lockfile, getenv("HOSTNAME") ); + if( lockfd == -1 ) + { + reporterr( "Failed to open %s on %s\n", lockfile, getenv("HOSTNAME") ); + exit( 1 ); + } + } + else reporterr( "Trying to create and initialize shm %s on %s\n", lockfile, getenv("HOSTNAME") ); + +// reporterr( "lockfd=%d, (rank=%d, host=%s)\n", lockfd, my_rank, getenv("HOSTNAME") ); + + if( ftruncate( lockfd, sizeof(ATOMICINT) ) != 0 ) // naito tomaru.. + { + perror("ftruncate"); + exit( 1 ); + } + + lockaddr = (ATOMICINT *)mmap( NULL, sizeof(ATOMICINT), PROT_READ|PROT_WRITE, MAP_SHARED, lockfd, 0 ); + if( lockaddr == MAP_FAILED ) + { + reporterr( "error in mmap on %s\n", getenv("HOSTNAME") ); + exit( 1 ); + } + atomic_store( lockaddr, 0 ); // nenn no tame + +#else + lockfd = shm_open( lockfile, O_RDWR|O_CREAT|O_EXCL, 0600 ); + if( lockfd == -1 ) + { +// reporterr( "Use existing lockfile in %s. Initialize it in each process\n", getenv("HOSTNAME") ); + lockfd = shm_open( lockfile, O_RDWR, 0600 ); + if( lockfd == -1 ) + { + reporterr( "Failed to open %s on %s\n", lockfile, getenv("HOSTNAME") ); + exit( 1 ); + } + createshm = 0; + } + else + { +#if SEMAPHORE + reporterr( "trying to create shm %s for semaphore, NSTREAM=%d\n", lockfile, NSTREAM ); + if( ftruncate(lockfd, sizeof(sem_t)) != 0 ) +#else + if( ftruncate(lockfd, sizeof(pthread_mutex_t)) != 0 ) +#endif + { + perror( "ftruncate" ); + exit( 1 ); + } + createshm = 1; + reporterr( "Created and truncated lockfile exclusively in %s.\n", getenv("HOSTNAME") ); + } + + for( ntry=0; ntry<10; ntry++ ) // mada ftruncate dekite naikamo shirenainode + { +// reporterr( "trying to mmap in %s\n", getenv("HOSTNAME") ); +#if SEMAPHORE + reporterr( "trying to mmap in %s for semaphore, NSTREAM=%d\n", getenv("HOSTNAME"), NSTREAM ); + lockaddr = (sem_t *)mmap( NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, lockfd, 0 ); +#else + lockaddr = (pthread_mutex_t *)mmap( NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED, lockfd, 0 ); +#endif + if( lockaddr == MAP_FAILED ) + { + perror( "mmap" ); + sleep( 1 ); + continue; + } +// reporterr( "succeeded to mmap, size= %d\n", sizeof(pthread_mutex_t) ); + break; + } + if( ntry == 10 ) + { + reporterr( "Cannot mmap %s in %s\n", lockfile, getenv("HOSTNAME") ); + exit( 1 ); + } + + if( createshm ) // hokademo shokika sureba kantan ni naru + { +#if SEMAPHORE + if( sem_init( lockaddr, 1, NSTREAM ) ) + { + perror("sem_init"); +// exit( 1 ); // POSIX.1-2001 does not always return zero. + } +#else + pthread_mutexattr_t attr; + if(pthread_mutexattr_init(&attr)) + { + perror("pthread_mutexattr_init"); + exit( 1 ); + } + if(pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) + { + perror("pthread_mutexattr_setpshared"); + exit( 1 ); + } + if(pthread_mutex_init(lockaddr, &attr)) + { + perror("pthread_mutex_init"); +// reporterr( "Probably because of duplicate initialization of shared mutex. Can be ignored.\n" ); + exit( 1 ); + } +#endif + } +#endif + + MPI_Barrier(MPI_COMM_WORLD); // shokika no mae ni tsukawareruno wo fusegu. +// reporterr( "Successfully mapped SHM %s on %s. val=%d\n", lockfile, getenv( "HOSTNAME" ), *lockaddr ); +} + +static void flushlockremove() +{ + if( lockaddr == NULL ) return; // nai + +#ifdef enableatomic + if( munmap( lockaddr, sizeof(ATOMICINT) ) ) + { + reporterr( "Failed to unmap SHM\n" ); + exit( 1 ); + } +#else +#if SEMAPHORE + if( createshm == 1 ) + { + reporterr( "sem_destroy in %s\n", getenv("HOSTNAME") ); + if( sem_destroy(lockaddr) ) + { + perror("sem_destroy"); + //exit( 1 ); // tajuu ni destroy. + } + } + if( munmap( lockaddr, sizeof(sem_t) ) ) + { + reporterr( "Failed to unmap SHM\n" ); + exit( 1 ); + } +#else +// if( pthread_mutex_destroy(lockaddr) ) +// { +// perror("pthread_mutex_destroy"); +// exit( 1 ); +// } + reporterr( "Did not destroy mutex.\n" ); + if( munmap( lockaddr, sizeof(pthread_mutex_t) ) ) + { + reporterr( "Failed to unmap SHM\n" ); + exit( 1 ); + } +#endif +#endif + + if( close( lockfd ) ) + { + perror( "close" ); + exit( 1 ); + } + if( lockthisjobonly ) + { +// if( shm_unlink( lockfile ) ) perror( "shm_unlink" ); + shm_unlink( lockfile ); // No such file -> no problem + reporterr( "Unmapped, closed and unlinked SHM.\n" ); + } + else + reporterr( "Successfully unmapped and closed SHM, but did not unlink.\n" ); +} + +static void flushlock() +{ + if( lockaddr == NULL ) return; + +#ifdef enableatomic + int interval = 10; + while( 1 ) + { + if( atomic_fetch_add( lockaddr, 1 ) < NSTREAM ) // atomic + return; + + atomic_fetch_sub( lockaddr, 1 ); // kouritsu warui? + usleep( interval * 1000 ); + interval += 10; + if( interval > 5000 ) interval = 5000; + } +#else +#if SEMAPHORE + if( sem_wait(lockaddr) ) + { + perror("sem_wait"); + exit( 1 ); + } +#else + pthread_mutex_lock(lockaddr); +#endif +#endif +} +static void flushunlock() +{ + if( lockaddr == NULL ) return; +#ifdef enableatomic + int tmpint; +// atomic_fetch_sub( lockaddr, 1 ); + if( (tmpint=atomic_fetch_sub( lockaddr, 1 )) > NSTREAM ) + { + reporterr( "Strange. *lockaddr == %d before subtraction (too large), %s\n", tmpint, getenv("HOSTNAME") ); + atomic_store( lockaddr, NSTREAM-1 ); + } + else if( tmpint < 1 ) + { + reporterr( "Strange. *lockaddr == %d before subtraction (too small), %s\n", tmpint, getenv("HOSTNAME") ); + atomic_store( lockaddr, 0 ); + } +#else +#if SEMAPHORE + if( sem_post(lockaddr) ) + { + perror("sem_post"); + exit( 1 ); + } +#else + pthread_mutex_unlock(lockaddr); +#endif +#endif +} + +typedef struct _recalcpairs4thread_arg_mpi +{ +// int thread_no; + int nseq; +// int numjob; + Jobplan *jobplan; + char **bseq; +#if EXACTLYSAMEASPAIRLOCALALIGN + char **dseq; +#endif + int *joborder; + int *posshared; + int *uselh; + double *selfscore; + int alloclen; + int ***topol; + Treedep *dep; + unsigned long long *done; + int start; + int end; + pthread_mutex_t *mutex; + int my_rank; +} recalcpairs4thread_arg_t_mpi; + + +static void *recalcpairs4thread_mpi( void *arg )// no TLS +{ + recalcpairs4thread_arg_t_mpi *targ = (recalcpairs4thread_arg_t_mpi *)arg; + char **bseq = targ->bseq; + int nseq=targ->nseq; +// int numjob=targ->numjob; + int *posshared = targ->posshared; + int *joborder = targ->joborder; + int *uselh = targ->uselh; +// int thread_no = targ->thread_no; + int ***topol = targ->topol; + Jobplan *jobplan=targ->jobplan; + Treedep *dep = targ->dep; + int alloclen = targ->alloclen; + double *selfscore = targ->selfscore;; + unsigned long long *done = targ->done; + int my_rank = targ->my_rank; + + int writetry, writeres; + +// int start = targ->start; + int end = targ->end; + + pthread_mutex_t *mutex = targ->mutex; + + int i, j, m0, m1, m00, m11, n, step, istart, iend, n1, n0, subid; + int prevn; + char *tmpseq1, *tmpseq2; + LocalHom *localhomtable; + int *mem0, *mem1; + FILE *localfp; + char *fn; + int progress = 0; + unsigned long long totalpairs = (unsigned long long)nseq*(nseq-1)/2; + int tmpnodepairs; + double **dynamicmtx = NULL; + double **mtxptr; + double (*distfunc)( double **, char *, char *, LocalHom *, double, double, int ); + int sizewritten; + void *stbuf; + + + if( alg == 'A' ) distfunc = distdp; + else if( alg == 'L' ) distfunc = distdpL; + else if( alg == 'N' ) distfunc = distdpN; + else + { + reporterr( "alg %c is not yet supported\n", alg ); + exit( 1 ); + } +#if EXACTLYSAMEASPAIRLOCALALIGN + double tmpdist; + char **dseq = targ->dseq; + double (*distfunc_noalign)( char *, char *, double, double, int ); + if( alg == 'A' ) distfunc_noalign = distdp_noalign; + else if( alg == 'L' ) distfunc_noalign = distdpL_noalign; + else if( alg == 'N' ) distfunc_noalign = distdpN_noalign; +#endif + + mem0 = calloc( sizeof( int ), njob ); + mem1 = calloc( sizeof( int ), njob ); + tmpseq1 = calloc( sizeof( char ), alloclen ); + tmpseq2 = calloc( sizeof( char ), alloclen ); + + localhomtable = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + freelocalhom1( localhomtable ); + if( specificityconsideration > 0.0 ) + { + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + mtxptr = dynamicmtx; + } + else + mtxptr = n_dis_consweight_multi; + + + prevn = -1; + while( 1 ) + { + pthread_mutex_lock( mutex ); + if( *posshared >= end ) +// if( *posshared <= -1 ) + { + pthread_mutex_unlock( mutex ); +// reporterr( "freeing tmpseq1\n" ); + free( tmpseq1 ); tmpseq1 = NULL; + free( tmpseq2 ); tmpseq2 = NULL; + free( mem0 ); mem0 = NULL; + free( mem1 ); mem1 = NULL; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + G__align11( NULL, NULL, NULL, 0, 0, 0 ); + L__align11( NULL, 0.0, NULL, NULL, 0, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); +#if EXACTLYSAMEASPAIRLOCALALIGN + L__align11_noalign( NULL, NULL, NULL ); + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); +#endif + free( localhomtable ); + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + return( NULL ); + } + n = jobplan[step=joborder[*posshared]].node; +// *posshared -= 1; + *posshared += 1; + *done += jobplan[step].npairs; +// reporterr( "nodenum=%d, step=%d, npairs=%lld\n", n, step, jobplan[step].npairs ); + pthread_mutex_unlock( mutex ); + + istart = jobplan[step].start; + iend = jobplan[step].end; + subid = jobplan[step].subid; + + +#if EXACTLYSAMEASPAIRLOCALALIGN +#else + if( specificityconsideration > 0.0 ) + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[n].distfromtip ); +#endif + + if( step%100==0 ) +// if( *done % 100 == 0 ) + { + progress = (int)( (double)*done / totalpairs * 100 ); + // reporterr( "Node %06d-%03d (%d%%) \r", n, subid, progress ); + } + + if( n != prevn ) + { + prevn = n; +#if N0LOOPFIRST +#if RECURSIVETOP + mem0[0] = -1; + n0 = topolorderz( mem0, topol, dep, n, 1 ) - mem0; + mem1[0] = -1; + n1 = topolorderz( mem1, topol, dep, n, 0 ) - mem1; +#else + topolorder_mudaari( njob, &n1, &n0, mem1, mem0, topol, dep, n ); +#endif +#else +#if RECURSIVETOP + mem0[0] = -1; + n0 = topolorderz( mem0, topol, dep, n, 0 ) - mem0; + mem1[0] = -1; + n1 = topolorderz( mem1, topol, dep, n, 1 ) - mem1; +#else + topolorder_mudaari( njob, &n0, &n1, mem0, mem1, topol, dep, n ); +#endif +#endif + } + + stbuf = malloc( MYBUFSIZE ); + if( !stbuf ) + { + reporterr( "Cannot allocate stbuf, size=d\n", MYBUFSIZE ); + exit( 1 ); + } + + fn = calloc( 100, sizeof( char ) ); + sprintf( fn, "hat3dir/%d-/hat3node-%d-%d", (int)(n/HAT3NODEBLOCK)*HAT3NODEBLOCK, n, subid ); + for( writetry=0; writetry<10; writetry++ ) + { + flushlock(); + localfp = fopen( fn, "wb" ); + if( !localfp ) + { + char *mkdircommand; + mkdircommand = calloc( sizeof( char ), 1000 ); + sprintf( mkdircommand, "mkdir -p hat3dir/%d-/", (int)(n/HAT3NODEBLOCK)*HAT3NODEBLOCK ); + system( mkdircommand ); + free( mkdircommand ); + + reporterr( "Failed to open %s but will retry (%d).\n", fn, writetry ); + + sleep( 1 ); + flushunlock(); + continue; + } + + if( setvbuf( localfp, stbuf, _IOFBF, MYBUFSIZE ) ) + { + reporterr( "Cannot change the buffer size to %d\n", MYBUFSIZE ); + flushunlock(); + exit( 1 ); + } + flushunlock(); + + sizewritten = 0; + writeres = 0; // nen no tame + tmpnodepairs = 0; + for( i=istart; i m11 ) + { + m0 = m11; m1= m00; + } + else + { + m0 = m00; m1= m11; + } + + if( nadd ) + { + if( m1 < njob-nadd ) continue; +// if( m0 >= njob-nadd || m1 < njob-nadd ) continue; // oosugi! + } + tmpnodepairs++; +// reporterr( "node%d, %d x %d\n", n, m0+1, m1+1 ); + strcpy( tmpseq1, bseq[m0] ); + strcpy( tmpseq2, bseq[m1] ); + + +#if EXACTLYSAMEASPAIRLOCALALIGN + if( specificityconsideration > 0.0 ) + { + tmpdist = distfunc_noalign( dseq[m0], dseq[m1], selfscore[m0], selfscore[m1], alloclen ); + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * tmpdist ); // upgma ni awaseru. + distfunc( dynamicmtx, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); + } + else + { + distfunc( n_dis_consweight_multi, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); + } +#else + distfunc( mtxptr, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); +#endif +// reporterr( "tmpdist = %f\n", tmpdist ); +#if N0LOOPFIRST + writeres = writehat3node_noaddress( n, m0, m1, j, i, &localfp, 'n', localhomtable, uselh ); +#else + writeres = writehat3node_noaddress( n, m0, m1, i, j, &localfp, 'n', localhomtable, uselh ); +#endif + + freelocalhom1( localhomtable ); + if( writeres == -1 ) + { + reporterr( "Failed to write %s (%d). rank=%d\n", fn, writetry, my_rank ); + reporterr( "sizewritten=%d, MYBUFSIZE=%d, writeres=%d\n", sizewritten, MYBUFSIZE, writeres ); + sleep( 10 ); + goto rewrite; + } + + sizewritten += writeres; + if( sizewritten > MYBUFSIZE - 4000 ) // avoid automatic flush + { + flushlock(); +// reporterr( "flush at the middle of a file, MYBUFSIZE=%d, sizewritten=%d, writeres=%d, file=%s\n", MYBUFSIZE, sizewritten, writeres, fn ); +// reporterr( "sizewritten=%d, flushing %s\n", sizewritten, fn ); + sizewritten = 0; + if( fflush( localfp ) ) + { + reporterr( "Failed to fflush in the middle of a file, rank=%d, hostname=%s\n", my_rank, getenv( "HOSTNAME" ) ); + system( "date" ); + sleep( 10 ); + flushunlock(); // fclose no ato no houga anzen. + continue; + } + flushunlock(); + } + + } + } + + flushlock(); + if( fflush( localfp ) ) + { + reporterr( "Failed to fflush %s. rank=%d, hostname=%s\n", fn, my_rank, getenv( "HOSTNAME" ) ); + system( "date" ); + sleep( 10 ); + //__fpurge( localfp ); + flushunlock(); // fclose no ato no houga anzen. + continue; + } +// flushunlock(); // fclose no ato no houga anzen. + + if( fclose( localfp ) ) + { + reporterr( "Failed to close %s (%d). rank=%d\n", fn, writetry, my_rank ); + sleep( 10 ); + flushunlock(); // fclose no ato no houga anzen. + continue; + } + flushunlock(); // koko no houga anzen. + +// if( !writeres ) +// { +// char com[100]; +// sprintf( com, "ls -ltr %s; hostname", fn ); +// reporterr( "wrote %s successfully, rank=%d\n", fn, my_rank ); +// system( com ); + break; +// } +// reporterr( "node = %d, tmpnodepairs = %d\n", n, tmpnodepairs ); +// + rewrite: + reporterr( "Will not close localfp. filenamd=%s, rank=%d\n", fn, my_rank ); + ; + } + + if( writetry == 10 ) + { + reporterr( "Failed to write %s 10 times in %s. Give up.\n", fn, getenv( "HOSTNAME" ) ); + system( "hostname" ); + exit( 1 ); + } + + free( stbuf ); + free( fn ); + } +} + + + +#if 0 +static void calcnearest_para( int njob, double *selfscore, char **bseq, int alloclen, int *neighbors, double *mindists ) +{ + int i; + calcnearestthread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + int posshared; + +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + +// posshared = 0; + posshared = njob-1; + targ = calloc( nthread, sizeof( calcnearestthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; injob; + const unsigned int chunksize = targ->chunksize; +// const unsigned int num_of_chunks = targ->num_of_chunks; + int *neighbors = targ->neighbors; + double *mindists = targ->mindists; + int *chunk_counter_pt = targ->chunk_counter_pt; + pthread_mutex_t *mutex_count = targ->mutex_count; + + int i; + int my_rank; + int num_of_processes; + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); + MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); + + enum {TODO,DONE,EXIT}; + MPI_Status status; + unsigned int mpi_chunk_balance = 0; +// unsigned short *const chunks_assignment = (unsigned short *)malloc(num_of_chunks*sizeof(unsigned short)); + +// const int first_child = nthread>1?0:1; + const int first_child = 1; + + pthread_mutex_lock( mutex_count ); +// if( nthread > 1 ) +// { +// fprintf( stderr, "my_rank: %d, chunks_assignment: %d, 0\n", my_rank, *chunk_counter_pt); +// (*chunk_counter_pt)--; +// } + + for(i=first_child;injob?njob:(chunk_index+1)*chunksize+1);i++) fprintf( stderr, "%d, ", neighbors[i]); + fprintf( stderr, "\n"); + #endif + MPI_Recv(&mindists[chunk_index*chunksize+1],num_of_jobs,MPI_DOUBLE,sender_id,DONE,MPI_COMM_WORLD,&status); + #if ENABLEMPIDEBUG + for(i=chunk_index*chunksize+1;i<((chunk_index+1)*chunksize>njob?njob:(chunk_index+1)*chunksize+1);i++) fprintf( stderr, "%lf, ", mindists[i]); + fprintf( stderr, "\n"); + #endif + + pthread_mutex_lock( mutex_count ); + chunk_counter = (*chunk_counter_pt)--; + pthread_mutex_unlock( mutex_count ); + + if(chunk_counter>=0){ + MPI_Send(&chunk_counter,1,MPI_INT,sender_id,TODO,MPI_COMM_WORLD); +// chunks_assignment[*chunk_counter_pt]=sender_id; + fprintf( stderr, "my_rank: %d, chunks_assignment: %d, %d\n", my_rank, chunk_counter, sender_id); + mpi_chunk_balance++; + } + mpi_chunk_balance--; + } + + for(i=first_child;imy_rank; + + const int num_thread = my_rank==0?nthread-1:nthread; + + if(num_thread>0){ + const int njob = sarg->njob; + const unsigned int chunksize = sarg->chunksize; + char **bseq = sarg->bseq; + double *selfscore = sarg->selfscore; + int alloclen = sarg->alloclen; + int *neighbors = sarg->neighbors; + double *mindists = sarg->mindists; + int *chunk_counter_pt = sarg->chunk_counter_pt; + pthread_mutex_t *mutex_count = sarg->mutex_count; + enum {TODO,DONE,EXIT}; + MPI_Status status; + int *neighbors_partial = (int *)malloc(chunksize*sizeof(int)); + double *mindists_partial = (double *)malloc(chunksize*sizeof(double)); + int i; + + calcnearestthread_arg_t_mpi *targ; + pthread_t *handle; + pthread_mutex_t mutex; + int posshared; + int chunk_index; + + while(1){ + if( my_rank == 0 ){ + pthread_mutex_lock( mutex_count ); + chunk_index = (*chunk_counter_pt)--; + pthread_mutex_unlock( mutex_count ); + if(chunk_index<0) break; + + fprintf( stderr, "my_rank: %d, chunks_assignment: %d, 0\n", my_rank, chunk_index); + + } else { + MPI_Recv(&chunk_index,1,MPI_UNSIGNED,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status); + if(status.MPI_TAG==EXIT) break; + } + + int start = chunk_index*chunksize+1; + int end = (chunk_index+1)*chunksize+1>njob?njob:(chunk_index+1)*chunksize+1; + int num_of_jobs = end-start; + + #if ENABLEMPIDEBUG + fprintf( stderr, "my_rank: %d, chunk_index: %d, start: %d, end: %d, nthread: %d\n", my_rank, chunk_index, start, end, nthread); + #endif + + posshared = end-1; + targ = calloc( num_thread, sizeof( calcnearestthread_arg_t_mpi ) ); + handle = calloc( num_thread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i=0){ +// chunk_index = (*chunk_counter_pt)--; +// }else{ +// rank0status = EXIT; // ??? +// } +// pthread_mutex_unlock( mutex_count ); +// +// if(rank0status!=EXIT) fprintf( stderr, "my_rank: %d, chunks_assignment: %d, 0\n", my_rank, chunk_index); + } + else + { + MPI_Send(&chunk_index,1,MPI_INT,0,DONE,MPI_COMM_WORLD); + MPI_Send(&num_of_jobs,1,MPI_INT,0,DONE,MPI_COMM_WORLD); + MPI_Send(neighbors_partial,num_of_jobs,MPI_UNSIGNED,0,DONE,MPI_COMM_WORLD); + MPI_Send(mindists_partial,num_of_jobs,MPI_DOUBLE,0,DONE,MPI_COMM_WORLD); +// MPI_Recv(&chunk_index,1,MPI_INT,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status); + } + } + + free(neighbors_partial); + free(mindists_partial); + } + return( NULL ); +} + +static void calcnearest_para_mpi(int njob, double *selfscore, char **bseq, int alloclen, int *neighbors, double *mindists ) +{ +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + + int my_rank; + int num_of_processes; + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); + MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); + + + if(num_of_processes*nthread < 2){ + if(my_rank==0) reporterr( "(number of processes)*(number of threads) must be more than 1\n"); + if(my_rank==0) reporterr( "number of processes: %d, number of threads: %d\n", num_of_processes, nthread ); + exit(1); + } + + const unsigned int chunksize = (njob-1)/(num_of_processes*GRANULARITY)==0?1:(njob-1)/(num_of_processes*GRANULARITY); + const unsigned int num_of_chunks = (njob-1)%chunksize==0?(njob-1)/chunksize:(njob-1)/chunksize+1; + + int chunk_counter_pt[1]; + pthread_mutex_t mutex_count; + *chunk_counter_pt = num_of_chunks-1; + calcthreads_dp1_arg_t args = { njob, chunksize, my_rank, bseq, selfscore, alloclen, neighbors, mindists, chunk_counter_pt, &mutex_count }; + + if(my_rank==0) { + pthread_t th; + fprintf( stderr, "my_rank: %d, chunksize: %u, num_of_chunks: %u\n", my_rank, chunksize, num_of_chunks); + pthread_mutex_init( &mutex_count, NULL ); +// calcthreads_dp1( (void *)&args ); + pthread_create(&th, NULL, calcthreads_dp1, (void *)&args ); // sub thread. Does not use MPI when myrank==0 + + calcnearest_para_thread_rank0_mpi_arg_t arg = {chunksize, neighbors, mindists, chunk_counter_pt, &mutex_count}; +// pthread_create(&th, NULL, calcnearest_para_thread_rank0_mpi, (void *)&arg ); + calcnearest_para_thread_rank0_mpi( (void *)&arg ); // main thread. Uses MPI + + pthread_join( th, NULL ); + pthread_mutex_destroy( &mutex_count ); + + } else { + calcthreads_dp1( (void *)&args ); // main thread. Uses MPI + } + +#if REPORTCOSTS + reporterr( "\n" ); + reporterr( "my_rank: %d, dp1, real = %f min\n", my_rank, (float)(time(NULL) - starttime)/60.0 ); + reporterr( "my_rank: %d, dp1, user = %f min\n", my_rank, (float)(clock()-startclock)/CLOCKS_PER_SEC/60); + reporterr( "my_rank: %d, dp1, ratio = %f", my_rank, (float)(clock()-startclock)/CLOCKS_PER_SEC / (time(NULL) - starttime) ); + use_getrusage(); + reporterr( "\n" ); +#endif +} + + +#if 0 +#if EXACTLYSAMEASPAIRLOCALALIGN +static void recalcpairs_para4( int njob, int ***topol, Treedep *dep, char **bseq, char **dseq, double *selfscore, int alloclen, int *uselh, int *nfilesfornode ) +#else +static void recalcpairs_para4( int njob, int ***topol, Treedep *dep, char **bseq, double *selfscore, int alloclen, int *uselh, int *nfilesfornode ) +#endif +{ + int i; + recalcpairs4thread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + int possharedn, numjob; + + int n, n0, n1, j, k, b, blocksize, blocksize0, i0, i1; + int *mem0, *mem1, *addmem; + char *mergeoralign; + Jobplan *jobplan; + double done, half; +// int donen; + unsigned long long doneull; + int nallocated; + int nnodesdivided; + int *joborder; + int subid; + double sizeav; + Pairnum *npairs; +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + + + nallocated = njob*2; + mem0 = calloc( sizeof( int ), njob ); + mem1 = calloc( sizeof( int ), njob ); + jobplan = calloc( sizeof( Jobplan), nallocated ); + mergeoralign = AllocateCharVec( njob ); + + npairs = calloc( sizeof( Pairnum ), njob ); + sizeav = 0.0; + + + if( nadd ) + { + addmem = AllocateIntVec( nadd+1 ); + for( i=0; i-1; n-- ) + for( k=0; k half ) +// if( n0 * n1 < sizeav*LHBLOCKFACTOR ) + { + blocksize0 = n0; // bunkatsu shinai + } + else +#endif + { + done += (double)npairs[k].npairs; +// blocksize0 = LHBLOCKSIZE/n1; + blocksize0 = (int)(sizeav * LHBLOCKFACTOR)/n1; + if( blocksize0 == 0 ) blocksize0 = 1; + } + +// reporterr( "blocksize0 = %d, n0=%d, n1=%d\n", blocksize0, n0, n1 ); + + if( numjob + n0/blocksize0+1 > nallocated ) + { + nallocated += n0/blocksize0+1; +// reporterr( "new nallocated = %d\n", nallocated ); + jobplan = realloc( jobplan, nallocated*sizeof( Jobplan ) ); + } + + if( n0 > blocksize0 ) + { + nnodesdivided++; +// reporterr( "node %d will be divided, because n0, %d > blocksize0, %d. nnodesdivided=%d, numjob=%d\n", n, n0, blocksize0, nnodesdivided, numjob ); + } + subid = 0; + for( b=0; b blocksize0 ) jobplan[numjob].divided = 1; + else jobplan[numjob].divided = 0; + numjob++; + subid++; + } + nfilesfornode[n] = subid; + } + + reporterr( "numjob=%d, nnodesdivided=%d, njob=%d\n", numjob, nnodesdivided, njob ); + reporterr( "Divided %d nodes to %d jobs\n", nnodesdivided, numjob-(njob-1) ); + + joborder = calloc( sizeof( int ), numjob ); + for( i=0; inumjob; +// const unsigned int chunksize = targ->chunksize; + const unsigned int num_of_chunks = targ->num_of_chunks; + int *chunk_counter_pt = targ->chunk_counter_pt; + pthread_mutex_t *mutex_count = targ->mutex_count; + + int i; + int my_rank; + int num_of_processes; + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); + MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); + + enum {TODO,DONE,EXIT}; + MPI_Status status; + unsigned int mpi_chunk_balance = 0; +// int chunk_counter = 0; +// unsigned short *const chunks_assignment = (unsigned short *)malloc(num_of_chunks*sizeof(unsigned short)); + +// const int first_child = nthread>1?0:1; + const int first_child = 1; + + pthread_mutex_lock( mutex_count ); +// if( nthread > 1 ) +// { +// fprintf( stderr, "my_rank: %d, chunks_assignment: %d, 0\n", my_rank, *chunk_counter_pt); +// (*chunk_counter_pt)++; +// } + + for(i=first_child;i=num_of_chunks) break; + MPI_Send(chunk_counter_pt,1,MPI_UNSIGNED,i,TODO,MPI_COMM_WORLD); +// chunks_assignment[*chunk_counter_pt]=i; + fprintf( stderr, "my_rank: %d, chunks_assignment: %d, %d\n", my_rank, *chunk_counter_pt, i); + (*chunk_counter_pt)++; + mpi_chunk_balance++; + } + pthread_mutex_unlock( mutex_count ); + + + while(mpi_chunk_balance){ + unsigned int chunk_index; + unsigned int chunk_counter; + MPI_Recv(&chunk_index,1,MPI_UNSIGNED,MPI_ANY_SOURCE,DONE,MPI_COMM_WORLD,&status); + int sender_id = status.MPI_SOURCE; + mpi_chunk_balance--; + + pthread_mutex_lock( mutex_count ); + chunk_counter = (*chunk_counter_pt)++; + pthread_mutex_unlock( mutex_count ); + + if(chunk_countermy_rank; + + const int num_thread = my_rank==0?nthread-1:nthread; + + if(num_thread>0){ + const int njob = sarg->njob; + const int numjob = sarg->numjob; + const unsigned int chunksize = sarg->chunksize; + const unsigned int num_of_chunks = sarg->num_of_chunks; + char **bseq = sarg->bseq; +#if EXACTLYSAMEASPAIRLOCALALIGN + char **bseq = sarg->dseq; +#endif + double *selfscore = sarg->selfscore; + int alloclen = sarg->alloclen; + int *joborder = sarg->joborder; + int *uselh = sarg->uselh; + int ***topol = sarg->topol; + Treedep *dep = sarg->dep; + Jobplan *jobplan = sarg->jobplan; + int *chunk_counter_pt = sarg->chunk_counter_pt; + pthread_mutex_t *mutex_count = sarg->mutex_count; + enum {TODO,DONE,EXIT}; + MPI_Status status; + int i; + int possharedn; + unsigned long long doneull; + + recalcpairs4thread_arg_t_mpi *targ; + pthread_t *handle; + pthread_mutex_t mutex; + + int chunk_index; + while(1){ + if( my_rank == 0 ) { + pthread_mutex_lock( mutex_count ); + chunk_index = (*chunk_counter_pt)++; + pthread_mutex_unlock( mutex_count ); + if(chunk_index>=num_of_chunks) break; + + fprintf( stderr, "my_rank: %d, chunks_assignment: %d, 0\n", my_rank, chunk_index); + } else { + MPI_Recv(&chunk_index,1,MPI_UNSIGNED,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status); + if (status.MPI_TAG==EXIT) break; + } + + int start = chunk_index*chunksize; + int end = (chunk_index+1)*chunksize>numjob?numjob:(chunk_index+1)*chunksize; + + #if ENABLEMPIDEBUG + fprintf( stderr, "my_rank: %d, chunk_index: %d, start: %d, end: %d, nthread: %d\n", my_rank, chunk_index, start, end, nthread); + #endif + + // possharedn = numjob-1; + possharedn = start; + doneull = 0; + targ = calloc( num_thread, sizeof( recalcpairs4thread_arg_t_mpi ) ); + handle = calloc( num_thread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i 7.383 + + + if( my_rank == 0 ) + { +// qsort( npairspt, njob-1, sizeof( Pairnum * ), compfuncpairpt ); +// for( i=0; inum; + for( i=0; inum; + } + + MPI_Bcast( norder, njob-1, MPI_INT, 0, MPI_COMM_WORLD ); + + if( nadd ) free( addmem ); + +// for( i=0; i-1; n-- ) + for( i=0; i (double)MINBLOCKLEN2 ) + { + blocksize0 = (int)( (double)MINBLOCKLEN2/n1/lenav/lenav ); + if( blocksize0 == 0 ) blocksize0 = 1; +// reporterr( "dividing node %d, size=%f, size*len2=%f > %f\n", n, (double)n0*n1, (double)n0*n1*lenav*lenav, MINBLOCKLEN2 ); +// reporterr( "blocksize0=%d, n0=%d, n1=%d\n", blocksize0, n0, n1 ); + } + else + { + blocksize0 = n0; +// reporterr( "did not divide node %d, size=n1*n2=%f, size*len2=%f < %f\n", n, (double)n0*n1, (double)n0*n1*lenav*lenav, MINBLOCKLEN2 ); + } +#endif + } + +// reporterr( "blocksize0 = %d, n0=%d, n1=%d\n", blocksize0, n0, n1 ); + + if( numjob + n0/blocksize0+1 > nallocated ) + { + nallocated += n0/blocksize0+1; +// reporterr( "new nallocated = %d\n", nallocated ); + jobplan = realloc( jobplan, nallocated*sizeof( Jobplan ) ); + } + + if( n0 > blocksize0 ) + { + nnodesdivided++; +// reporterr( "node %d will be divided, because n0, %d > blocksize0, %d. nnodesdivided=%d, numjob=%d\n", n, n0, blocksize0, nnodesdivided, numjob ); + } + subid = 0; + for( b=0; b blocksize0 ) jobplan[numjob].divided = 1; + else jobplan[numjob].divided = 0; + numjob++; + subid++; + } + nfilesfornode[n] = subid; + } + + reporterr( "my_rank: %d, numjob=%d, nnodesdivided=%d, njob=%d\n", my_rank, numjob, nnodesdivided, njob ); + reporterr( "my_rank: %d, Divided %d nodes to %d jobs\n", my_rank, nnodesdivided, numjob-(njob-1) ); + + joborder = calloc( sizeof( int ), numjob ); + for( i=0; inumjob, 2016/Mar/3 + + + +// for( i=0; i-1; i-- ) +#else + tmpdist = mindists[1]; + treept[0].parent = treept+n; + treept[1].parent = treept+n; + treept[n].child0 = treept+0; + treept[n].child1 = treept+1; + treept[n].height = tmpdist * 0.5; + treept[n].len0 = tmpdist * 0.5; + treept[n].len1 = tmpdist * 0.5; + treept[n].parent = NULL; + treept[n].rep0 = 0; + treept[n].rep1 = 1; + root = treept+n; + for( i=2; iparent; p!=NULL; b=p,p=p->parent ) + { +// reporterr( "checking %p->%p (height=%f)\n", b, p, p->height ); + if( p->height > mindist * 0.5 ) break; + } + + if( p == NULL ) + { + treept[n].parent = NULL; + root = treept+n; + } + else if( p->child0 == b ) + { + p->child0 = treept+n; + p->len0 = p->height-mindist*0.5; + treept[n].parent = p; + } + else if( p->child1 == b ) + { + p->child1 = treept+n; + p->len1 = p->height-mindist*0.5; + treept[n].parent = p; + } + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + + treept[i].parent = treept+n; + b->parent = treept+n; + + treept[n].child0 = b; + treept[n].child1 = treept+i; + treept[n].height = mindist * 0.5; + treept[n].rep0 = b->rep0; + treept[n].rep1 = treept[i].rep0; + treept[n].len0 = mindist*0.5-b->height; + treept[n].len1 = mindist*0.5; + } + reformattree( root, treept, njob, topol, len, dep, name, treeout, 0 ); // 2017/Mar/6 + + free( treept ); +// free( neighbors ); +// free( mindists ); +} + + +void compacttreedpdist( int njob, char **bseq, char **dseq, double *selfscore, int ***topol, double **len, char **name, Treedep *dep, int treeout, int alloclen, int *uselh, int *nfilesfornode, int treegiven ) +{ + int i, neighbor, n; + double tmpdist; + double mindist; +// int *commonanc; + + int my_rank; + int num_of_processes; + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); + MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); + + if( !treegiven ) + { + Treept *treept = NULL; + Treept *p, *b; + Treept *root; + int *neighbors; + double *mindists; + neighbors = calloc( sizeof( int ), njob ); + mindists = calloc( sizeof( double ), njob ); + + // calcnearest_para( njob, selfscore, dseq, alloclen, neighbors, mindists ); + calcnearest_para_mpi( njob, selfscore, dseq, alloclen, neighbors, mindists ); + MPI_Bcast(neighbors, njob, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(mindists, njob, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + #if ENABLEMPIDEBUG + if(my_rank==0){ + for(i=0;i-1; i-- ) +#else +// commonanc = (int *)calloc( njob, sizeof( int ) ); + tmpdist = mindists[1]; +// reporterr( "tmpdist = %f\n", tmpdist ); +// reporterr( "%f ?= %f\n", tmpdist, distfromfile( njob, njob-2, njob-1, hat2fp ) ); +// reporterr( "%f ?= %f\n", tmpdist, mindists[njob-2] ); + treept[0].parent = treept+n; + treept[1].parent = treept+n; + treept[n].child0 = treept+0; + treept[n].child1 = treept+1; + treept[n].height = tmpdist * 0.5; + treept[n].len0 = tmpdist * 0.5; + treept[n].len1 = tmpdist * 0.5; + treept[n].parent = NULL; + treept[n].rep0 = 0; + treept[n].rep1 = 1; + root = treept+n; + + for( i=2; iparent; p!=NULL; b=p,p=p->parent ) + { +// reporterr( "checking %p->%p (height=%f)\n", b, p, p->height ); + if( p->height > mindist * 0.5 ) break; + } + + if( p == NULL ) + { + treept[n].parent = NULL; + root = treept+n; + } + else if( p->child0 == b ) + { + p->child0 = treept+n; + p->len0 = p->height-mindist*0.5; + treept[n].parent = p; + } + else if( p->child1 == b ) + { + p->child1 = treept+n; + p->len1 = p->height-mindist*0.5; + treept[n].parent = p; + } + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + + treept[i].parent = treept+n; + b->parent = treept+n; + + treept[n].child0 = b; + treept[n].child1 = treept+i; + treept[n].height = mindist * 0.5; + treept[n].rep0 = b->rep0; + treept[n].rep1 = treept[i].rep0; + treept[n].len0 = mindist*0.5-b->height; + treept[n].len1 = mindist*0.5; + } + reformattree( root, treept, njob, topol, len, dep, name, treeout, my_rank ); // 2017/Mar/6 + + free( treept ); + free( neighbors ); + free( mindists ); + } + else + { + reporterr( "treegiven\n" ); + } + +#if EXACTLYSAMEASPAIRLOCALALIGN + recalcpairs_para4_mpi( njob, topol, dep, bseq, dseq, selfscore, alloclen, uselh, nfilesfornode ); + // recalcpairs_para4( njob, topol, dep, bseq, dseq, selfscore, alloclen, uselh, nfilesfornode ); +#else + recalcpairs_para4_mpi( njob, topol, dep, bseq, selfscore, alloclen, uselh, nfilesfornode ); + // recalcpairs_para4( njob, topol, dep, bseq, selfscore, alloclen, uselh, nfilesfornode ); +#endif +#if HAT3SORTED +// recalcpairs_para2( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); +#else +// recalcpairs_para3( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); +#endif +// recalcpairs( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); + + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // 20130603 + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + + #if ENABLEMPIDEBUG + reporterr("my_rank: %d, end compacttreedpdist\n", my_rank); + #endif +// free( commonanc ); +// commonsextet_p( NULL, NULL ); +// distdppairs_para( 0, 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL ); +// distdppairsthread( NULL ); +} + +void compacttree_memsaveselectable( int nseq, double **partmtx, int *nearest, double *mindist, int **pointt, int *tselfscore, char **seq, int **skiptable, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int howcompact, int memsave ) +{ + int i, j, k; +// int miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; +// double tmpdouble; +// double eff1, eff0; + double *tmptmplen = NULL; //static? + int *hist = NULL; //static? + Bchain *ac = NULL; //static? + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; //static? + int nmemim, nmemjm; + double minscore; + char **tree; //static? + char *treetmp; //static? + char *nametmp, *nameptr, *tmpptr; //static? + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + int *singlettable1 = NULL; + int *singlettable2 = NULL; + double *newarr; + void *(*distarrfunc)( void * ); + void *(*resetnearestfunc)( void * ); + int numfilled; + int nthreadtree; + compactdistarrthread_arg_t *distarrarg; + resetnearestthread_arg_t *resetarg; + int *joblist, nactive, posshared; + double *result; + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( howcompact == 2 ) + { + if( seq ) + { +// distarrfunc = verycompactmsadistarrthread; + distarrfunc = verycompactmsadistarrthreadjoblist; + resetnearestfunc = NULL; + } + else + { +// distarrfunc = verycompactkmerdistarrthread; + distarrfunc = verycompactkmerdistarrthreadjoblist; + resetnearestfunc = NULL; + } + } + else + { + if( seq ) + { + distarrfunc = msadistarrthreadjoblist; + resetnearestfunc = msaresetnearestthread; + } + else + { + distarrfunc = kmerdistarrthreadjoblist; + resetnearestfunc = kmerresetnearestthread; + } + } + distarrarg = calloc( MAX( nthread, 1 ), sizeof( compactdistarrthread_arg_t ) ); + resetarg = calloc( MAX( nthread, 1 ), sizeof( resetnearestthread_arg_t ) ); + joblist = calloc( njob, sizeof( int ) ); + if( howcompact != 2 ) result = calloc( njob, sizeof( double ) ); + else result = NULL; + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + if( treeout ) + { + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( njob, 0 ); + } + } + + + if( treeout ) + { + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + } + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "k=%d i=%d, mindist[i]=%f\n", k, i, mindist[i] ); + if( mindist[i] < minscore ) // muscle + { + im = i; + minscore = mindist[i]; + } + } +// printf( "minscore=%f\n", minscore ); + jm = nearest[im]; +// printf( "im=%d\n", im ); +// printf( "jm=%d\n", jm ); + + + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + if( partmtx[im] == NULL && howcompact != 2 ) numfilled++; + if( partmtx[jm] != NULL ) numfilled--; + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + if( memsave ) + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave + else + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); // memsave + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } + if( memsave ) + { + *intpt++ = *pt11; + *intpt = -1; + } + else + { + reporterr( "This version supports memsave=1 only\n" ); // fukkatsu saseru tokiha pt22 wo dainyu. + exit( 1 ); + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + if( memsave ) + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); // memsave + else + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); // memsave + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } + if( memsave ) + { + *intpt++ = *pt11; + *intpt = -1; + } + else + { + reporterr( "This version supports memsave=1 only\n" ); // fukkatsu saseru tokiha pt22 wo dainyu. + exit( 1 ); + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + } + + minscore *= 0.5; + +// printf( "minscore = %f, tmptmplen[im] = %f, tmptmplen[jm] = %f\n", minscore, tmptmplen[im], tmptmplen[jm] ); + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + mindist[im] = 999.9; + + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + singlettable2 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[im] ); + makecompositiontable_global( singlettable2, pointt[jm] ); + } + + newarr = calloc( nseq, sizeof( double ) ); + +// nthreadtree = MAX( 1, nthread ); + nthreadtree = nthread; + + + for( acpti=ac,nactive=0; acpti!=NULL; acpti=acpti->next ) joblist[nactive++] = acpti->pos; // sukoshi muda... + + +#ifdef enablemultithread + if( nthreadtree > 0 ) + { + compactdistarrthread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + + posshared = 0; +// targ = calloc( nthreadtree, sizeof( compactdistarrthread_arg_t ) ); + targ = distarrarg; + handle = calloc( nthreadtree, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + if( k % 100 == 0 ) reporterr( " (%d threads, nactive=%d, nfilled=%d) \r", nthreadtree, nactive, numfilled ); + for( i=0; inext ) // antei sei no tame + { + i = acpti->pos; + if( i != im && i != jm ) + { +// if( partmtx[i] ) partmtx[i][im] = partmtx[i][jm] = newarr[i]; // heiretsu demo ii. +// if( newarr[i] < mindist[i] ) +// { +// mindist[i] = newarr[i]; +// nearest[i] = im; +// } + if( newarr[i] < mindist[im] ) + { + mindist[im] = newarr[i]; + nearest[im] = i; + } +// if( nearest[i] == jm ) +// { +// nearest[i] = im; +// } + } + } +#endif + } + else +#endif + { + if( k % 100 == 0 ) reporterr( " (serial, nactive=%d, nfilled=%d) \r", nactive, numfilled ); + compactdistarrthread_arg_t *targ; + + posshared = 0; +// targ = calloc( 1, sizeof( compactdistarrthread_arg_t ) ); + targ = distarrarg; + + for( i=0; i<1; i++ ) + { + targ[i].para = 0; + targ[i].njob = nactive; +// targ[i].thread_no = i; + targ[i].im = im; + targ[i].jm = jm; + targ[i].tselfscore = tselfscore; + targ[i].nlen = nlen; + targ[i].seq = seq; + targ[i].skiptable = skiptable; + targ[i].pointt = pointt; + targ[i].table1 = singlettable1; + targ[i].table2 = singlettable2; + targ[i].joblist = joblist; + targ[i].posshared = &posshared; + targ[i].mindist = mindist; + targ[i].nearest = nearest; + targ[i].newarr = newarr; + targ[i].partmtx = partmtx; + + distarrfunc( targ+i ); +// pthread_create( handle, NULL, distarrfunc, (void *)(targ) ); + } + +// free( targ ); + + } + + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) // antei sei no tame + { + i = acpti->pos; + if( i != im && i != jm ) + { +// if( partmtx[i] ) partmtx[i][im] = partmtx[i][jm] = newarr[i]; // heiretsu demo ii. +// if( newarr[i] < mindist[i] ) +// { +// mindist[i] = newarr[i]; +// nearest[i] = im; +// } + if( newarr[i] < mindist[im] ) + { + mindist[im] = newarr[i]; + nearest[im] = i; + } +// if( nearest[i] == jm ) +// { +// nearest[i] = im; +// } + } + } + +// printf( "im=%d, jm=%d\n", im, jm ); +#if 0 + printf( "matrix = \n" ); + for( i=0; inext = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + +#if 0 // muscle seems to miss this. +// int nwork = 0; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "reset nearest? i=%d, k=%d, nearest[i]=%d, im=%d, mindist=%f\n", i, k, nearest[i], im, mindist[i] ); + if( nearest[i] == im ) + { +// printf( "reset nearest, i=%d, k=%d\n", i, k ); + if( partmtx[im][i] > mindist[i] ) + { +// nwork++; +// printf( "go\n" ); + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[i] ); + } + resetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, seq, skiptable, tselfscore, pointt, nlen, singlettable1 ); + if( pointt ) free( singlettable1 ); singlettable1 = NULL;// kmer + if( pointt ) commonsextet_p( NULL, NULL ); + } + } + } +// reporterr( "nwork = %d\n", nwork ); +#else + + if( howcompact == 2 ) continue; + +#if 0 + if( 0 && nthreadtree > 0 ) + { + resetnearestthread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + Bchain *acshared; + + acshared = ac; +// targ = calloc( nthreadtree, sizeof( resetnearestthread_arg_t ) ); + targ = resetarg; + handle = calloc( nthreadtree, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i]+1 ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i]+1 ); + printf( "\n" ); +#endif + } + if( treeout ) + { + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + } + + for( im=0; im _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "k=%d i=%d, mindist[i]=%f\n", k, i, mindisfrom[i] ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + +// printf( "minscore=%f\n", minscore ); + jm = nearest[im]; +// printf( "im=%d\n", im ); +// printf( "jm=%d\n", jm ); + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 // memsave + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); // memsave + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 // memsave + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + minscore *= 0.5; + +// printf( "minscore = %f, tmptmplen[im] = %f, tmptmplen[jm] = %f\n", minscore, tmptmplen[im], tmptmplen[jm] ); + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); +// printf( "tmpdouble=%f, eff0=%f, eff1=%f\n", tmpdouble, eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } +// printf( "im=%d, jm=%d\n", im, jm ); +#if 0 + printf( "matrix = \n" ); + for( i=0; ij ) + { + minijm=j; + maxijm=i; + } + else + { + minijm=i; + maxijm=j; + } + printf( "%f ", eff[minijm][maxijm-minijm] ); + } + printf( "\n" ); + } +#endif + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; // Ato de fukkatsu + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "reset nearest? i=%d, k=%d, nearest[i]=%d, im=%d, mindist=%f\n", i, k, nearest[i], im, mindisfrom[i] ); + if( nearest[i] == im ) + { +// printf( "reset nearest, i=%d, k=%d\n", i, k ); + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + { +// printf( "go\n" ); + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } + } +#else + reporterr( "CHUUI!\n" ); +#endif + + + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + if( treeout == 2 ) + { + int *mem = calloc( sizeof( int ), nseq ); + fprintf( fp, "\nDensity:" ); + for( k=0; k-1; i++ ) fprintf( fp, " %03d", topol[k][0][i]+1 ); + fprintf( fp, "%d:", getdensest( mem, density )+1 ); + for( i=0; mem[i]>-1; i++ ) fprintf( fp, " %d", mem[i]+1 ); + fprintf( fp, "\n" ); + + topolorderz( mem, topol, dep, k, 1 ); +// fprintf( fp, "len1 = %f\n", len[k][1] ); +// for( i=0; topol[k][1][i]>-1; i++ ) fprintf( fp, " %03d", topol[k][1][i]+1 ); + fprintf( fp, "%d:", getdensest( mem, density )+1 ); + for( i=0; mem[i]>-1; i++ ) fprintf( fp, " %d", mem[i]+1 ); + fprintf( fp, "\n" ); + } + free( mem ); + } + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + if( treeout == 2 ) free( density ); +} + + +void fixed_musclesupg_double_realloc_nobk_halfmtx_treeout( int nseq, double **eff, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int efffree ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + double *tmptmplen = NULL; //static? + int *hist = NULL; //static? + Bchain *ac = NULL; //static? + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; //static? + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + char **tree; //static? + char *treetmp; //static? + char *nametmp, *nameptr, *tmpptr; //static? + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); + + +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#else + reporterr( "chuui!\n" ); +#endif + + +#if 0 + printf( "\nooSTEP-%03d:\n", k+1 ); + printf( "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) printf( " %03d", topol[k][0][i]+1 ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i]+1 ); + printf( "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + +void fixed_musclesupg_double_treeout( int nseq, double **eff, int ***topol, double **len, char **name ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + static int *nmemar; + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + static char **tree; + static char *treetmp; + static char *nametmp, *nameptr, *tmpptr; + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + + + sueff1 = 1.0 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + + + + +#if 0 + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); + treetmp = AllocateCharVec( njob*150 ); + nametmp = AllocateCharVec( 91 ); + tree = AllocateCharMtx( njob, njob*150 ); + } + for( i=0; i _ no tame + + sprintf( tree[i], "\n%d_%.60s\n", i+1, nameptr ); + } + +#else + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + +#endif + + + + + + + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + nmemim = nmemar[im]; +// intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + intpt = topol[k][0]; + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + nmemjm = nmemar[jm]; +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + intpt = topol[k][1]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; +#if 0 + tmpdouble = eff[miniim][maxiim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } +#if 0 + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#else + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); +#endif + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim] > mindisfrom[i] ) + setnearest_double_fullmtx( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "\nvSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); +#if 0 + FreeCharMtx( tree ); +#else + free( tree[0] ); + free( tree ); +#endif + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + +void fixed_supg_double_treeout_constrained( int nseq, double **eff, int ***topol, double **len, char **name, int ngroup, int **groups ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti, *acptj; + int *pt1, *pt2, *pt11, *pt22; + static int *nmemar; + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + static char **tree; + static char *treetmp; + static char *nametmp, *nameptr, *tmpptr; + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + int *testtopol, **inconsistent; + int **inconsistentpairlist; + int ninconsistentpairs; + int *warned; + int allinconsistent; + int firsttime; + + increaseintergroupdistancesfullmtx( eff, ngroup, groups, nseq ); + + sueff1 = 1 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + + + + +#if 0 + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); + treetmp = AllocateCharVec( njob*150 ); + nametmp = AllocateCharVec( 91 ); + tree = AllocateCharMtx( njob, njob*150 ); + } + for( i=0; i _ no tame + + sprintf( tree[i], "\n%d_%.60s\n", i+1, nameptr ); + } + +#else + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + testtopol = AllocateIntVec( njob + 1 ); + inconsistent = AllocateIntMtx( njob, njob ); // muda +// inconsistentpairlist = AllocateIntMtx( njob*(njob-1)/2+1, 2 ); // muda + inconsistentpairlist = AllocateIntMtx( 1, 2 ); + warned = AllocateIntVec( ngroup ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + +#endif + + + + + + + + + for( i=0; inext!=NULL; acpti=acpti->next ) for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) inconsistent[acpti->pos][acptj->pos] = 0; + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + } + else + { + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[i][j] && (tmpdouble=eff[i][j]) < minscore ) + { + minscore = tmpdouble; + im = i; jm = j; + } + } + for( acptj=ac; (acptj&&acptj->pos!=i); acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[j][i] && (tmpdouble=eff[j][i]) < minscore ) + { + minscore = tmpdouble; + im = j; jm = i; + } + } + } + } + + allinconsistent = 1; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + if( inconsistent[acpti->pos][acptj->pos] == 0 ) + { + allinconsistent = 0; + goto exitloop_d; + } + } + } + exitloop_d: + + if( allinconsistent ) + { + reporterr( "\n\n\nPlease check whether the grouping is possible.\n\n\n" ); + exit( 1 ); + } +#if 1 + intpt = testtopol; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + *intpt = -1; +// reporterr( "testtopol = \n" ); +// for( i=0; testtopol[i]>-1; i++ ) reporterr( " %03d", testtopol[i]+1 ); +// reporterr( "\n" ); +#endif + for( i=0; i-1; j++ ) reporterr( " %03d", groups[i][j]+1 ); +// reporterr( "\n" ); + if( overlapmember( testtopol, groups[i] ) ) + { + if( !includemember( testtopol, groups[i] ) && !includemember( groups[i], testtopol ) ) + { + if( !warned[i] ) + { + warned[i] = 1; + reporterr( "\n###################################################################\n" ); + reporterr( "# WARNING: Group %d is forced to be a monophyletic cluster.\n", i+1 ); + reporterr( "###################################################################\n" ); + } + inconsistent[im][jm] = 1; + + inconsistentpairlist = realloc( inconsistentpairlist, (ninconsistentpairs+1)*sizeof( int * ) ); + inconsistentpairlist[ninconsistentpairs] = malloc( sizeof( int ) * 2 ); + inconsistentpairlist[ninconsistentpairs][0] = im; + inconsistentpairlist[ninconsistentpairs][1] = jm; + ninconsistentpairs++; + break; + } + } + } + if( i == ngroup ) + { +// reporterr( "OK\n" ); + break; + } + } + + + + + + + prevnode = hist[im]; + nmemim = nmemar[im]; +// intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + intpt = topol[k][0]; + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + nmemjm = nmemar[jm]; +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + intpt = topol[k][1]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + eff[im][jm] = 999.9; +// eff[im][jm-im] = 999.9; // bug?? + + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; +#if 0 + tmpdouble = eff[miniim][maxiim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif + +#if 1 + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } +#endif + } + } +#if 0 + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#else + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); +#endif + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim] > mindisfrom[i] ) + setnearest_double_fullmtx( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "\ncSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); +#if 0 + FreeCharMtx( tree ); +#else + free( tree[0] ); + free( tree ); +#endif + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + free( testtopol ); + FreeIntMtx( inconsistent ); + FreeIntMtx( inconsistentpairlist ); + free( warned ); +} + +void fixed_musclesupg_double_realloc_nobk_halfmtx_memsave( int nseq, double **eff, int ***topol, double **len, Treedep *dep, int progressout, int efffree ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt; + double tmpdouble; + double eff1, eff0; + double *tmptmplen = NULL; // static TLS -> local, 2012/02/25 + int *hist = NULL; // static TLS -> local, 2012/02/25 + Bchain *ac = NULL; // static TLS -> local, 2012/02/25 + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11; + int *nmemar; // static TLS -> local, 2012/02/25 + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by Mathog, a guess + double *mindisfrom = NULL; // by Mathog, a guess + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave +// intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; + tmpdouble = eff[miniim][maxiim-miniim] = +#if 0 + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "vSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} +void fixed_musclesupg_double_realloc_nobk_halfmtx( int nseq, double **eff, int ***topol, double **len, Treedep *dep, int progressout, int efffree ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + double *tmptmplen = NULL; // static TLS -> local, 2012/02/25 + int *hist = NULL; // static TLS -> local, 2012/02/25 + Bchain *ac = NULL; // static TLS -> local, 2012/02/25 + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; // static TLS -> local, 2012/02/25 + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by Mathog, a guess + double *mindisfrom = NULL; // by Mathog, a guess + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; + tmpdouble = eff[miniim][maxiim-miniim] = +#if 0 + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "vSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + + + + + + + + + +void veryfastsupg_double_loadtree( int nseq, double **eff, int ***topol, double **len, char **name ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double eff1, eff0; + int *hist = NULL; + Achain *ac = NULL; + double minscore; + char **tree; + char *treetmp; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + FILE *fp; + int node[2]; + double lenfl[2]; + char *nametmp, *nameptr, *tmpptr; //static? + char namec; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + + if( !hist ) + { +// treetmp = AllocateCharVec( njob*50 ); + treetmp = NULL; +// tree = AllocateCharMtx( njob, njob*50 ); + tree = AllocateCharMtx( njob, 0 ); + nametmp = AllocateCharVec( 1000 ); // nagasugi + hist = AllocateIntVec( njob ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + for( i=0; i nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + +// reporterr( "im=%d, jm=%d, minscore = %f\n", im, jm, minscore ); + + + if( lenfl[0] == -1.0 || lenfl[1] == -1.0 ) + { + reporterr( "\n\nWARNING: Branch length is not given.\n" ); + exit( 1 ); + } + + if( lenfl[0] < 0.0 ) lenfl[0] = 0.0; + if( lenfl[1] < 0.0 ) lenfl[1] = 0.0; +#endif + +// reporterr( "im=%d, jm=%d\n", im, jm ); + + intpt = topol[k][0]; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + +#if 0 + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; +#else + len[k][0] = lenfl[0]; + len[k][1] = lenfl[1]; +#endif + + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + + ( eff0 + eff1 ) * 0.5 * sueff_global; + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; + + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); +// strcpy( tree[im], treetmp ); + +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } + fclose( fp ); + + + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); +// fprintf( fp, "by veryfastsupg_double_loadtree\n" ); + fclose( fp ); + +#if 1 + reporterr( "\n" ); + free( hist ); + free( (char *)ac ); + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); +#endif + +#if 0 +// reporterr( "reconstructing eff[][]\n" ); // Tsune ni hat2 ha aru node koreha iranai. + for( k=0; k-1; i++ ) + { + reporterr( " %03d", im ); + } + fprintf( stdout, "\n" ); + for( i=0; (jm=topol[k][1][i])>-1; i++ ) + { + reporterr( " %03d", jm ); + } + for( i=0; (im=topol[k][0][i])>-1; i++ ) for( j=0; (jm=topol[k][1][j])>-1; j++ ) + { + eff[im][jm] += len[k][0] + len[k][1]; + eff[jm][im] += len[k][0] + len[k][1]; + } + } +#endif +} + +#if 0 +void veryfastsupg_double( int nseq, double **eff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + double minscore; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; + + tmptmplen[im] = minscore; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + + ( eff0 + eff1 ) * 0.5 * sueff_global; + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } +#if 1 + reporterr( "\n" ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; +#endif +} +#endif + +void veryfastsupg_double_outtree( int nseq, double **eff, int ***topol, double **len, char **name ) // not used +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + double minscore; + static char **tree; + static char *treetmp; + static char *nametmp; + FILE *fpout; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + treetmp = AllocateCharVec( njob*50 ); + tree = AllocateCharMtx( njob, njob*50 ); + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + nametmp = AllocateCharVec( 31 ); + } + +// for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; + + tmptmplen[im] = minscore; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; + + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } + fpout = fopen( "infile.tree", "w" ); + fprintf( fpout, "%s;\n", treetmp ); +// fprintf( fpout, "by veryfastsupg_double_outtree\n" ); + fclose( fpout ); +#if 1 + reporterr( "\n" ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); +#endif +} + +void veryfastsupg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + int tmpint; + int eff1, eff0; + static double *tmptmplen = NULL; + static int **eff = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + int minscore; + double minscoref; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + if( !eff ) + { + eff = AllocateIntMtx( njob, njob ); + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } +#else + intpt = topol[k][0]; + for( i=0; i -2 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i -2 ) + *intpt++ = i; + *intpt = -1; +#endif + + len[k][0] = minscoref - tmptmplen[im]; + len[k][1] = minscoref - tmptmplen[jm]; + + tmptmplen[im] = minscoref; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + // int?? + ( eff0 + eff1 ) * 0.5 * sueff_global; // int?? + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } +#if 1 + FreeIntMtx( eff ); eff = NULL; + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; +#endif +} + +void fastsupg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + static double *tmplen; + int *intpt; + double tmpdouble; + double eff1, eff0; + static double **eff = NULL; + static char **pair = NULL; + static Achain *ac; + double minscore; + int im = -1, jm = -1; + if( !eff ) + { + eff = AllocateFloatMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + tmplen = AllocateFloatVec( njob ); + ac = (Achain *)calloc( njob, sizeof( Achain ) ); + } +#endif + + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + minscore /= 2.0; + + len[k][0] = (double)minscore - tmplen[im]; + len[k][1] = (double)minscore - tmplen[jm]; + + tmplen[im] = (double)minscore; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) reporterr( " %03d", topol[k][0][i] ); + reporterr( "\n" ); + reporterr( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) reporterr( " %03d", topol[k][1][i] ); + reporterr( "\n" ); +#endif + } + reporterr( "\n" ); + +// FreeFloatMtx( eff ); +// FreeCharMtx( pair ); +// FreeFloatVec( tmplen ); +// free( ac ); +} +void supg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + static double *tmplen; + int *intpt; + double **doubleptpt; + double *doublept; + double tmpdouble; + double eff1, eff0; + static double **eff = NULL; + static char **pair = NULL; + if( !eff ) + { + eff = AllocateFloatMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + tmplen = AllocateFloatVec( njob ); + } +#endif + + + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + len[k][0] = (double)minscore / 2.0 - tmplen[im]; + len[k][1] = (double)minscore / 2.0 - tmplen[jm]; + + tmplen[im] = (double)minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +void spg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k; + double tmplen[M]; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + double **eff = NULL; + char **pair = NULL; + if( !eff ) + { + eff = AllocateDoubleMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + } +#endif + + for( i=0; i 0 ) + { + topol[k][0][count] = i; + count++; + } + topol[k][0][count] = -1; + for( i=0, count=0; i 0 ) + { + topol[k][1][count] = i; + count++; + } + topol[k][1][count] = -1; + + len[k][0] = minscore / 2.0 - tmplen[im]; + len[k][1] = minscore / 2.0 - tmplen[jm]; + + tmplen[im] = minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +double ipower( double x, int n ) /* n > 0 */ +{ + double r; + + r = 1; + while( n != 0 ) + { + if( n & 1 ) r *= x; + x *= x; n >>= 1; + } + return( r ); +} + +void countnode( int nseq, int ***topol, double **node ) /* node[j][i] != node[i][j] */ +{ + int i, j, k, s1, s2; + static double rootnode[M]; + + if( nseq-2 < 0 ) + { + reporterr( "Too few sequence for countnode: nseq = %d\n", nseq ); + exit( 1 ); + } + + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } +} + +void countnode_int( int nseq, int ***topol, int **node ) /* node[i][j] == node[j][i] */ +{ + int i, j, k, s1, s2; + int rootnode[M]; + + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=localmem[1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + free( localmem[0] ); + free( localmem[1] ); + } + free( localmem ); + free( memhist[nseq-2] ); + free( memhist ); + + + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; ilen2 ) break; + continue; + } + if( ms2 == (int)'-' ) + { + tmpscore += (double)penalty; + tmpscore += (double)amino_dis[ms1][ms2]; + while( (ms2=(unsigned char)seq2[++k]) == '-' ) + tmpscore += (double)amino_dis[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + return( tmpscore ); +} + +double score_calc1( char *seq1, char *seq2 ) /* method 1 */ +{ + int k; + double score = 0.0; + int count = 0; + int len = strlen( seq1 ); + + for( k=0; k 1 ) + { + if( utree == 0 ) + { + for( i=0; i 0.0 ) tmp /= count; + else( tmp = 0.0 ); + ch = (int)( tmp/100.0 - 0.000001 ); + sprintf( sco1+i, "%c", ch+0x61 ); + } + sco1[len] = 0; + + for( i=0; i 0.0 ) tmp /= count; + else( tmp = 0.0 ); + tmp = ( tmp - 400 * !scoremtx ) * 2; + if( tmp < 0 ) tmp = 0; + ch = (int)( tmp/100.0 - 0.000001 ); + sprintf( sco2+i, "%c", ch+0x61 ); + sco[i] = tmp; + } + sco2[len] = 0; + + for( i=WIN; i= bk+len1 ) { *str2 = *(str2-len1); str2--;} // by D.Mathog + while( str2 >= bk ) { *str2-- = *str1--; } +} + +int isaligned( int nseq, char **seq ) +{ + int i; + int len = strlen( seq[0] ); + for( i=1; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty - n_dis[0][24]; + while( mseq2[++k] == '-' ) + ; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore / (double)c; +#if DEBUG + printf( "tmpscore in mltaln9.c = %f\n", tmpscore ); + printf( "tmpscore / c = %f\n", tmpscore/(double)c ); +#endif + } + } + reporterr( "raw score = %f\n", score ); + score /= (double)nseq * ( nseq-1.0 ) / 2.0; + score += 400.0; +#if DEBUG + printf( "score in mltaln9.c = %f\n", score ); +#endif + return( (double)score ); +} + +void doublencpy( double *vec1, double *vec2, int len ) +{ + while( len-- ) + *vec1++ = *vec2++; +} + +double score_calc_a( char **seq, int s, double **eff ) /* algorithm A+ */ +{ + int i, j, k; + int gb1, gb2, gc1, gc2; + int cob; + int nglen; + int len = strlen( seq[0] ); + double score; + + score = 0; + nglen = 0; + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore; + } + } + + return( score ); +} + + +#define SEGMENTSIZE 150 + +int searchAnchors( int nseq, char **seq, Segment *seg ) +{ + int i, j, k, kcyc; + int status; + double score; + int value = 0; + int len; + int length; + static double *stra = NULL; + static int alloclen = 0; + double cumscore; + static double threshold; + + len = strlen( seq[0] ); + if( alloclen < len ) + { + if( alloclen ) + { + FreeDoubleVec( stra ); + } + else + { + threshold = (int)divThreshold / 100.0 * 600.0 * divWinSize; + } + stra = AllocateDoubleVec( len ); + alloclen = len; + } + + for( i=0; iskipForeward = 0; + (seg+1)->skipBackward = 0; + status = 0; + cumscore = 0.0; + score = 0.0; + length = 0; /* modified at 01/09/11 */ + for( j=0; j threshold ) reporterr( "YES\n" ); + else reporterr( "NO\n" ); +#endif + + if( score > threshold ) + { + if( !status ) + { + status = 1; + seg->start = i; + length = 0; + cumscore = 0.0; + } + length++; + cumscore += score; + } + if( score <= threshold || length > SEGMENTSIZE ) + { + if( status ) + { + seg->end = i; + seg->center = ( seg->start + seg->end + divWinSize ) / 2 ; + seg->score = cumscore; +#if DEBUG + reporterr( "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + if( length > SEGMENTSIZE ) + { + (seg+0)->skipForeward = 1; + (seg+1)->skipBackward = 1; + } + else + { + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + } + length = 0; + cumscore = 0.0; + status = 0; + value++; + seg++; + if( value > MAXSEG - 3 ) ErrorExit( "TOO MANY SEGMENTS!"); + } + } + } + if( status ) + { + seg->end = i; + seg->center = ( seg->start + seg->end + divWinSize ) / 2 ; + seg->score = cumscore; +#if DEBUG +reporterr( "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + value++; + } + return( value ); +} + +void dontcalcimportance_target( int nseq, double *eff, char **seq, LocalHom **localhom, int ntarget ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + +void dontcalcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; i= j ) continue; + for( ptr=localhom[i]+j-i; ptr; ptr=ptr->next ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + + +void dontcalcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 + ptr->importance = ptr->opt / ptr->overlapaa; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + +void dontcalcimportance_firstone( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j, nseq1; + LocalHom *ptr; +#if 1 +#else + int *nogaplen; + nogaplen = AllocateIntVec( nseq ); + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt * 0.5; // tekitou +// ptr->fimportance = (double)ptr->importance; +// reporterr( "i=%d, j=%d, importance = %f, opt=%f\n", i, j, ptr->fimportance, ptr->opt ); +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } +#if 1 +#else + free( nogaplen ); +#endif +} + +void calcimportance_target( int nseq, int ntarget, double *eff, char **seq, LocalHom **localhom, int *targetmap, int *targetmapr, int alloclen ) +{ + int i, j, pos, len, ti, tj; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( alloclen ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + +// for( i=0; inext ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } +#else + tmpdouble = 0.0; + len = 0; + for( tmpptr = localhom[ti]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + } + + tmpdouble /= (double)len; + + for( tmpptr = localhom[ti]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->importance = tmpptr->opt / tmpptr->overlapaa; //$B$J$+$C$?$3$H$K$9$k(B + } +#endif + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( ti=0; tinext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%30.25f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); +// for( i=0; inext, tmpptr2 = tmpptr2->next) + { + if( tmpptr1->opt == -1.0 || tmpptr2->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr2->importance ); + tmpptr1->importance = tmpptr2->importance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } + + for( ti=0; tinext ) + { + if( tmpptr1->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance ); +// imp = 1.0 * ( tmpptr1->importance ); + tmpptr1->importance = imp; +// tmpptr1->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( ti=0; tinext ) + { + if( tmpptr->end1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +//exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + +void calcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom, int alloclen ) +{ + int i, j, pos, len; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( alloclen ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + + for( i=0; inext ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } + else + { + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start2; pos<=tmpptr->end2; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } + } + else + { + if( localhom[j][i-j].opt == -1.0 ) continue; + + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start2; pos<=tmpptr->end2; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->rimportance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } + } + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( i=0; inext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } + else + { + printf( "%d-%d\n", i, j ); + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start2, tmpptr->end2, tmpptr->start1, tmpptr->end1, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->rimportance, tmpptr->opt ); + } + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); + for( i=0; inext) + { + if( tmpptr1->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr1->rimportance ); + tmpptr1->importance = tmpptr1->rimportance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( i=0; inext ) + { + if( tmpptr->end1 && tmpptr->start1 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + else for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->end2 && tmpptr->start2 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start2, tmpptr->end2, tmpptr->start1, tmpptr->end1, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + +void calcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j, pos, len; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( nlenmax ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + + for( i=0; inext ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } +#else + tmpdouble = 0.0; + len = 0; + for( tmpptr = localhom[i]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + } + + tmpdouble /= (double)len; + + for( tmpptr = localhom[i]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->importance = tmpptr->opt / tmpptr->overlapaa; //$B$J$+$C$?$3$H$K$9$k(B + } +#endif + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( i=0; inext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); + for( i=0; inext, tmpptr2 = tmpptr2->next) + { + if( tmpptr1->opt == -1.0 || tmpptr2->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr2->importance ); + tmpptr1->importance = tmpptr2->importance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( i=0; inext ) + { + if( tmpptr->end1 && tmpptr->start1 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + + + + +static void addlocalhom2_e( LocalHom *pt, LocalHom *lh, int sti, int stj, int eni, int enj, double opt, int overlp, int interm ) +{ +// dokka machigatteru + if( pt != lh ) // susumeru + { + pt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + pt = pt->next; + pt->next = NULL; + lh->last = pt; + } + else // sonomamatsukau + { + lh->last = pt; + } + lh->nokori++; +// reporterr( "in addlocalhom2_e, pt = %p, pt->next = %p, interm=%d, sti-eni-stj-enj=%d %d %d %d\n", pt, pt->next, interm, sti, eni, stj, enj ); + + pt->start1 = sti; + pt->start2 = stj; + pt->end1 = eni; + pt->end2 = enj; + pt->opt = opt; + pt->extended = interm; + pt->overlapaa = overlp; +#if 0 + reporterr( "i: %d-%d\n", sti, eni ); + reporterr( "j: %d-%d\n", stj, enj ); + reporterr( "opt=%f\n", opt ); + reporterr( "overlp=%d\n", overlp ); +#endif +} + +void extendlocalhom2( int nseq, LocalHom **localhom, double **dist ) +{ + int overlp, plim; + int i, j, k; + int pi, pj, pk, len; + int status, sti, stj; + int *ipt; + int co; + static int *ini = NULL; + static int *inj = NULL; + LocalHom *pt; + + sti = 0; // by D.Mathog, a guess + stj = 0; // by D.Mathog, a guess + + if( ini == NULL ) + { + ini = AllocateIntVec( nlenmax+1 ); + inj = AllocateIntVec( nlenmax+1 ); + } + + + for( i=0; i dist[i][j] * thrinter || dist[MIN(j,k)][MAX(j,k)] > dist[i][j] * thrinter ) continue; + ipt = ini; co = nlenmax+1; + while( co-- ) *ipt++ = -1; + ipt = inj; co = nlenmax+1; + while( co-- ) *ipt++ = -1; + overlp = 0; + + { + for( pt=localhom[i]+k; pt; pt=pt->next ) + { +// reporterr( "i=%d,k=%d,st1:st2=%d:%d,pt=%p,extended=%p\n", i, k, pt->start1, pt->start2, pt, pt->extended ); + if( pt->opt == -1 ) + { + reporterr( "opt kainaide tbfast.c = %f\n", pt->opt ); + } + if( pt->extended > -1 ) break; + pi = pt->start1; + pk = pt->start2; + len = pt->end1 - pt->start1 + 1; + ipt = ini + pk; + while( len-- ) *ipt++ = pi++; + } + } + + { + for( pt=localhom[j]+k; pt; pt=pt->next ) + { + if( pt->opt == -1 ) + { + reporterr( "opt kainaide tbfast.c = %f\n", pt->opt ); + } + if( pt->extended > -1 ) break; + pj = pt->start1; + pk = pt->start2; + len = pt->end1 - pt->start1 + 1; + ipt = inj + pk; + while( len-- ) *ipt++ = pj++; + } + } +#if 0 + reporterr( "i=%d,j=%d,k=%d\n", i, j, k ); + overlp = 0; + for( pk = 0; pk < nlenmax; pk++ ) + { + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + reporterr( " %d", inj[pk] ); + } + reporterr( "\n" ); + + reporterr( "i=%d,j=%d,k=%d\n", i, j, k ); + overlp = 0; + for( pk = 0; pk < nlenmax; pk++ ) + { + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + reporterr( " %d", ini[pk] ); + } + reporterr( "\n" ); +#endif + overlp = 0; + plim = nlenmax+1; + for( pk = 0; pk < plim; pk++ ) + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + + + status = 0; + plim = nlenmax+1; + for( pk=0; pknext = %p, pt->next->next = %p\n", pt, pt->next, pt->next->next ); + + pt = localhom[j][i].last; +// reporterr( "in ex (ba), pt = %p, pt->next = %p\n", pt, pt->next ); +// reporterr( "in ex (ba), pt = %p, pt->next = %p, k=%d\n", pt, pt->next, k ); + addlocalhom2_e( pt, localhom[j]+i, stj, sti, inj[pk-1], ini[pk-1], MIN( localhom[i][k].opt, localhom[j][k].opt ) * 1.0, overlp, k ); +// reporterr( "in ex, pt = %p, pt->next = %p, pt->next->next = %p\n", pt, pt->next, pt->next->next ); + } + } + if( !status ) // else deha arimasenn. + { + if( ini[pk] == -1 || inj[pk] == -1 ) continue; + sti = ini[pk]; + stj = inj[pk]; +// reporterr( "start here!\n" ); + status = 1; + } + } +// if( status ) reporterr( "end here\n" ); + +// exit( 1 ); +// fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->next ); + } +#if 0 + for( pt=localhomtable[i]+j; pt; pt=pt->next ) + { + if( tmpptr->opt == -1.0 ) continue; + fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->next ); + } +#endif + } + } +} + +int makelocal( char *s1, char *s2, int thr ) +{ + int start, maxstart, maxend; + char *pt1, *pt2; + double score; + double maxscore; + + pt1 = s1; + pt2 = s2; + + maxend = 0; // by D.Mathog, a guess + +// reporterr( "thr = %d, \ns1 = %s\ns2 = %s\n", thr, s1, s2 ); + maxscore = 0.0; + score = 0.0; + start = 0; + maxstart = 0; + while( *pt1 ) + { +// reporterr( "*pt1 = %c*pt2 = %c\n", *pt1, *pt2 ); + if( *pt1 == '-' || *pt2 == '-' ) + { +// reporterr( "penalty = %d\n", penalty ); + score += penalty; + while( *pt1 == '-' || *pt2 == '-' ) + { + pt1++; pt2++; + } + continue; + } + + score += ( amino_dis[(unsigned char)*pt1++][(unsigned char)*pt2++] - thr ); +// score += ( amino_dis[(int)*pt1++][(int)*pt2++] ); + if( score > maxscore ) + { +// reporterr( "score = %f\n", score ); + maxscore = score; + maxstart = start; +// reporterr( "## max! maxstart = %d, start = %d\n", maxstart, start ); + } + if( score < 0.0 ) + { +// reporterr( "## resetting, start = %d, maxstart = %d\n", start, maxstart ); + if( start == maxstart ) + { + maxend = pt1 - s1; +// reporterr( "maxend = %d\n", maxend ); + } + score = 0.0; + start = pt1 - s1; + } + } + if( start == maxstart ) + maxend = pt1 - s1 - 1; + +// reporterr( "maxstart = %d, maxend = %d, maxscore = %f\n", maxstart, maxend, maxscore ); + s1[maxend+1] = 0; + s2[maxend+1] = 0; + return( maxstart ); +} + +void resetlocalhom( int nseq, LocalHom **lh ) +{ + int i, j; + LocalHom *pt; + + for( i=0; inext ) + pt->opt = 1.0; + } + +} + +void gapireru( char *res, char *ori, char *gt ) +{ + char g; + while( (g = *gt++) ) + { + if( g == '-' ) + { + *res++ = *newgapstr; + } + else + { + *res++ = *ori++; + } + } + *res = 0; +} + +void getkyokaigap( char *g, char **s, int pos, int n ) +{ +// char *bk = g; +// while( n-- ) *g++ = '-'; + while( n-- ) *g++ = (*s++)[pos]; + +// reporterr( "bk = %s\n", bk ); +} + +void new_OpeningGapCount( double *ogcp, int clus, char **seq, double *eff, int len, char *sgappat ) +#if 0 +{ + int i, j, gc, gb; + double feff; + + + for( i=0; i", i, gaplen, k, (*fpt)[k].freq ); + (*fpt)[k].freq += feff; +// reporterr( "%f\n", (*fpt)[k].freq ); + gaplen = 0; + } + } + fpt++; + } + } +#if 1 + for( j=0; jnext = ac; + acori->pos = -1; + ac[0].prev = acori; + + +// for( i=0; i tmpmin ) + { + minscore = tmpmin; + nearest = i; + } + } + nearesto = nearest; + minscoreo = minscore; + + + +// for( i=0; i-1; j++ ) + { + reporterr( "%d ", topol[i][0][j]+1 ); + } + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][0] ); + reporterr( "group1 = \n" ); + for( j=0; topol[i][1][j]>-1; j++ ) + { + reporterr( "%d ", topol[i][1][j]+1 ); + } + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][1] ); + + reporterr( "\n\n\nminscore = %f ? %f\n", minscore, dep[i].distfromtip*2 ); + reporterr( "i = %d\n", i ); + if( leaf2node[nearest] == -1 ) + { + reporterr( "nogaplen[nearest] = %d\n", nogaplen[nearest] ); + } + else + { + reporterr( "alnleninnode[leaf2node[nearest]] = %d\n", alnleninnode[leaf2node[nearest]] ); + reporterr( "leaf2node[nearest] = %d\n", leaf2node[nearest] ); + } +#endif + nearestnode = leaf2node[nearest]; + if( nearestnode == -1 ) + reflen = nogaplen[nearest]; + else + reflen = alnleninnode[nearestnode]; +// reflen = alnleninnode[i]; // BUG!! + + if( noalign ) seqlengthcondition = 1; + else seqlengthcondition = ( nogaplentoadd <= reflen ); + +//seqlengthcondition = 1; // CHUUI +//seqlengthcondition = ( nogaplentoadd <= reflen ); // CHUUI + + if( repnorg == -1 && dep[i].distfromtip * 2 > minscore && seqlengthcondition ) // Keitouteki ichi ha fuseikaku. +// if( repnorg == -1 && dep[i].distfromtip * 2 > minscore ) // Keitouteki ichi dake ga hitsuyouna baaiha kore wo tsukau. + { +// reporterr( "INSERT HERE, %d-%d\n", nearest, norg ); +// reporterr( "nearest = %d\n", nearest ); +// reporterr( "\n\n\nminscore = %f\n", minscore ); +// reporterr( "distfromtip *2 = %f\n", dep[i].distfromtip * 2 ); +// reporterr( "nearest=%d, leaf2node[]=%d\n", nearest, leaf2node[nearest] ); + + if( nearestnode == -1 ) + { +// reporterr( "INSERTING to 0!!!\n" ); +// reporterr( "lastlength = %d\n", nogaplen[norg] ); +// reporterr( "reflength = %d\n", nogaplen[nearest] ); + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( 1 + 1 ) * sizeof( int ) ); + topolc[posinnew][0][0] = nearest; + topolc[posinnew][0][1] = -1; + + addedlen = lenc[posinnew][0] = minscore / 2; + + } + else + { +// reporterr( "INSERTING to g, leaf2node = %d, cm=%d!!!\n", leaf2node[nearest], countmem(topol[leaf2node[nearest]][0] ) ); +// reporterr( "alnleninnode[i] = %d\n", alnleninnode[i] ); +// reporterr( "alnleninnode[leaf2node[nearest]] = %d\n", alnleninnode[leaf2node[nearest]] ); + + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( ( countmem( topol[nearestnode][0] ) + countmem( topol[nearestnode][1] ) + 1 ) * sizeof( int ) ) ); +// reporterr( "leaf2node[%d] = %d\n", nearest, leaf2node[nearest] ); + intcpy( topolc[posinnew][0], topol[nearestnode][0] ); + intcat( topolc[posinnew][0], topol[nearestnode][1] ); +// addedlen = lenc[posinnew][0] = minscore / 2 - len[nearestnode][0]; // bug!! + addedlen = lenc[posinnew][0] = dep[i].distfromtip - minscore / 2; // 2014/06/10 +// fprintf( stderr, "addedlen = %f, dep[i].distfromtip = %f, len[nearestnode][0] = %f, minscore/2 = %f, lenc[posinnew][0] = %f\n", addedlen, dep[i].distfromtip, len[nearestnode][0], minscore/2, lenc[posinnew][0] ); + + } + neighbor = lastmem( topolc[posinnew][0] ); + + if( treeout ) + { +#if 0 + fp = fopen( "infile.tree", "a" ); // kyougou!! + if( fp == 0 ) + { + reporterr( "File error!\n" ); + exit( 1 ); + } + fprintf( fp, "\n" ); + fprintf( fp, "%8d: %s\n", norg+iadd+1, name[norg+iadd] ); + fprintf( fp, " nearest sequence: %d\n", nearest + 1 ); + fprintf( fp, " distance: %f\n", minscore ); + fprintf( fp, " cousin: " ); + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + fprintf( fp, "%d ", topolc[posinnew][0][j]+1 ); + fprintf( fp, "\n" ); + fclose( fp ); +#else + addtree[iadd].nearest = nearesto; + addtree[iadd].dist1 = minscoreo; + addtree[iadd].dist2 = minscore; + neighborlist[0] = 0; + npt = neighborlist; + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + { + sprintf( npt, "%d ", topolc[posinnew][0][j]+1 ); + npt += strlen( npt ); + } + addtree[iadd].neighbors = calloc( npt-neighborlist+1, sizeof( char ) ); + strcpy( addtree[iadd].neighbors, neighborlist ); +#endif + } + +// reporterr( "INSERTING to 1!!!\n" ); + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( 1 + 1 ) * sizeof( int ) ); + topolc[posinnew][1][0] = norg; + topolc[posinnew][1][1] = -1; + lenc[posinnew][1] = minscore / 2; + +// reporterr( "STEP %d (newnew)\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + + repnorg = nearest; + +// reporterr( "STEP %d\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j] ); +// reporterr( "\n len=%f\n", lenc[i][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j] ); +// reporterr( "\n len=%f\n", lenc[i][1] ); + +// im = topolc[posinnew][0][0]; +// jm = topolc[posinnew][1][0]; +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], lenc[posinnew][0], tree[jm], lenc[posinnew][1] ); +// strcpy( tree[im], treetmp ); + + posinnew++; + } + +// reporterr( "minscore = %f\n", minscore ); +// reporterr( "distfromtip = %f\n", dep[i].distfromtip ); +// reporterr( "Modify matrix, %d-%d\n", nearest, norg ); + eff0 = iscorec[mem0][norg-mem0]; + eff1 = iscorec[mem1][norg-mem1]; + +// iscorec[mem0][norg-mem0] = (clusterfuncpt[0])( eff0, eff1 ); + iscorec[mem0][norg-mem0] = MIN( eff0, eff1 ) * sueff1_double_local + ( eff0 + eff1 ) * sueff05_double_local; + iscorec[mem1][norg-mem1] = 9999.9; // sukoshi muda + + acprev = ac[mem1].prev; + acnext = ac[mem1].next; + acprev->next = acnext; + if( acnext != NULL ) acnext->prev = acprev; + + if( ( nearest == mem1 || nearest == mem0 ) ) + { + minscore = 9999.9; +// for( j=0; j iscorec[j][norg-j] ) +// { +// minscore = iscorec[j][norg-j]; +// nearest = j; +// } +// } +// reporterr( "searching on modified ac " ); + for( acpt=acori->next; acpt!=NULL; acpt=acpt->next ) // sukoshi muda + { +// reporterr( "." ); + j = acpt->pos; + tmpmin = iscorec[j][norg-j]; + if( minscore > tmpmin ) + { + minscore = tmpmin; + nearest = j; + } + } +// reporterr( "done\n" ); + } + +// reporterr( "posinnew = %d\n", posinnew ); + + + if( topol[i][0][0] == repnorg ) + { + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + 2 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topol[i][0] ); + intcat( topolc[posinnew][0], additionaltopol ); + lenc[posinnew][0] = len[i][0] - addedlen; // 2014/6/10 +// fprintf( stderr, "i=%d, dep[i].distfromtip=%f\n", i, dep[i].distfromtip ); +// fprintf( stderr, "addedlen=%f, len[i][0]=%f, lenc[][0]=%f\n", addedlen, len[i][0], lenc[posinnew][0] ); +// fprintf( stderr, "lenc[][1] = %f\n", lenc[posinnew][0] ); + addedlen = 0.0; + } + else + { + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topol[i][0] ); + lenc[posinnew][0] = len[i][0]; + } + + if( topol[i][1][0] == repnorg ) + { + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( countmem( topol[i][1] ) + 2 ) * sizeof( int ) ); + intcpy( topolc[posinnew][1], topol[i][1] ); + intcat( topolc[posinnew][1], additionaltopol ); + lenc[posinnew][1] = len[i][1] - addedlen; // 2014/6/10 +// fprintf( stderr, "i=%d, dep[i].distfromtip=%f\n", i, dep[i].distfromtip ); +// fprintf( stderr, "addedlen=%f, len[i][1]=%f, lenc[][1]=%f\n", addedlen, len[i][1], lenc[posinnew][1] ); +// fprintf( stderr, "lenc[][1] = %f\n", lenc[posinnew][1] ); + addedlen = 0.0; + + repnorg = topolc[posinnew][0][0]; // juuyou + } + else + { + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( countmem( topol[i][1] ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][1], topol[i][1] ); + lenc[posinnew][1] = len[i][1]; + } + +// reporterr( "\nSTEP %d (new)\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + +// reporterr("\ni=%d\n####### leaf2node[nearest]= %d\n", i, leaf2node[nearest] ); + + for( j=0; (m=topol[i][0][j])!=-1; j++ ) leaf2node[m] = i; + for( j=0; (m=topol[i][1][j])!=-1; j++ ) leaf2node[m] = i; + +// reporterr("####### leaf2node[nearest]= %d\n", leaf2node[nearest] ); + +// im = topolc[posinnew][0][0]; +// jm = topolc[posinnew][1][0]; +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], lenc[posinnew][0], tree[jm], lenc[posinnew][1] ); +// strcpy( tree[im], treetmp ); +// +// reporterr( "%s\n", treetmp ); + + posinnew++; + } + + if( nstep ) + { + i--; + topolo0 = topol[i][0]; + topolo1 = topol[i][1]; + } + else + { +// i = 0; +// free( topol[i][0] );//? +// free( topol[i][1] );//? +// topol[i][0] = calloc( 2, sizeof( int ) ); +// topol[i][1] = calloc( 1, sizeof( int ) ); +// topol[i][0][0] = 0; +// topol[i][0][1] = -1; +// topol[i][1][0] = -1; + + topoldum0 = calloc( 2, sizeof( int ) ); + topoldum1 = calloc( 1, sizeof( int ) ); + topoldum0[0] = 0; + topoldum0[1] = -1; + topoldum1[0] = -1; + + topolo0 = topoldum0; + topolo1 = topoldum1; + } + if( repnorg == -1 ) + { +// topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + countmem( topol[i][1] ) + 1 ) * sizeof( int ) ); +// intcpy( topolc[posinnew][0], topol[i][0] ); +// intcat( topolc[posinnew][0], topol[i][1] ); + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topolo0 ) + countmem( topolo1 ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topolo0 ); + intcat( topolc[posinnew][0], topolo1 ); +// lenc[posinnew][0] = len[i][0] + len[i][1] - minscore / 2; // BUG!! 2014/06/07 ni hakken + if( nstep ) + lenc[posinnew][0] = minscore / 2 - dep[nstep-1].distfromtip; // only when nstep>0, 2014/11/21 + else + lenc[posinnew][0] = minscore / 2; + +// reporterr( "\ndep[nstep-1].distfromtip = %f\n", dep[nstep-1].distfromtip ); +// reporterr( "lenc[][0] = %f\n", lenc[posinnew][0] ); + + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], 2 * sizeof( int ) ); + intcpy( topolc[posinnew][1], additionaltopol ); + lenc[posinnew][1] = minscore / 2; + +// neighbor = lastmem( topolc[posinnew][0] ); + neighbor = norg-1; // hakkirishita neighbor ga inai baai saigo ni hyouji + + if( treeout ) + { +#if 0 + fp = fopen( "infile.tree", "a" ); // kyougou!! + if( fp == 0 ) + { + reporterr( "File error!\n" ); + exit( 1 ); + } + fprintf( fp, "\n" ); + fprintf( fp, "%8d: %s\n", norg+iadd+1, name[norg+iadd] ); + fprintf( fp, " nearest sequence: %d\n", nearest + 1 ); + fprintf( fp, " cousin: " ); + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + fprintf( fp, "%d ", topolc[posinnew][0][j]+1 ); + fprintf( fp, "\n" ); + fclose( fp ); +#else + addtree[iadd].nearest = nearesto; + addtree[iadd].dist1 = minscoreo; + addtree[iadd].dist2 = minscore; + neighborlist[0] = 0; + npt = neighborlist; + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + { + sprintf( npt, "%d ", topolc[posinnew][0][j]+1 ); + npt += strlen( npt ); + } + addtree[iadd].neighbors = calloc( npt-neighborlist+1, sizeof( char ) ); + strcpy( addtree[iadd].neighbors, neighborlist ); +#endif + } + +// reporterr( "STEP %d\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j] ); +// reporterr( "\n len=%f", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j] ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + } + + if( topoldum0 ) free( topoldum0 ); + if( topoldum1 ) free( topoldum1 ); + free( leaf2node ); + free( additionaltopol ); + free( ac ); + free( acori ); + if( treeout ) free( neighborlist ); + +#if 0 // create a newick tree for CHECK + char **tree; + char *treetmp; + int im, jm; + + treetmp = AllocateCharVec( njob*150 ); + tree = AllocateCharMtx( njob, njob*150 ); + for( i=0; i-1; ) + { + if( mem[i++] != cand[j++] ) return( 0 ); + } + + if( cand[j] == -1 ) + { + return( 1 ); + } + else + { + return( 0 ); + } +} +#else +int samemember( int *mem, int *cand ) +{ + int i, j; + int nm, nc; + + nm = 0; for( i=0; mem[i]>-1; i++ ) nm++; + nc = 0; for( i=0; cand[i]>-1; i++ ) nc++; + + if( nm != nc ) return( 0 ); + + for( i=0; mem[i]>-1; i++ ) + { + for( j=0; cand[j]>-1; j++ ) + if( mem[i] == cand[j] ) break; + if( cand[j] == -1 ) return( 0 ); + } + + if( mem[i] == -1 ) + { +#if 0 + reporterr( "mem = " ); + for( i=0; mem[i]>-1; i++ ) reporterr( "%d ", mem[i] ); + reporterr( "\n" ); + + reporterr( "cand = " ); + for( i=0; cand[i]>-1; i++ ) reporterr( "%d ", cand[i] ); + reporterr( "\n" ); +#endif + return( 1 ); + } + else + { + return( 0 ); + } +} +#endif + +int samemembern( int *mem, int *cand, int nc ) +{ + int i, j; + int nm; + + nm = 0; + for( i=0; mem[i]>-1; i++ ) + { + nm++; + if( nm > nc ) return( 0 ); + } + + if( nm != nc ) return( 0 ); + + for( i=0; mem[i]>-1; i++ ) + { + for( j=0; j-1; i++ ) + { + for( j=0; cand[j]>-1; j++ ) + if( mem[i] == cand[j] ) break; + if( cand[j] == -1 ) return( 0 ); + } +// reporterr( "INCLUDED! mem[0]=%d\n", mem[0] ); + return( 1 ); +} + +int overlapmember( int *mem1, int *mem2 ) +{ + int i, j; + + for( i=0; mem1[i]>-1; i++ ) + for( j=0; mem2[j]>-1; j++ ) + if( mem1[i] == mem2[j] ) return( 1 ); + return( 0 ); +} +void gapcount( double *freq, char **seq, int nseq, double *eff, int lgth ) +{ + int i, j; + double fr; + +// for( i=0; i %f\n", i, freq[i] ); + } +// reporterr( "\n" ); + return; +} +void gapcountf( double *freq, char **seq, int nseq, double *eff, int lgth ) +{ + int i, j; + double fr; + +// for( i=0; i 0.0 ) val = 0.0; + return val; +} + +void makedynamicmtx( double **out, double **in, double offset ) +{ + int i, j, ii, jj; + double av; + + offset = dist2offset( offset * 2.0 ); // offset 0..1 -> 0..2 + +// if( offset > 0.0 ) offset = 0.0; +// reporterr( "dynamic offset = %f\n", offset ); + + for( i=0; i%f\n", rep0, distfromtip0, distfromtip[rep0] ); + + +#if 0 + for( j=0; topol[i][1][j]!=-1; j++ ) + reporterr( "%3d ", topol[i][1][j] ); + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][1] ); +#endif + + rep1 = topol[i][1][0]; + distfromtip1 = distfromtip[rep1]; + distfromtip[rep1] += len[i][1]; +// reporterr( "distfromtip[%d] = %f->%f\n", rep1, distfromtip1, distfromtip[rep1] ); + + if( topol[i][0][1] != -1 && distfromtip0 <= threshold && threshold < distfromtip[rep0] ) + { +// reporterr( "HIT 0!\n" ); + *tablept = realloc( *tablept, sizeof( char * ) * (*nsubpt+2) ); + for( j=0, nmem=0; (mem=topol[i][0][j])!=-1; j++ ) + nmem++; +// reporterr( "allocating %d\n", nmem+1 ); + (*tablept)[*nsubpt] = calloc( nmem+1, sizeof( int ) ); + (*tablept)[*nsubpt+1] = NULL; + intcpy( (*tablept)[*nsubpt], topol[i][0] ); + if( *maxmempt < nmem ) *maxmempt = nmem; + *nsubpt += 1; + } + + if( topol[i][1][1] != -1 && distfromtip1 <= threshold && threshold < distfromtip[rep1] ) + { +// reporterr( "HIT 1!\n" ); + *tablept = realloc( *tablept, sizeof( char * ) * (*nsubpt+2) ); + for( j=0, nmem=0; (mem=topol[i][1][j])!=-1; j++ ) + nmem++; +// reporterr( "allocating %d\n", nmem+1 ); + (*tablept)[*nsubpt] = calloc( nmem+1, sizeof( int ) ); + (*tablept)[*nsubpt+1] = NULL; + intcpy( (*tablept)[*nsubpt], topol[i][1] ); + if( *maxmempt < nmem ) *maxmempt = nmem; + *nsubpt += 1; + } + + } + + if( distfromtip[0] <= threshold ) + { + free( distfromtip ); + return( 1 ); + } + + free( distfromtip ); + return( 0 ); +} + + + +double sumofpairsscore( int nseq, char **seq ) +{ + double v = 0; + int i, j; + for( i=1; i 10 ) value = 10.0; // 2015/Mar/17 + return( value ); + } +} + +double distcompact( int len1, int len2, int *table1, int *point2, int ss1, int ss2 ) +{ + double longer, shorter, lenfac, value; + + if( len1 > len2 ) + { + longer=(double)len1; + shorter=(double)len2; + } + else + { + longer=(double)len2; + shorter=(double)len1; + } + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// reporterr( "lenfac=%f\n", lenfac ); +// reporterr( "commonsextet_p()=%d\n", commonsextet_p( table1, point2 ) ); +// reporterr( "ss1=%d, ss2=%d\n", ss1, ss2 ); +// reporterr( "val=%f\n", (1.0-(double)commonsextet_p( table1, point2 )/ss1) ); + + if( ss1 == 0 || ss2 == 0 ) + return( 2.0 ); + + value = ( 1.0 - (double)commonsextet_p( table1, point2 ) / MIN(ss1,ss2) ) * lenfac * 2.0; + + return( value ); // 2013/Oct/17 -> 2bai +} + +static void movereg( char *seq1, char *seq2, LocalHom *tmpptr, int *start1pt, int *start2pt, int *end1pt, int *end2pt ) +{ + char *pt; + int tmpint; + + pt = seq1; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start1 ) break; + } + *start1pt = (int)( pt - seq1 ) - 1; + + if( tmpptr->start1 == tmpptr->end1 ) *end1pt = *start1pt; + else + { + while( *pt != 0 ) + { +// fprintf( stderr, "tmpint = %d, end1 = %d pos = %d\n", tmpint, tmpptr->end1, pt-seq1[i] ); + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end1 ) break; + } + *end1pt = (int)( pt - seq1 ) - 1; + } + + pt = seq2; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start2 ) break; + } + *start2pt = (int)( pt - seq2 ) - 1; + if( tmpptr->start2 == tmpptr->end2 ) *end2pt = *start2pt; + else + { + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end2 ) break; + } + *end2pt = (int)( pt - seq2 ) - 1; + } +} + +static void movereg_swap( char *seq1, char *seq2, LocalHom *tmpptr, int *start1pt, int *start2pt, int *end1pt, int *end2pt ) +{ + char *pt; + int tmpint; + + + pt = seq1; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start2 ) break; + } + *start1pt = (int)( pt - seq1 ) - 1; + + if( tmpptr->start2 == tmpptr->end2 ) *end1pt = *start1pt; + else + { + while( *pt != 0 ) + { +// fprintf( stderr, "tmpint = %d, end1 = %d pos = %d\n", tmpint, tmpptr->end1, pt-seq1[i] ); + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end2 ) break; + } + *end1pt = (int)( pt - seq1 ) - 1; + } + + pt = seq2; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start1 ) break; + } + *start2pt = (int)( pt - seq2 ) - 1; + if( tmpptr->start1 == tmpptr->end1 ) *end2pt = *start2pt; + else + { + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end1 ) break; + } + *end2pt = (int)( pt - seq2 ) - 1; + } +} + +void fillimp( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2 ) +{ + int i, j, k1, k2, start1, start2, end1, end2; + double effij, effijx, effij_kozo; + char *pt1, *pt2; + LocalHom *tmpptr; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + +#if 0 + fprintf( stderr, "eff1 in _init_strict = \n" ); + for( i=0; iorinum2[j] ) + movefunc = movereg_swap; + else + movefunc = movereg; + } + +// effij = eff1[i] * eff2[j] * effijx; + effij = eff1[i] * eff2[j] * effijx; + effij_kozo = eff1_kozo[i] * eff2_kozo[j] * effijx; + tmpptr = localhom[i][j]; + while( tmpptr ) + { +// fprintf( stderr, "start1 = %d\n", tmpptr->start1 ); +// fprintf( stderr, "end1 = %d\n", tmpptr->end1 ); +// fprintf( stderr, "i = %d, seq1 = \n%s\n", i, seq1[i] ); +// fprintf( stderr, "j = %d, seq2 = \n%s\n", j, seq2[j] ); + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + +// fprintf( stderr, "start1 = %d (%c), end1 = %d (%c), start2 = %d (%c), end2 = %d (%c)\n", start1, seq1[i][start1], end1, seq1[i][end1], start2, seq2[j][start2], end2, seq2[j][end2] ); +// fprintf( stderr, "step 0\n" ); + if( end1 - start1 != end2 - start2 ) + { +// fprintf( stderr, "CHUUI!!, start1 = %d, end1 = %d, start2 = %d, end2 = %d\n", start1, end1, start2, end2 ); + } + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { +// ½Å¤ß¤òÆó½Å¤Ë¤«¤±¤Ê¤¤¤è¤¦¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ +// impmtx[k1][k2] += tmpptr->wimportance * fastathreshold; +// impmtx[k1][k2] += tmpptr->importance * effij; +// impmtx[k1][k2] += tmpptr->fimportance * effij; + if( tmpptr->korh == 'k' ) + impmtx[k1][k2] += tmpptr->importance * effij_kozo; + else + impmtx[k1][k2] += tmpptr->importance * effij; +// fprintf( stderr, "k1=%d, k2=%d, impalloclen=%d\n", k1, k2, impalloclen ); +// fprintf( stderr, "mark, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + } + } +#if 0 + printf( "orinum1=%d, orinum2=%d\n", *orinum1, *orinum2 ); + if( *orinum1 == 0 ) + { + fprintf( stdout, "impmtx = \n" ); + for( k2=0; k2nokori++ > 0 ) + { + tmpptr1 = localhomtable->last; + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->extended = -1; + tmpptr1->next = NULL; + localhomtable->last = tmpptr1; + } + else + { + tmpptr1 = localhomtable; + } + + tmpptr1->start1 = st1; + tmpptr1->start2 = st2; + tmpptr1->end1 = st1 + len; + tmpptr1->end2 = st2 + len; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( (double)opt + 0.00 ) / 5.8 * 600; + tmpptr1->importance = ( (double)opt + 0.00 ) / 5.8 * 600; // C0 to itchi shinai + tmpptr1->overlapaa = len; // tsukau toki ha chuui + tmpptr1->korh = 'h'; + +// fprintf( stderr, " %f %d-%d %d-%d \n", tmpptr1->opt, tmpptr1->start1, tmpptr1->end1, tmpptr1->start2, tmpptr1->end2 ); + } + free( m ); + fread( &c, sizeof( char ), 1, fp ); + if( c != '\n' ) + { + reporterr( "\n\nError in binary hat3 \n" ); + exit( 1 ); + } +} + +static int readlocalhomfromfile_autofid( LocalHom *lhpt, int nodeid, FILE *fp, int o1, int o2 ) // for hat3node +{ +// pthread_mutex_t *filemutex = h3i->filemutex; +// int fidcheck; + int k1, k2; +// int *fds = h3i->fds; + int swap; +// unsigned long long k1tri; + + lhpt->start1 = -1; + lhpt->end1 = -1; + lhpt->start2 = -1; + lhpt->end2 = -1; + lhpt->overlapaa = -1.0; + lhpt->opt = -1.0; + lhpt->importance = -1.0; + lhpt->next = NULL; + lhpt->nokori = 0; + lhpt->extended = -1; + lhpt->last = lhpt; + lhpt->korh = 'h'; + + +#if 0 // specific target ni taiousuru! + if( h3i->specifictarget ) + { + int *targetmap = h3i->targetmap; + if( targetmap[o1] == -1 && targetmap[o2] == -1 ) return( -1 ); + if( targetmap[o1] == -1 ) + { + k1 = targetmap[o2]; + k2 = o1; + swap = 1; + } + else + { + k1 = targetmap[o1]; + k2 = o2; + swap = 0; + } + k1tri = 0; + } + else +#endif + { + if( o2 > o1 ) + { + k1 = o1; + k2 = o2-o1; + swap = 0; + } + else + { + k1 = o2; + k2 = o1-o2; + swap = 1; + } +// k1tri = (unsigned long long)k1*(k1-1)/2; + } + + + if( fp ) + { + readlocalhomtable2_single_bin_noseek( fp, lhpt ); + } + return( swap ); +} + +static int whichpair( int *ipt, int *jpt, FILE *fp ) +{ + if( fread( ipt, sizeof( int ), 1, fp ) < 1 ) return( 1 ); + if( fread( jpt, sizeof( int ), 1, fp ) < 1 ) return( 1 ); // <1 ha nai + return( 0 ); +} + +typedef struct _readloopthread_arg +{ +// int thread_no; + int nodeid; + int nfiles; + double **impmtx; + char **seq1; + char **seq2; + int *orinum1; + int *orinum2; + double *eff1; + double *eff2; + unsigned long long *ndone; + int *subidpt; + pthread_mutex_t *mutex; +} readloopthread_arg_t; + +static void *readloopthread( void *arg ) +{ + readloopthread_arg_t *targ = (readloopthread_arg_t *)arg; + int nodeid = targ->nodeid; +// int thread_no = targ->thread_no; + double **impmtx = targ->impmtx; + char **seq1 = targ->seq1; + char **seq2 = targ->seq2; + int *orinum1 = targ->orinum1; + int *orinum2 = targ->orinum2; + double *eff1 = targ->eff1; + double *eff2 = targ->eff2; + unsigned long long *ndone = targ->ndone; + int *subidpt = targ->subidpt; + int nfiles = targ->nfiles; + int subid = -1; + pthread_mutex_t *mutex = targ->mutex; + int i, j, k1, k2, start1, start2, end1, end2; + double effij, effijx; + char *pt1, *pt2; + LocalHom *tmpptr; + FILE *fp = NULL; + char *fn; + LocalHom lhsingle; + int res; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + initlocalhom1( &lhsingle ); + effijx = 1.0 * fastathreshold; + +#if 0 + int block; + if( nfiles > 10*nthreadreadlh ) block=10; else block=1; +#endif + + while( 1 ) + { + if( subid == -1 || whichpair( &i, &j, fp ) ) + { + while( 1 ) + { + if( fp ) fclose( fp ); +#if 0 + if( (subid+1)%block==0 ) + { + if( mutex ) pthread_mutex_lock( mutex ); + subid = (*subidpt); + (*subidpt) += block; + if( mutex ) pthread_mutex_unlock( mutex ); + } + else + subid++; +#else + if( mutex ) pthread_mutex_lock( mutex ); + subid = (*subidpt)++; + if( mutex ) pthread_mutex_unlock( mutex ); +#endif + + if( subid >= nfiles ) return( NULL ); + fn = calloc( 100, sizeof( char ) ); + sprintf( fn, "hat3dir/%d-/hat3node-%d-%d", (int)(nodeid/HAT3NODEBLOCK)*HAT3NODEBLOCK, nodeid, subid ); +// reporterr( "fopen %s by thread %d\n", fn, thread_no ); + fp = fopen( fn, "rb" ); + if( fp == NULL ) + { + reporterr( "Cannot open %s\n", fn ); + exit( 1 ); + } + free( fn ); + if( !whichpair( &i, &j, fp ) ) break; + } + } + (*ndone)++; + + + { + +// effij = eff1[i] * eff2[j] * effijx; + effij = eff1[i] * eff2[j] * effijx; +// effij_kozo = eff1_kozo[i] * eff2_kozo[j] * effijx; + + res = readlocalhomfromfile_autofid( &lhsingle, nodeid, fp, orinum1[i], orinum2[j] ); + if( res == -1 ) tmpptr = NULL; + + else if( res == 1 ) + { + movefunc = movereg_swap; // h3i ga arutoki swaplist ha mushi + tmpptr = &lhsingle; + } + else + { + movefunc = movereg; // h3i ga arutoki swaplist ha mushi + tmpptr = &lhsingle; + } + + + while( tmpptr ) + { +// fprintf( stderr, "start1 = %d\n", tmpptr->start1 ); +// fprintf( stderr, "end1 = %d\n", tmpptr->end1 ); +// fprintf( stderr, "i = %d, seq1 = \n%s\n", i, seq1[i] ); +// fprintf( stderr, "j = %d, seq2 = \n%s\n", j, seq2[j] ); + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + +// fprintf( stderr, "start1 = %d (%c), end1 = %d (%c), start2 = %d (%c), end2 = %d (%c)\n", start1, seq1[i][start1], end1, seq1[i][end1], start2, seq2[j][start2], end2, seq2[j][end2] ); +// fprintf( stderr, "step 0\n" ); +// if( end1 - start1 != end2 - start2 ) +// fprintf( stderr, "CHUUI!!, start1 = %d, end1 = %d, start2 = %d, end2 = %d\n", start1, end1, start2, end2 ); + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { + impmtx[k1][k2] += tmpptr->importance * effij; + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + freelocalhom1( &lhsingle ); + } + } +} + +void fillimp_file( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2, int *uselh, int *seedinlh1, int *seedinlh2, int nodeid, int nfiles ) +{ + int i, j, k1, k2, start1, start2, end1, end2, m0, m1, m2; + double effijx, effij_kozo; + char *pt1, *pt2; + LocalHom *tmpptr; + unsigned long long npairs; +// LocalHom lhsingle; +// FILE *fp = NULL; +// char *fn; +// int subid, res; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + pthread_t *handle; + readloopthread_arg_t *targ; + pthread_mutex_t mutex; + double ***localimpmtx; + int nth; + unsigned long long *localndone; + unsigned long long ndone; + int subid; + + +#if 0 + fprintf( stderr, "eff1 in _init_strict = \n" ); + for( i=0; i m2 ) { m0=m1; m1=m2; m2=m0; } + if( m2 >= njob-nadd && ( uselh==NULL || uselh[m1] || uselh[m2] ) ) // saikentou + { +// reporterr( "%d x %d\n", m1, m2 ); + npairs++; + } + } +#if REPORTCOSTS + reporterr( "node %d, npairs = %d, nfiles = %d\n", nodeid, npairs, nfiles ); +#endif + } + else if( uselh ) + { +// npairs = (unsigned long long)clus1 * clus2; + npairs = 0; + for( i=0; iorinum2[j] ) + movefunc = movereg_swap; + else + movefunc = movereg; + + while( tmpptr ) + { + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { + if( tmpptr->korh == 'k' ) + impmtx[k1][k2] += tmpptr->importance * effij_kozo; + else // naihazu + { + reporterr( "okashii\n" ); + exit( 1 ); + } +// fprintf( stderr, "k1=%d, k2=%d, impalloclen=%d\n", k1, k2, impalloclen ); +// fprintf( stderr, "mark, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + } + } + } + +#if 0 + if( 0 || nfiles < 2 ) + { + unsigned long long nread; + readloop_serial( nodeid, impmtx, seq1, seq2, orinum1, orinum2, eff1, eff2, &nread ); + npairs -= nread; + } + else +#endif + { + + nth = MIN(nthreadreadlh,nfiles); + subid = 0; + + if( nth > 1 ) + { + localndone = calloc( sizeof(unsigned long long), nth ); + localimpmtx = calloc( sizeof(double **), nth ); + for( i=0; i 1 ) + { + targ[i].ndone = localndone+i; + targ[i].impmtx = localimpmtx[i]; + targ[i].mutex = &mutex; + pthread_create( handle+i, NULL, readloopthread, (void *)(targ+i) ); + } + else + { + targ[i].ndone = &ndone; + targ[i].impmtx = impmtx; + targ[i].mutex = NULL; + readloopthread( targ+i ); + } + } + + if( nth > 1 ) + { + for( j=0; j 1 ) + { + for( i=0; i&2" 0 15 + +if [ ! $MAFFT_N_THREADS_PER_PROCESS ]; then + echo "set MAFFT_N_THREADS_PER_PROCESS, the number of cores to be used by a process." 1>&2 + exit 1 +fi + +if [ ! "$MAFFT_MPIRUN" ]; then + MAFFT_MPIRUN="mpirun" +fi + + + +command="$* -C $MAFFT_N_THREADS_PER_PROCESS" + +#rm -rf hat3dir # To avoid cache, don't touch hat3dir here + +$MAFFT_MPIRUN $command 1>&2 +sync; + +if [ -s hat3dir/tree ]; then +#if [ -s infile.tree ]; then + val=0 +else + echo "error in MPI" 1>&2 + val=1 +fi + +trap - 0 15 +exit $val diff --git a/mafft/src/mafft-7.487-with-extensions/MPI/nodepair_mpi.c b/mafft/src/mafft-7.487-with-extensions/MPI/nodepair_mpi.c new file mode 100644 index 0000000000..7277489193 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/MPI/nodepair_mpi.c @@ -0,0 +1,561 @@ +#include "mltaln.h" +#include "mpi.h" +#include + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 +#define SHISHAGONYU 0 // for debug + + +// from tbfast +static int treein; +static int treeout; + + +// from pairlocalalign +static int stdout_dist; + + +static void arguments( int argc, char *argv[] ) +{ + int c; + + nthread = 1; + nadd = 0; + inputfile = NULL; + fftkeika = 0; + pslocal = -1000.0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'x'; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; + divpairscore = 0; + stdout_dist = 0; +// dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + ppenalty_OP = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + ppenalty_EX = NOTSPECIFIED; + penalty_shift_factor = 1000.0; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + RNAppenalty = NOTSPECIFIED; + RNApthr = NOTSPECIFIED; + specificityconsideration = 0.0; + usenaivescoreinsteadofalignmentscore = 0; + specifictarget = 0; + nwildcard = 0; + compacttree = 2; // tsuneni! + treein = 0; + treeout = 0; + fastathreshold = 2.7; + constraint = 2; + +// localhomfile = 0; // tbfast.c no wo tsukaunode comment out + +// reporterr( "argc=%d\n", argc ); +// reporterr( "*argv=%s\n", *argv ); +// reporterr( "(*argv)[0]=%c\n", (*argv)[0] ); + while( --argc > 0 && (*++argv)[0] == '-' ) + { +// reporterr( "(*argv)[0] in while loop = %s\n", (*argv) ); + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + fastathreshold = atof( *++argv ); + constraint = 2; + --argc; + goto nextoption; +#if 0 + case 'l': + ppslocal = (int)( atof( *++argv ) * 1000 + 0.5 ); + pslocal = (int)( 600.0 / 1000.0 * ppslocal + 0.5); +// fprintf( stderr, "ppslocal = %d\n", ppslocal ); +// fprintf( stderr, "pslocal = %d\n", pslocal ); + --argc; + goto nextoption; +#else +#endif + case 'C': + nthread = myatoi( *++argv ); + if( nthread == 0 ) nthread = 1; +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; +#ifndef enablemultithread + nthread = 0; +#endif + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); +// fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'u': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; + case 'c': + stdout_dist = 1; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'K': + addprofile = 0; + break; +#if 0 + case 'r': + fmodel = -1; + break; +#endif + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; +#endif +#if 0 + case 'Q': + calledByXced = 1; + break; + case 'x': + disp = 1; + break; + case 'a': + alg = 'a'; + break; + case 'S': + alg = 'S'; + break; +#endif + case 'N': + alg = 'N'; + break; + case 'A': + alg = 'A'; + break; + case 'L': + alg = 'L'; + break; + case 'Z': + usenaivescoreinsteadofalignmentscore = 1; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; +#if 0 + case 'Y': + alg = 'Y'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> L; + break; + case 's': + alg = 's'; + break; + case 'G': + alg = 'G'; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; + case 'T': + alg = 'T'; + break; + case 'H': + alg = 'H'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'r': + alg = 'r'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> R, last + break; + case 'V': + alg = 'V'; + break; +#endif + case 'T': // tbfast.c no noalign ni taiou + break; + case 'F': + use_fft = 1; + break; + case 'U': + treein = 1; + break; + case 't': + treeout = 1; + break; + case 'y': + divpairscore = 1; + break; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; + case 'q': + lhlimit = myatoi( *++argv ); + --argc; + goto nextoption; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "pairlocalalign options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + static int *nlen = NULL; + static int *selfscore = NULL; + static char **name = NULL, **seq = NULL; + static double *eff = NULL; + int i; + static int ***topol = NULL; + static Treedep *dep = NULL; + static double **len = NULL; + FILE *infp = NULL; + + char c; + + +#if 1 +// int required = MPI_THREAD_MULTIPLE; + int required = MPI_THREAD_FUNNELED; + int provided; + MPI_Init_thread(&argc, &argv, required, &provided); +#else + MPI_Init(&argc,&argv); +#endif + + int my_rank; + int num_of_processes; + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); + MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); + + + if (provided < required) { +#if 0 + if (my_rank == 0) { + reporterr( "MPI_THREAD_MULTIPLE (mpi thread support level) is required\n"); + reporterr( "required level is %d and provided level is %d\n", required, provided ); + } + MPI_Finalize(); + exit( 1 ); +#else + if (my_rank == 0) reporterr( "WARNING: mpi thread support level %d is required, but provided level is %d.\n", required, provided ); +#endif + } else { + if (my_rank == 0) reporterr( "mpi thread support level : required level is %d and provided level is %d\n", required, provided ); + } + + + arguments( argc, argv ); + + if( alg != 'A' && alg != 'L' && alg != 'N' ) + { + reporterr( "alg %c is not yet supported\n", alg ); + exit( 1 ); + } + if( alg != 'N' && usenaivescoreinsteadofalignmentscore == 1 ) + { + reporterr( "The combination of usenaivescoreinsteadofalignmentscore and alg %c is not yet supported\n", alg ); + exit( 1 ); + } + + if( fastathreshold < 0.0001 ) + { + constraint = 0; + lhlimit = 0; + } + + + + if(my_rank==0){ + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen( infp ); + rewind( infp ); + } + // getnumlen + MPI_Bcast(&njob,1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&nlenmax,1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&dorp,1, MPI_INT, 0, MPI_COMM_WORLD); + fprintf( stderr, "my_rank: %d, njob: %d, nlenmax: %d\n", my_rank, njob, nlenmax); + + + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + +#ifndef mingw + setstacksize( 200 * njob ); // topolorder() de ookime no stack wo shiyou. +#endif + + + seq = AllocateCharMtx( njob, nlenmax+1 ); + + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + selfscore = AllocateIntVec( njob ); + + topol = AllocateIntCub( njob, 2, 0 ); + len = AllocateFloatMtx( njob, 2 ); + eff = AllocateDoubleVec( njob ); + + + dep = (Treedep *)calloc( njob, sizeof( Treedep ) ); + + + if(my_rank==0){ +#if 0 + readData( infp, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); +#endif + } + for(i=0;inaln; + apt = lastresx->aln; + + if( naln == 0 ) return; + while( naln-- ) + { + rpt1 = apt->reg1; + rpt2 = apt->reg2; + nreg = apt->nreg; + isumscore = 0; + sumoverlap = 0; + while( nreg-- ) + { + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = rpt1->start; + tmppt->start2 = rpt2->start; + tmppt->end1 = rpt1->end; + tmppt->end2 = rpt2->end; + tmppt->korh = 'h'; + if( rpt1 == apt->reg1 ) localhompt0 = tmppt; // ? + +// fprintf( stderr, "in putlocalhom, reg1: %d-%d (nreg=%d)\n", rpt1->start, rpt1->end, lastresx->nreg ); +// fprintf( stderr, "in putlocalhom, reg2: %d-%d (nreg=%d)\n", rpt2->start, rpt2->end, lastresx->nreg ); + + len = tmppt->end1 - tmppt->start1 + 1; + +// fprintf( stderr, "tmppt->start1=%d\n", tmppt->start1 ); +// fprintf( stderr, "tmppt->start2=%d\n", tmppt->start2 ); + +// fprintf( stderr, "s1+tmppt->start1=%*.*s\n", len, len, s1+tmppt->start1 ); +// fprintf( stderr, "s2+tmppt->start2=%*.*s\n", len, len, s2+tmppt->start2 ); + + pt1 = s1 + tmppt->start1; + pt2 = s2 + tmppt->start2; + iscore = 0; + while( len-- ) + { + iscore += n_dis[(int)amino_n[(unsigned char)*pt1++]][(int)amino_n[(unsigned char)*pt2++]]; // - offset $B$O$$$i$J$$$+$b(B +// fprintf( stderr, "len=%d, %c-%c, iscore(0) = %d\n", len, *(pt1-1), *(pt2-1), iscore ); + } + + if( divpairscore ) + { + tmppt->overlapaa = tmppt->end2-tmppt->start2+1; + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + } + else + { + isumscore += iscore; + sumoverlap += tmppt->end2-tmppt->start2+1; + } + rpt1++; + rpt2++; + } +#if 0 + fprintf( stderr, "iscore (1)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + + if( !divpairscore ) + { + for( tmppt2=localhompt0; tmppt2; tmppt2=tmppt2->next ) + { + tmppt2->overlapaa = sumoverlap; + tmppt2->opt = (double)isumscore * 5.8 / ( 600 * sumoverlap ); +// fprintf( stderr, "tmpptr->opt = %f\n", tmppt->opt ); + } + } + apt++; + } +} + +static int countcomma( char *s ) +{ + int v = 0; + while( *s ) if( *s++ == ',' ) v++; + return( v ); +} + +static double recallpairfoldalign( char **mseq1, char **mseq2, int m1, int m2, int *of1pt, int *of2pt, int alloclen ) +{ + static FILE *fp = NULL; + double value; + char *aln1; + char *aln2; + int of1tmp, of2tmp; + + if( fp == NULL ) + { + fp = fopen( "_foldalignout", "r" ); + if( fp == NULL ) + { + fprintf( stderr, "Cannot open _foldalignout\n" ); + exit( 1 ); + } + } + + aln1 = calloc( alloclen, sizeof( char ) ); + aln2 = calloc( alloclen, sizeof( char ) ); + + readpairfoldalign( fp, *mseq1, *mseq2, aln1, aln2, m1, m2, &of1tmp, &of2tmp, alloclen ); + + if( strstr( foldalignopt, "-global") ) + { + fprintf( stderr, "Calling G__align11\n" ); + value = G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + *of1pt = 0; + *of2pt = 0; + } + else + { + fprintf( stderr, "Calling L__align11\n" ); + value = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, of1pt, of2pt ); + } + +// value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); // nennnotame + + if( aln1[0] == 0 ) + { + fprintf( stderr, "FOLDALIGN returned no alignment between %d and %d. Sequence alignment is used instead.\n", m1+1, m2+1 ); + } + else + { + strcpy( *mseq1, aln1 ); + strcpy( *mseq2, aln2 ); + *of1pt = of1tmp; + *of2pt = of2tmp; + } + +// value = naivepairscore11( *mseq1, *mseq2, penalty ); // v6.511 ha kore wo tsukau, global nomi dakara. + +// fclose( fp ); // saigo dake yatta houga yoi. + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + + free( aln1 ); + free( aln2 ); + + return( value ); +} + +static void block2reg( char *block, Reg *reg1, Reg *reg2, int start1, int start2 ) +{ + Reg *rpt1, *rpt2; + char *tpt, *npt; + int pos1, pos2; + int len, glen1, glen2; + pos1 = start1; + pos2 = start2; + rpt1 = reg1; + rpt2 = reg2; + while( block ) + { + block++; +// fprintf( stderr, "block = %s\n", block ); + tpt = strchr( block, ':' ); + npt = strchr( block, ',' ); + if( !tpt || tpt > npt ) + { + len = atoi( block ); + reg1->start = pos1; + reg2->start = pos2; + pos1 += len - 1; + pos2 += len - 1; + reg1->end = pos1; + reg2->end = pos2; +// fprintf( stderr, "in loop reg1: %d-%d\n", reg1->start, reg1->end ); +// fprintf( stderr, "in loop reg2: %d-%d\n", reg2->start, reg2->end ); + reg1++; + reg2++; + } + else + { + sscanf( block, "%d:%d", &glen1, &glen2 ); + pos1 += glen1 + 1; + pos2 += glen2 + 1; + } + block = npt; + + } + reg1->start = reg1->end = reg2->start = reg2->end = -1; + + while( rpt1->start != -1 ) + { +// fprintf( stderr, "reg1: %d-%d\n", rpt1->start, rpt1->end ); +// fprintf( stderr, "reg2: %d-%d\n", rpt2->start, rpt2->end ); + rpt1++; + rpt2++; + } +// *apt1 = *apt2 = 0; +// fprintf( stderr, "aln1 = %s\n", aln1 ); +// fprintf( stderr, "aln2 = %s\n", aln2 ); +} + + +static void readlastresx_singleq( FILE *fp, int n1, int nameq, Lastresx **lastresx ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + if( name2 != nameq ) + { + fprintf( stderr, "BUG!!!\n" ); + exit( 1 ); + } + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 1 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 1 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 1 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 1 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} + +#ifdef enablemultithread +#if 0 +static void readlastresx_group( FILE *fp, Lastresx **lastresx ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 3 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 3 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 3 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 3 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} +#endif +#endif + +static void readlastresx( FILE *fp, int n1, int n2, Lastresx **lastresx, char **seq1, char **seq2 ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 3 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 3 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 3 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 3 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} + +#ifdef enablemultithread +#if 0 +static void *lastcallthread_group( void *arg ) +{ + lastcallthread_arg_t *targ = (lastcallthread_arg_t *)arg; + int k, i; + int nq = targ->nq; + int nd = targ->nd; +#ifdef enablemultithread + int thread_no = targ->thread_no; + int *kshare = targ->kshare; +#endif + Lastresx **lastresx = targ->lastresx; + char **dseq = targ->dseq; + char **qseq = targ->qseq; + char command[5000]; + FILE *lfp; + int msize; + int klim; + int qstart, qend, shou, amari; + char kd[1000]; + + if( nthread ) + { + shou = nq / nthread; + amari = nq - shou * nthread; + fprintf( stderr, "shou: %d, amari: %d\n", shou, amari ); + + qstart = thread_no * shou; + if( thread_no - 1 < amari ) qstart += thread_no; + else qstart += amari; + + qend = qstart + shou - 1; + if( thread_no < amari ) qend += 1; + fprintf( stderr, "%d: %d-%d\n", thread_no, qstart, qend ); + } + k = -1; + while( 1 ) + { + if( nthread ) + { + if( qstart > qend ) break; + if( k == thread_no ) break; + fprintf( stderr, "\n%d-%d / %d (thread %d) \n", qstart, qend, nq, thread_no ); + k = thread_no; + } + else + { + k++; + if( k == nq ) break; + fprintf( stderr, "\r%d / %d \r", k, nq ); + } + + if( alg == 'R' ) // if 'r' -> calllast_fast + { + fprintf( stderr, "Not supported\n" ); + exit( 1 ); + } + else // 'r' + { + kd[0] = 0; + } + + sprintf( command, "_q%d", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open %s", command ); + exit( 1 ); + } + for( i=qstart; i<=qend; i++ ) + fprintf( lfp, ">%d\n%s\n", i, qseq[i] ); + fclose( lfp ); + +// if( alg == 'R' ) msize = MAX(10,k+nq); +// else msize = MAX(10,nd+nq); + if( alg == 'R' ) msize = MAX(10,k*lastm); + else msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from lastcallthread, msize = %d, k=%d\n", msize, k ); +// sprintf( command, "grep '>' _db%sd", kd ); +// system( command ); + sprintf( command, "%s/lastal -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db%sd _q%d > _lastres%d", whereispairalign, msize, laste, -penalty, -penalty_ex, kd, k, k ); + if( system( command ) ) exit( 1 ); + + sprintf( command, "_lastres%d", k ); + lfp = fopen( command, "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres%d", k ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); +// fprintf( stderr, "Reading lastres\n" ); + readlastresx_group( lfp, lastresx ); + fclose( lfp ); + } + return( NULL ); +} +#endif +#endif + +static void *lastcallthread( void *arg ) +{ + lastcallthread_arg_t *targ = (lastcallthread_arg_t *)arg; + int k, i; + int nq = targ->nq; + int nd = targ->nd; +#ifdef enablemultithread + int thread_no = targ->thread_no; + int *kshare = targ->kshare; +#endif + Lastresx **lastresx = targ->lastresx; + char **dseq = targ->dseq; + char **qseq = targ->qseq; + char command[5000]; + FILE *lfp; + int msize; + int klim; + char kd[1000]; + + k = -1; + while( 1 ) + { + +#ifdef enablemultithread + if( nthread ) + { + pthread_mutex_lock( targ->mutex ); + k = *kshare; + if( k == nq ) + { + pthread_mutex_unlock( targ->mutex ); + break; + } + fprintf( stderr, "\r%d / %d (thread %d) \r", k, nq, thread_no ); + ++(*kshare); + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + k++; + if( k == nq ) break; + fprintf( stderr, "\r%d / %d \r", k, nq ); + } + + if( alg == 'R' ) // if 'r' -> calllast_fast + { + klim = MIN( k, njob-nadd ); +// klim = k; // dochira demo yoi + if( klim == k ) + { + sprintf( command, "_db%dd", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _db." ); + exit( 1 ); + } + for( i=0; i%d\n%s\n", i, dseq[i] ); + fclose( lfp ); + +// sprintf( command, "md5sum _db%dd > /dev/tty", k ); +// system( command ); + + if( dorp == 'd' ) + sprintf( command, "%s/lastdb _db%dd _db%dd", whereispairalign, k, k ); + else + sprintf( command, "%s/lastdb -p _db%dd _db%dd", whereispairalign, k, k ); + system( command ); + sprintf( kd, "%d", k ); + } + else // calllast_fast de tsukutta nowo riyou + { + kd[0] = 0; +// fprintf( stderr, "klim=%d, njob=%d, nadd=%d, skip!\n", klim, njob, nadd ); + } + } + else // 'r' + { + kd[0] = 0; + } + + sprintf( command, "_q%d", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open %s", command ); + exit( 1 ); + } + fprintf( lfp, ">%d\n%s\n", k, qseq[k] ); + fclose( lfp ); + +// if( alg == 'R' ) msize = MAX(10,k+nq); +// else msize = MAX(10,nd+nq); + if( alg == 'R' ) msize = MAX(10,k*lastm); + else msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from lastcallthread, msize = %d, k=%d\n", msize, k ); +// sprintf( command, "grep '>' _db%sd", kd ); +// system( command ); + sprintf( command, "%s/lastal -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db%sd _q%d > _lastres%d", whereispairalign, msize, laste, -penalty, -penalty_ex, kd, k, k ); + if( system( command ) ) exit( 1 ); + + sprintf( command, "_lastres%d", k ); + lfp = fopen( command, "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres%d", k ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); +// fprintf( stderr, "Reading lastres\n" ); + readlastresx_singleq( lfp, nd, k, lastresx ); + fclose( lfp ); + } + return( NULL ); +} + + +static void calllast_fast( int nd, char **dseq, int nq, char **qseq, Lastresx **lastresx ) +{ + int i, j; + FILE *lfp; + char command[1000]; + + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + if( dorp == 'd' ) + { + fprintf( lfp, " " ); + for( j=0; j<4; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<4; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<4; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + } + else + { + fprintf( lfp, " " ); + for( j=0; j<20; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<20; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<20; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + } + fclose( lfp ); + +// if( alg == 'r' ) // if 'R' -> lastcallthread, kokonoha nadd>0 no toki nomi shiyou + { + sprintf( command, "_dbd" ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _dbd" ); + exit( 1 ); + } + if( alg == 'R' ) + j = njob-nadd; + else + j = nd; + for( i=0; i%d\n%s\n", i, dseq[i] ); + + fclose( lfp ); + if( dorp == 'd' ) + sprintf( command, "%s/lastdb _dbd _dbd", whereispairalign ); + else + sprintf( command, "%s/lastdb -p _dbd _dbd", whereispairalign ); + system( command ); + } + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + lastcallthread_arg_t *targ; + int *ksharept; + targ = (lastcallthread_arg_t *)calloc( nthread, sizeof( lastcallthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + ksharept = calloc( 1, sizeof(int) ); + *ksharept = 0; + pthread_mutex_init( &mutex, NULL ); + for( i=0; i%d\n%s\n", i, dseq[i] ); + fclose( lfp ); + + if( dorp == 'd' ) + { + sprintf( command, "%s/lastdb _db _db", whereispairalign ); + system( command ); + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + fprintf( lfp, " " ); + for( j=0; j<4; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<4; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<4; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + fclose( lfp ); +#if 0 + sprintf( command, "lastex -s 2 -a %d -b %d -p _scoringmatrixforlast -E 10000 _db.prj _db.prj > _lastex", -penalty, -penalty_ex ); + system( command ); + lfp = fopen( "_lastex", "r" ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + laste = atoi( command ); + fclose( lfp ); + fprintf( stderr, "laste = %d\n", laste ); + sleep( 10 ); +#else +// laste = 5000; +#endif + } + else + { + sprintf( command, "%s/lastdb -p _db _db", whereispairalign ); + system( command ); + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + fprintf( lfp, " " ); + for( j=0; j<20; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<20; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<20; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + fclose( lfp ); +// fprintf( stderr, "Not written yet\n" ); + } + + lfp = fopen( "_q", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _q" ); + exit( 1 ); + } + for( i=0; i%d\n%s\n", i, qseq[i] ); + } + fclose( lfp ); + + msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from calllast_once, msize=%d\n", msize ); + sprintf( command, "%s/lastal -v -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", whereispairalign, msize, laste, -penalty, -penalty_ex ); +// sprintf( command, "lastal -v -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", 1, laste, -penalty, -penalty_ex ); +// sprintf( command, "lastal -v -e 40 -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", -penalty, -penalty_ex ); + res = system( command ); + if( res ) + { + fprintf( stderr, "LAST aborted\n" ); + exit( 1 ); + } + + lfp = fopen( "_lastres", "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres" ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); + fprintf( stderr, "Reading lastres\n" ); + readlastresx( lfp, nd, nq, lastresx, dseq, qseq ); + fclose( lfp ); +} + +static void callfoldalign( int nseq, char **mseq ) +{ + FILE *fp; + int i; + int res; + static char com[10000]; + + for( i=0; i%d\n", i+1 ); + fprintf( fp, "%s\n", mseq[i] ); + } + fclose( fp ); + + sprintf( com, "env PATH=%s foldalign210 %s _foldalignin > _foldalignout ", whereispairalign, foldalignopt ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in foldalign\n" ); + exit( 1 ); + } + +} + +static void calllara( int nseq, char **mseq, char *laraarg ) +{ + FILE *fp; + int i; + int res; + static char com[10000]; + +// for( i=0; i%d\n", i+1 ); + fprintf( fp, "%s\n", mseq[i] ); + } + fclose( fp ); + + +// fprintf( stderr, "calling LaRA\n" ); + sprintf( com, "env PATH=%s:/bin:/usr/bin mafft_lara -i _larain -w _laraout -o _lara.params %s", whereispairalign, laraarg ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in lara\n" ); + exit( 1 ); + } +} + +static double recalllara( char **mseq1, char **mseq2, int alloclen ) +{ + static FILE *fp = NULL; + static char *ungap1; + static char *ungap2; + static char *ori1; + static char *ori2; +// int res; + static char com[10000]; + double value; + + + if( fp == NULL ) + { + fp = fopen( "_laraout", "r" ); + if( fp == NULL ) + { + fprintf( stderr, "Cannot open _laraout\n" ); + exit( 1 ); + } + ungap1 = AllocateCharVec( alloclen ); + ungap2 = AllocateCharVec( alloclen ); + ori1 = AllocateCharVec( alloclen ); + ori2 = AllocateCharVec( alloclen ); + } + + + strcpy( ori1, *mseq1 ); + strcpy( ori2, *mseq2 ); + + fgets( com, 999, fp ); + myfgets( com, 9999, fp ); + strcpy( *mseq1, com ); + myfgets( com, 9999, fp ); + strcpy( *mseq2, com ); + + gappick0( ungap1, *mseq1 ); + gappick0( ungap2, *mseq2 ); + t2u( ungap1 ); + t2u( ungap2 ); + t2u( ori1 ); + t2u( ori2 ); + + if( strcmp( ungap1, ori1 ) || strcmp( ungap2, ori2 ) ) + { + fprintf( stderr, "SEQUENCE CHANGED!!\n" ); + fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); + fprintf( stderr, "ungap1 = %s\n", ungap1 ); + fprintf( stderr, "ori1 = %s\n", ori1 ); + fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + fprintf( stderr, "ungap2 = %s\n", ungap2 ); + fprintf( stderr, "ori2 = %s\n", ori2 ); + exit( 1 ); + } + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +// fclose( fp ); // saigo dake yatta houga yoi. + + return( value ); +} + + +static double calldafs_giving_bpp( char **mseq1, char **mseq2, char **bpp1, char **bpp2, int alloclen, int i, int j ) +{ + FILE *fp; + int res; + char *com; + double value; + char *dirname; + + + dirname = calloc( 100, sizeof( char ) ); + com = calloc( 1000, sizeof( char ) ); + sprintf( dirname, "_%d-%d", i, j ); + sprintf( com, "rm -rf %s", dirname ); + system( com ); + sprintf( com, "mkdir %s", dirname ); + system( com ); + + + sprintf( com, "%s/_bpporg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot write to %s/_bpporg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">a\n" ); + while( *bpp1 ) + fprintf( fp, "%s", *bpp1++ ); + + fprintf( fp, ">b\n" ); + while( *bpp2 ) + fprintf( fp, "%s", *bpp2++ ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_bpporg > %s/_bpp", dirname, dirname ); + system( com ); // for cygwin, wakaran + + t2u( *mseq1 ); + t2u( *mseq2 ); + + sprintf( com, "%s/_dafsinorg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_dafsinorg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">1\n" ); +// fprintf( fp, "%s\n", *mseq1 ); + write1seq( fp, *mseq1 ); + fprintf( fp, ">2\n" ); +// fprintf( fp, "%s\n", *mseq2 ); + write1seq( fp, *mseq2 ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_dafsinorg > %s/_dafsin", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "_dafssh%s", dirname ); + fp = fopen( com, "w" ); + fprintf( fp, "cd %s\n", dirname ); + fprintf( fp, "%s/dafs --mafft-in _bpp _dafsin > _dafsout 2>_dum\n", whereispairalign ); + fprintf( fp, "exit $tatus\n" ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < _dafssh%s > _dafssh%s.unix", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "sh _dafssh%s.unix 2>_dum%s", dirname, dirname ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in dafs\n" ); + exit( 1 ); + } + + sprintf( com, "%s/_dafsout", dirname ); + + fp = fopen( com, "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_dafsout\n", dirname ); + exit( 1 ); + } + + myfgets( com, 999, fp ); // nagai kanousei ga arunode + fgets( com, 999, fp ); + myfgets( com, 999, fp ); // nagai kanousei ga arunode + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq1 ); + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq2 ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +#if 0 + sprintf( com, "rm -rf %s > /dev/null 2>&1", dirname ); + if( system( com ) ) + { + fprintf( stderr, "retrying to rmdir\n" ); + usleep( 2000 ); + system( com ); + } +#endif + + free( dirname ); + free( com ); + + + return( value ); +} + +static double callmxscarna_giving_bpp( char **mseq1, char **mseq2, char **bpp1, char **bpp2, int alloclen, int i, int j ) +{ + FILE *fp; + int res; + char *com; + double value; + char *dirname; + + + dirname = calloc( 100, sizeof( char ) ); + com = calloc( 1000, sizeof( char ) ); + sprintf( dirname, "_%d-%d", i, j ); + sprintf( com, "rm -rf %s", dirname ); + system( com ); + sprintf( com, "mkdir %s", dirname ); + system( com ); + + + sprintf( com, "%s/_bpporg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot write to %s/_bpporg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">a\n" ); + while( *bpp1 ) + fprintf( fp, "%s", *bpp1++ ); + + fprintf( fp, ">b\n" ); + while( *bpp2 ) + fprintf( fp, "%s", *bpp2++ ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_bpporg > %s/_bpp", dirname, dirname ); + system( com ); // for cygwin, wakaran + + t2u( *mseq1 ); + t2u( *mseq2 ); + + sprintf( com, "%s/_mxscarnainorg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_mxscarnainorg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">1\n" ); +// fprintf( fp, "%s\n", *mseq1 ); + write1seq( fp, *mseq1 ); + fprintf( fp, ">2\n" ); +// fprintf( fp, "%s\n", *mseq2 ); + write1seq( fp, *mseq2 ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_mxscarnainorg > %s/_mxscarnain", dirname, dirname ); + system( com ); // for cygwin, wakaran + +#if 0 + sprintf( com, "cd %s; %s/mxscarnamod -readbpp _mxscarnain > _mxscarnaout 2>_dum", dirname, whereispairalign ); +#else + sprintf( com, "_mxscarnash%s", dirname ); + fp = fopen( com, "w" ); + fprintf( fp, "cd %s\n", dirname ); + fprintf( fp, "%s/mxscarnamod -readbpp _mxscarnain > _mxscarnaout 2>_dum\n", whereispairalign ); + fprintf( fp, "exit $tatus\n" ); + fclose( fp ); +//sleep( 10000 ); + + sprintf( com, "tr -d '\\r' < _mxscarnash%s > _mxscarnash%s.unix", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "sh _mxscarnash%s.unix 2>_dum%s", dirname, dirname ); +#endif + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in mxscarna\n" ); + exit( 1 ); + } + + sprintf( com, "%s/_mxscarnaout", dirname ); + + fp = fopen( com, "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_mxscarnaout\n", dirname ); + exit( 1 ); + } + + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq1 ); + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq2 ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +#if 0 + sprintf( com, "rm -rf %s > /dev/null 2>&1", dirname ); + if( system( com ) ) + { + fprintf( stderr, "retrying to rmdir\n" ); + usleep( 2000 ); + system( com ); + } +#endif + + free( dirname ); + free( com ); + + + return( value ); +} + +static void readhat4( FILE *fp, char ***bpp ) +{ + char oneline[1000]; + int bppsize; + int onechar; +// double prob; +// int posi, posj; + + bppsize = 0; +// fprintf( stderr, "reading hat4\n" ); + onechar = getc(fp); +// fprintf( stderr, "onechar = %c\n", onechar ); + if( onechar != '>' ) + { + fprintf( stderr, "Format error\n" ); + exit( 1 ); + } + ungetc( onechar, fp ); + fgets( oneline, 999, fp ); + while( 1 ) + { + onechar = getc(fp); + ungetc( onechar, fp ); + if( onechar == '>' || onechar == EOF ) + { +// fprintf( stderr, "Next\n" ); + *bpp = realloc( *bpp, (bppsize+2) * sizeof( char * ) ); + (*bpp)[bppsize] = NULL; + break; + } + fgets( oneline, 999, fp ); +// fprintf( stderr, "oneline=%s\n", oneline ); +// sscanf( oneline, "%d %d %lf", &posi, &posj, &prob ); +// fprintf( stderr, "%d %d -> %f\n", posi, posj, prob ); + *bpp = realloc( *bpp, (bppsize+2) * sizeof( char * ) ); + (*bpp)[bppsize] = calloc( 100, sizeof( char ) ); + strcpy( (*bpp)[bppsize], oneline ); + bppsize++; + } +} + +static void preparebpp( int nseq, char ***bpp ) +{ + FILE *fp; + int i; + + fp = fopen( "hat4", "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open hat4\n" ); + exit( 1 ); + } + for( i=0; i 0 && (*++argv)[0] == '-' ) + { +// reporterr( "(*argv)[0] in while loop = %s\n", (*argv) ); + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; +#if 0 + case 'l': + ppslocal = (int)( atof( *++argv ) * 1000 + 0.5 ); + pslocal = (int)( 600.0 / 1000.0 * ppslocal + 0.5); +// fprintf( stderr, "ppslocal = %d\n", ppslocal ); +// fprintf( stderr, "pslocal = %d\n", pslocal ); + --argc; + goto nextoption; +#else + case 'l': + if( atof( *++argv ) < 0.00001 ) store_localhom = 0; + --argc; + goto nextoption; +#endif + case 'd': + whereispairalign = *++argv; + fprintf( stderr, "whereispairalign = %s\n", whereispairalign ); + --argc; + goto nextoption; + case 'p': + laraparams = *++argv; + fprintf( stderr, "laraparams = %s\n", laraparams ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; +#ifndef enablemultithread + nthread = 0; +#endif + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); +// fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'w': + lastm = myatoi( *++argv ); + fprintf( stderr, "lastm = %d\n", lastm ); + --argc; + goto nextoption; + case 'e': + laste = myatoi( *++argv ); + fprintf( stderr, "laste = %d\n", laste ); + --argc; + goto nextoption; + case 'u': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; + case 'K': // Hontou ha iranai. disttbfast.c, tbfast.c to awaserutame. + break; + case 'c': + stdout_dist = 1; + break; + case 'n': + stdout_align = 1; + break; + case 'x': + store_localhom = 0; + store_dist = 0; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif +#if 0 + case 'r': + fmodel = -1; + break; +#endif + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; +#endif +#if 0 + case 'Q': + calledByXced = 1; + break; + case 'x': + disp = 1; + break; + case 'a': + alg = 'a'; + break; + case 'S': + alg = 'S'; + break; +#endif + case 'U': + lastonce = 1; + break; + case 'S': + lastsubopt = 1; + break; + case 't': + alg = 't'; + store_localhom = 0; + break; + case 'L': + alg = 'L'; + break; + case 'Y': + alg = 'Y'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> L; + break; + case 'Z': + usenaivescoreinsteadofalignmentscore = 1; + break; + case 's': + alg = 's'; + break; + case 'G': + alg = 'G'; + break; + case 'B': + alg = 'B'; + break; + case 'T': + alg = 'T'; + break; + case 'H': + alg = 'H'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'r': + alg = 'r'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> R, last + break; + case 'N': + alg = 'N'; + break; + case 'A': + alg = 'A'; + break; + case 'V': + alg = 'V'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'y': + divpairscore = 1; + break; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'o': +// foldalignopt = *++argv; + strcat( foldalignopt, " " ); + strcat( foldalignopt, *++argv ); + fprintf( stderr, "foldalignopt = %s\n", foldalignopt ); + --argc; + goto nextoption; +#if 0 + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; +#endif + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "pairlocalalign options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + +int countamino( char *s, int end ) +{ + int val = 0; + while( end-- ) + if( *s++ != '-' ) val++; + return( val ); +} + +static double score2dist( double pscore, double selfscore1, double selfscore2) +{ + double val; + double bunbo; +// fprintf( stderr, "In score2dist\n" ); + + if( (bunbo=MIN( selfscore1, selfscore2 )) == 0.0 ) + val = 2.0; + else if( bunbo < pscore ) // mondai ari + val = 0.0; + else + val = ( 1.0 - pscore / bunbo ) * 2.0; + return( val ); +} + +#if enablemultithread +static void *athread( void *arg ) // alg='R', alg='r' -> tsukawarenai. +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int i, ilim, j, jst; + int off1, off2, dum1, dum2, thereisx; + int intdum; + double pscore = 0.0; // by D.Mathog + double *effarr1; + double *effarr2; + char **mseq1, **mseq2, **distseq1, **distseq2, **dumseq1, **dumseq2; + char **aseq; + double **dynamicmtx = NULL; + double dist; + double scoreoffset; + +// thread_arg + int thread_no = targ->thread_no; + int njob = targ->njob; + Jobtable *jobpospt = targ->jobpospt; + char **name = targ->name; + char **seq = targ->seq; + char **dseq = targ->dseq; + int *thereisxineachseq = targ->thereisxineachseq; + LocalHom **localhomtable = targ->localhomtable; + double **distancemtx = targ->distancemtx; + double *selfscore = targ->selfscore; + char ***bpp = targ->bpp; + Lastresx **lastresx = targ->lastresx; + int alloclen = targ->alloclen; + int *targetmap = targ->targetmap; + double **expdist = targ->expdist; + +// fprintf( stderr, "thread %d start!\n", thread_no ); + + effarr1 = AllocateDoubleVec( 1 ); + effarr2 = AllocateDoubleVec( 1 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + if( alg == 'N' ) + { + dumseq1 = AllocateCharMtx( 1, alloclen+10 ); + dumseq2 = AllocateCharMtx( 1, alloclen+10 ); + } + distseq1 = AllocateCharMtx( 1, 0 ); + distseq2 = AllocateCharMtx( 1, 0 ); + aseq = AllocateCharMtx( 2, alloclen+10 ); + if( specificityconsideration > 0.0 ) dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + + if( alg == 'Y' || alg == 'r' ) ilim = njob - nadd; + else ilim = njob - 1; + + + while( 1 ) + { + pthread_mutex_lock( targ->mutex_counter ); + j = jobpospt->j; + i = jobpospt->i; + j++; + if( j == njob ) + { + i++; + + if( alg == 'Y' || alg == 'r' ) jst = njob - nadd; + else jst = i + 1; + j = jst; + + if( i == ilim ) + { +// fprintf( stderr, "thread %d end!\n", thread_no ); + pthread_mutex_unlock( targ->mutex_counter ); + + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // 20130603 + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); + L__align11( NULL, 0.0, NULL, NULL, 0, NULL, NULL ); + L__align11_noalign( NULL, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); + free( effarr1 ); + free( effarr2 ); + free( mseq1 ); + free( mseq2 ); + if( alg == 'N' ) + { + FreeCharMtx( dumseq1 ); + FreeCharMtx( dumseq2 ); + } + free( distseq1 ); + free( distseq2 ); + FreeCharMtx( aseq ); + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + return( NULL ); + } + } + jobpospt->j = j; + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex_counter ); + + +// if( j == i+1 || j % 100 == 0 ) + if( j == i+1 && i % 10 == 0 ) + { + fprintf( stderr, "% 5d / %d (by thread %3d) \r", i, njob-nadd, thread_no ); +// fprintf( stderr, "% 5d - %5d / %d (thread %d)\n", i, j, njob, thread_no ); + } + + + if( strlen( seq[i] ) == 0 || strlen( seq[j] ) == 0 ) + { + if( store_dist ) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = 3.0; + else distancemtx[i][j-i] = 3.0; + } + if( stdout_dist) + { + pthread_mutex_lock( targ->mutex_stdout ); + fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, 3.0 ); + pthread_mutex_unlock( targ->mutex_stdout ); + } + continue; + } + + strcpy( aseq[0], seq[i] ); + strcpy( aseq[1], seq[j] ); +// clus1 = conjuctionfortbfast( pair, i, aseq, mseq1, effarr1, effarr, indication1 ); +// clus2 = conjuctionfortbfast( pair, j, aseq, mseq2, effarr2, effarr, indication2 ); +// fprintf( stderr, "Skipping conjuction..\n" ); + + effarr1[0] = 1.0; + effarr2[0] = 1.0; + mseq1[0] = aseq[0]; + mseq2[0] = aseq[1]; + + thereisx = thereisxineachseq[i] + thereisxineachseq[j]; +// strcpy( distseq1[0], dseq[i] ); // nen no tame +// strcpy( distseq2[0], dseq[j] ); // nen no tame + distseq1[0] = dseq[i]; + distseq2[0] = dseq[j]; + +// fprintf( stderr, "mseq1 = %s\n", mseq1[0] ); +// fprintf( stderr, "mseq2 = %s\n", mseq2[0] ); + +#if 0 + fprintf( stderr, "group1 = %.66s", indication1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + fprintf( stderr, "\n" ); +#endif +// for( l=0; l 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( ( scoreoffset = dist2offset( dist ) ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + L__align11( dynamicmtx, scoreoffset, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // CHUUI!!!!!! + break; + case( 'Y' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) // new sequence vs exiting sequence nomi keisan + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + if( store_localhom ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // uwagaki + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } + else + pscore = 0.0; + break; + case( 'A' ): + if( usenaivescoreinsteadofalignmentscore ) + { + G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// if( store_localhom ) + if( store_localhom && ( targetmap[i] != -1 || targetmap[j] != -1 ) ) + { + pscore = G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + if( thereisx ) pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); +// dist = score2dist( L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ), selfscore[i], selfscore[j] ); // 2014/Feb/20 + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + G__align11( dynamicmtx, mseq1, mseq2, alloclen, outgap, outgap ); + + } +// pscore = (double)naivepairscore11( *mseq1, *mseq2, 0.0 ); + } +#endif + } + else + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki + } + off1 = off2 = 0; + break; + case( 'N' ): + if( usenaivescoreinsteadofalignmentscore ) + { + genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + pscore = genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) + { + strcpy( dumseq1[0], distseq1[0] ); + strcpy( dumseq2[0], distseq2[0] ); + pscore = genL__align11( n_dis_consweight_multi, dumseq1, dumseq2, alloclen, &dum1, &dum2 ); // uwagaki + } +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + genL__align11( dynamicmtx, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + break; + case( 't' ): + off1 = off2 = 0; +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // tsuneni distseq shiyou + break; + case( 's' ): + pscore = callmxscarna_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'G' ): + pscore = calldafs_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; +#if 0 + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen ); + off1 = off2 = 0; + break; + case( 'K' ): + pscore = genG__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 'H' ): + pscore = recallpairfoldalign( mseq1, mseq2, i, j, &off1, &off2, alloclen ); + break; + case( 'B' ): + case( 'T' ): + pscore = recalllara( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 'M' ): + pscore = MSalign11( mseq1, mseq2, alloclen ); + break; +#endif + default: + ErrorExit( "\n\nERROR IN SOURCE FILE\n\n" ); + } + } + + if( alg == 't' || ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) // 't' no jouken ha iranai to omou. if( ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) + { +#if SCOREOUT + fprintf( stderr, "score = %10.2f (%d,%d)\n", pscore, i, j ); +#endif +// if( pscore > 0.0 && ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) x-ins-i de seido teika + if( ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) + { + if( !store_localhom ) + ; + else if( specifictarget && targetmap[i] == -1 && targetmap[j] == -1) + ; + else if( alg == 'R' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j, lastresx[i]+j, 'h' ); + else if( alg == 'r' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), lastresx[i]+j-(njob-nadd), 'h' );// ????? + else if( alg == 'H' ) + putlocalhom_ext( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( alg == 'Y' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( !specifictarget && alg != 'S' && alg != 'V' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-i, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else +// putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ) ); + { + if( targetmap[i] != -1 && targetmap[j] != -1 ) + { + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); // sukoshi muda. + } + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + else if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); +#if 0 + if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); +#endif + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + } + } + pscore = score2dist( pscore, selfscore[i], selfscore[j] ); + +// pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); +// pscore = score2dist( pscore, selfscore[i], selfscore[j] ); +// reporterr( "->pscore = %f\n", pscore ); + + } + else + { + pscore = 2.0; + } + +#if 1 // mutex + if( stdout_align ) + { + pthread_mutex_lock( targ->mutex_stdout ); + if( alg != 't' ) + { + fprintf( stdout, "sequence %d - sequence %d, pairwise distance = %10.5f\n", i+1, j+1, pscore ); + fprintf( stdout, ">%s\n", name[i] ); + write1seq( stdout, mseq1[0] ); + fprintf( stdout, ">%s\n", name[j] ); + write1seq( stdout, mseq2[0] ); + fprintf( stdout, "\n" ); + } + pthread_mutex_unlock( targ->mutex_stdout ); + } + if( stdout_dist ) + { + pthread_mutex_lock( targ->mutex_stdout ); + if( j == i+1 ) fprintf( stdout, "%d %d d=%.3f\n", i+1, i+1, 0.0 ); + fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, pscore ); + pthread_mutex_unlock( targ->mutex_stdout ); + } +#endif // mutex + if( store_dist ) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = pscore; + else distancemtx[i][j-i] = pscore; + } + } +} +#endif + +static void pairalign( char **name, int *nlen, char **seq, char **aseq, char **dseq, int *thereisxineachseq, char **mseq1, char **mseq2, int alloclen, Lastresx **lastresx, double **distancemtx, LocalHom **localhomtable, double **expdist, int ngui ) +{ + int i, j, ilim, jst, jj; + int off1, off2, dum1, dum2, thereisx; + double pscore = 0.0; // by D.Mathog + FILE *hat2p, *hat3p; +// double **distancemtx; + double *selfscore; + double *effarr1; + double *effarr2; + char *pt; + char *hat2file = "hat2"; +// LocalHom **localhomtable = NULL, + LocalHom *tmpptr; + int intdum; + char ***bpp = NULL; // mxscarna no toki dake + char **distseq1, **distseq2; + char **dumseq1, **dumseq2; + double dist; + double scoreoffset; + int ntarget; + int *targetmap, *targetmapr; + + + if( specifictarget ) + { + targetmap = calloc( njob, sizeof( int ) ); + ntarget = 0; + for( i=0; i_focus_' to the title lines of the sequences to be focused on.\n\n" ); + exit( 1 ); + } + else + { + reporterr( "nfocus = %d \n", ntarget ); + } + } + else + { + ntarget = njob; + targetmap = calloc( njob, sizeof( int ) ); + targetmapr = calloc( njob, sizeof( int ) ); + for( i=0; i 0 ) // alg=='r' || alg=='R' -> nthread:=0 (sukoshi ue) + { + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex_counter; + pthread_mutex_t mutex_stdout; + thread_arg_t *targ; + + if( alg == 'Y' || alg == 'r' ) jobpos.j = njob - nadd - 1; + else jobpos.j = 0; + jobpos.i = 0; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex_counter, NULL ); + pthread_mutex_init( &mutex_stdout, NULL ); + + for( i=0; i 0.0 ) dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + + if( alg == 'Y' || alg == 'r' ) ilim = njob - nadd; + else ilim = njob - 1; + for( i=0; i 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); +// dist = score2dist( L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ), selfscore[i], selfscore[j] ); // 2014/Feb/20 + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + G__align11( dynamicmtx, mseq1, mseq2, alloclen, outgap, outgap ); + } +// pscore = (double)naivepairscore11( *mseq1, *mseq2, 0.0 ); + } +#endif + } + else + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki + } + off1 = off2 = 0; + break; + case( 'N' ): +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + if( usenaivescoreinsteadofalignmentscore ) + { + genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + pscore = genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) + { + strcpy( dumseq1[0], distseq1[0] ); + strcpy( dumseq2[0], distseq2[0] ); + pscore = genL__align11( n_dis_consweight_multi, dumseq1, dumseq2, alloclen, &dum1, &dum2 ); // uwagaki + } +#if 1 + if( specificityconsideration > 0.0 ) + { +// fprintf( stderr, "dist = %f\n", score2dist( pscore, selfscore[i], selfscore[j] ) ); + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + genL__align11( dynamicmtx, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + break; + case( 'R' ): + if( nadd && njob-nadd <= j && njob-nadd <= i ) // new sequence doushi ha mushi + pscore = 0.0; + else + pscore = (double)lastresx[i][j].score; // all pair + break; + case( 'r' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) + pscore = (double)lastresx[i][j-(njob-nadd)].score; + else + pscore = 0.0; + break; + case( 'L' ): + if( nadd && njob-nadd <= j && njob-nadd <= i ) // new sequence doushi ha mushi + pscore = 0.0; + else + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// if( store_localhom ) + if( store_localhom && ( targetmap[i] != -1 || targetmap[j] != -1 ) ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); // all pair + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // all pair +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( ( scoreoffset = dist2offset( dist ) ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + L__align11( dynamicmtx, scoreoffset, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // all pair + } + } +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // CHUUI!!!!!! + break; + case( 'Y' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) // new sequence vs exiting sequence nomi keisan + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + if( store_localhom ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // uwagaki + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } + else + pscore = 0.0; + break; + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, 1, 1, alloclen ); + off1 = off2 = 0; + break; +#if 0 + case( 'K' ): + pscore = genG__align11( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; +#endif + case( 'H' ): + pscore = recallpairfoldalign( mseq1, mseq2, i, j, &off1, &off2, alloclen ); + break; + case( 'B' ): + case( 'T' ): + pscore = recalllara( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 's' ): + pscore = callmxscarna_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'G' ): + pscore = calldafs_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'M' ): + pscore = MSalign11( mseq1, mseq2, alloclen ); + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + + if( alg == 't' || ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) // 't' no jouken ha iranai to omou. if( ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) + { +#if SCOREOUT + fprintf( stderr, "score = %10.2f (%d,%d)\n", pscore, i, j ); +#endif +// if( pscore > 0.0 && ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) // x-ins-i de seido teika + if( ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) + { + if( !store_localhom ) + ; + else if( specifictarget && targetmap[i] == -1 && targetmap[j] == -1) + ; + else if( alg == 'R' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j, lastresx[i]+j, 'h' ); + else if( alg == 'r' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), lastresx[i]+j-(njob-nadd), 'h' );// ????? + else if( alg == 'H' ) + putlocalhom_ext( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( alg == 'Y' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( !specifictarget && alg != 'S' && alg != 'V' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-i, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else + { + if( targetmap[i] != -1 && targetmap[j] != -1 ) + { + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); // sukoshi muda. + } + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + else if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + } + } + + pscore = score2dist( pscore, selfscore[i], selfscore[j] ); + } + else + { + pscore = 2.0; + } + + if( stdout_align ) + { + if( alg != 't' ) + { + fprintf( stdout, "sequence %d - sequence %d, pairwise distance = %10.5f\n", i+1, j+1, pscore ); + fprintf( stdout, ">%s\n", name[i] ); + write1seq( stdout, mseq1[0] ); + fprintf( stdout, ">%s\n", name[j] ); + write1seq( stdout, mseq2[0] ); + fprintf( stdout, "\n" ); + } + } + if( stdout_dist ) fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, pscore ); + if( store_dist) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = pscore; + else distancemtx[i][j-i] = pscore; + } + } + } + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + } + + + if( store_dist && ngui == 0 ) + { + hat2p = fopen( hat2file, "w" ); + if( !hat2p ) ErrorExit( "Cannot open hat2." ); + if( alg == 'Y' || alg == 'r' ) + WriteHat2_part_pointer( hat2p, njob, nadd, name, distancemtx ); + else +// WriteHat2_pointer( hat2p, njob, name, distancemtx ); + WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, distancemtx ); // jissiha double + fclose( hat2p ); + } + + hat3p = fopen( "hat3", "w" ); + if( !hat3p ) ErrorExit( "Cannot open hat3." ); + if( store_localhom && ngui == 0 ) + { + + fprintf( stderr, "\n\n##### writing hat3\n" ); + if( alg == 'Y' || alg == 'r' ) + ilim = njob-nadd; + else if( specifictarget ) + ilim = ntarget; + else + ilim = njob-1; + for( i=0; inext ) + { +// fprintf( stderr, "j=%d, jj=%d\n", j, jj ); + if( tmpptr->opt == -1.0 ) continue; +// tmptmptmptmptmp +// if( alg == 'B' || alg == 'T' ) +// fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, 1.0, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, (void *)tmpptr->next ); +// else + if( targetmap[j] == -1 || targetmap[i] < targetmap[j] ) + fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d h\n", targetmapr[i], j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2 ); +// fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d h\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2+1, tmpptr->end2+1 ); // zettai dame!!!! + } + } + } +// if( ngui == 0 ) +// { +#if DEBUG + fprintf( stderr, "calling FreeLocalHomTable\n" ); +#endif + if( alg == 'Y' || alg == 'r' ) + FreeLocalHomTable_part( localhomtable, (njob-nadd), nadd ); + else if( specifictarget ) + FreeLocalHomTable_part( localhomtable, ntarget, njob ); + else + FreeLocalHomTable_half( localhomtable, njob ); +#if DEBUG + fprintf( stderr, "done. FreeLocalHomTable\n" ); +#endif +// } + } + fclose( hat3p ); + + if( alg == 's' ) + { + char **ptpt; + for( i=0; i M ) + { + fprintf( stderr, "The number of sequences must be < %d\n", M ); + fprintf( stderr, "Please try the splittbfast program for such large data.\n" ); + exit( 1 ); + } + } + + if( ( alg == 'r' || alg == 'R' ) && dorp == 'p' ) + { + fprintf( stderr, "Not yet supported\n" ); + exit( 1 ); + } + + alloclen = nlenmax*2; + if( ngui ) + { + seq = seqgui; + name = namegui; + } + else + { + seq = AllocateCharMtx( njob, alloclen+10 ); + name = AllocateCharMtx( njob, B ); + } + + aseq = AllocateCharMtx( 2, alloclen+10 ); + bseq = AllocateCharMtx( njob, alloclen+10 ); + dseq = AllocateCharMtx( njob, alloclen+10 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + nlen = AllocateIntVec( njob ); + thereisxineachseq = AllocateIntVec( njob ); + + + if( alg == 'R' ) + { + lastresx = calloc( njob+1, sizeof( Lastresx * ) ); + for( i=0; i 1 ) + { + fprintf( stderr, "\nThe order of distances is not identical to that in the input file, because of the parallel calculation. Reorder them by yourself, using sort -n -k 2 | sort -n -k 1 -s\n" ); + } + if( stdout_align && nthread > 1 ) + { + fprintf( stderr, "\nThe order of pairwise alignments is not identical to that in the input file, because of the parallel calculation. Reorder them by yourself.\n" ); + } + +#if 1 + if( lastresx ) + { + for( i=0; lastresx[i]; i++ ) + { + for( j=0; lastresx[i][j].naln!=-1; j++ ) + { + for( k=0; k&2\n sleep 2\n done\n" ); +// reporterr( "before bcast\n" ); +// system( "hostname 1>&2" ); + MPI_Barrier(MPI_COMM_WORLD); +// reporterr( "after bcast\n" ); +// system( "hostname 1>&2" ); +#endif + + if(my_rank==0){ + fn = calloc( 100, sizeof( char ) ); +// system( "rm -rf hat3dir/" ); // toriaezu +// system( "mkdir -p hat3dir/" ); // toriaezu + for( i=0; i&2" ); + } +#if 0 // -> mltalln9_mpi.c + // synchronize all processes to make sure hat3dir/ is cached in all nodes + MPI_Barrier(MPI_COMM_WORLD); +// system( "echo 3 > /proc/sys/vm/drop_caches 1>&2" ); // only for root +// system( "ls -ltrR hat3dir/ 1>&2" ); +// system( "hostname 1>&2" ); + fn = calloc( 100, sizeof( char ) ); + for( i=0; i0; i-- ) + { + if( alignmentlength != strlen( seq[i] ) ) + { + fprintf( stderr, "#################################################################################\n" ); + fprintf( stderr, "# ERROR! \n" ); + fprintf( stderr, "# For the --add option, the original%4d sequences must be aligned \n", njob-nadd ); + fprintf( stderr, "#################################################################################\n" ); + exit( 1 ); + } + } + } + + if( specifictarget ) + { + reporterr( "specifictarget\n" ); + + ntarget = 0; + for( i=0; i_focus_' to the title lines of the sequences to be focused on.\n\n" ); + exit( 1 ); + } + else + { + reporterr( "nfocus = %d \n", ntarget ); + } + } + else + { + ntarget = njob; +// targetmap = calloc( njob, sizeof( int ) ); +// targetmapr = calloc( njob, sizeof( int ) ); + +// for( i=0; i all positive + +double ribosum4[4][4] = +{ +// a g c t +{ 2.22, -1.46, -1.86, -1.39, }, // a +{ -1.46, 1.03, -2.48, -1.74, }, // g +{ -1.86, -2.48, 1.16, -1.05, }, // c +{ -1.39, -1.74, -1.05, 1.65, }, // t +}; + +double ribosum16[16][16] = +{ +// aa ag ac at ga gg gc gt ca cg cc ct ta tg tc tt +{ -2.49, -8.24, -7.04, -4.32, -6.86, -8.39, -5.03, -5.84, -8.84, -4.68, -14.37, -12.64, -4.01, -6.16, -11.32, -9.05, }, // aa +{ -8.24, -0.80, -8.89, -5.13, -8.61, -5.38, -5.77, -6.60, -10.41, -4.57, -14.53, -10.14, -5.43, -5.94, -8.87, -11.07, }, // ag +{ -7.04, -8.89, -2.11, -2.04, -9.73, -11.05, -3.81, -4.72, -9.37, -5.86, -9.08, -10.45, -5.33, -6.93, -8.67, -7.83, }, // ac +{ -4.32, -5.13, -2.04, 4.49, -5.33, -5.61, 2.70, 0.59, -5.56, 1.67, -6.71, -5.17, 1.61, -0.51, -4.81, -2.98, }, // at +{ -6.86, -8.61, -9.73, -5.33, -1.05, -8.67, -4.88, -6.10, -7.98, -6.00, -12.43, -7.71, -5.85, -7.55, -6.63, -11.54, }, // ga +{ -8.39, -5.38, -11.05, -5.61, -8.67, -1.98, -4.13, -5.77, -11.36, -4.66, -12.58, -13.69, -5.75, -4.27, -12.01, -10.79, }, // gg +{ -5.03, -5.77, -3.81, 2.70, -4.88, -4.13, 5.62, 1.21, -5.95, 2.11, -3.70, -5.84, 1.60, -0.08, -4.49, -3.90, }, // gc +{ -5.84, -6.60, -4.72, 0.59, -6.10, -5.77, 1.21, 3.47, -7.93, -0.27, -7.88, -5.61, -0.57, -2.09, -5.30, -4.45, }, // gt +{ -8.84, -10.41, -9.37, -5.56, -7.98, -11.36, -5.95, -7.93, -5.13, -3.57, -10.45, -8.49, -2.42, -5.63, -7.08, -8.39, }, // ca +{ -4.68, -4.57, -5.86, 1.67, -6.00, -4.66, 2.11, -0.27, -3.57, 5.36, -5.71, -4.96, 2.75, 1.32, -4.91, -3.67, }, // cg +{ -14.37, -14.53, -9.08, -6.71, -12.43, -12.58, -3.70, -7.88, -10.45, -5.71, -3.59, -5.77, -6.88, -8.41, -7.40, -5.41, }, // cc +{ -12.64, -10.14, -10.45, -5.17, -7.71, -13.69, -5.84, -5.61, -8.49, -4.96, -5.77, -2.28, -4.72, -7.36, -3.83, -5.21, }, // ct +{ -4.01, -5.43, -5.33, 1.61, -5.85, -5.75, 1.60, -0.57, -2.42, 2.75, -6.88, -4.72, 4.97, 1.14, -2.98, -3.39, }, // ta +{ -6.16, -5.94, -6.93, -0.51, -7.55, -4.27, -0.08, -2.09, -5.63, 1.32, -8.41, -7.36, 1.14, 3.36, -4.76, -4.28, }, // tg +{ -11.32, -8.87, -8.67, -4.81, -6.63, -12.01, -4.49, -5.30, -7.08, -4.91, -7.40, -3.83, -2.98, -4.76, -3.21, -5.97, }, // tc +{ -9.05, -11.07, -7.83, -2.98, -11.54, -10.79, -3.90, -4.45, -8.39, -3.67, -5.41, -5.21, -3.39, -4.28, -5.97, -0.02, }, // tt +}; + +int locpenaltyn = -1750; +char locaminon[] = "agctuAGCTUnNbdhkmnrsvwyx-O"; +char locgrpn[] = +{ + 0, 1, 2, 3, 3, 0, 1, 2, 3, 3, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5 +}; +int exgpn = +00; +int locn_disn[26][26] = +/* u ha constants.c no nakade shori */ +/* 0 - 4 dake yomareru. */ + { + { + 1000, 600, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 600, 1000, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 1000, 600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 600, 1000, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 500, 500, 0, 0, 0, 500, 500, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -500, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + }, + + { + -500, -500, -500, -500, -500, -500, -500, -500, -500, -500, + -500, -500, -500, -500, -500, -500, -500, -500, -500, -500, + -500, -500, -500, -500, 0, 500, + }, + }; diff --git a/mafft/src/mafft-7.487-with-extensions/core/Dalignmm.c b/mafft/src/mafft-7.487-with-extensions/core/Dalignmm.c new file mode 100644 index 0000000000..d9b9e65f37 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/Dalignmm.c @@ -0,0 +1,6266 @@ +#include "mltaln.h" +#include "dp.h" + +#define DEBUG 0 + +#define WMCHECK 1 +#define ALGZSTRAIGHT 0 +#define ALGZGAP 0 +#define USEGAPLENMTX 0 +#define USEGAPLENHALF 0 +#define FREEFREQUENTLY 1 + +#define IDATEND 0 + + +#define MACHIGAI 0 +#define OUTGAP0TRY 0 +#define XXXXXXX 0 +#define USE_PENALTY_EX 0 +#define FASTMATCHCALC 1 +#define SLOW 0 + +#define zero 0 +#define one 1 + +#if USEGAPLENHALF +#define USEGAPLENHALFORMTX 1 +#endif +#if USEGAPLENMTX +#define USEGAPLENHALFORMTX 1 +#endif + + +#if WMCHECK +static int PFACERROR = 0; +#endif + + +static TLS double **impmtx = NULL; +static TLS int impalloclen = 0; + +double imp_match_out_scD( int i1, int j1 ) +{ +// fprintf( stderr, "imp+match = %f\n", impmtx[i1][j1] * fastathreshold ); +// fprintf( stderr, "val = %f\n", impmtx[i1][j1] ); + return( impmtx[i1][j1] ); +} + +typedef struct _gaplenvec +{ + int relend; +#if USEGAPLENHALFORMTX + int idatend; +#endif + int idatnext; + int idatprev; + int npat; + int len; // sukoshi muda. + double freq; +} Gaplen; + +#if 0 +static void imp_match_out_vead_gapmap( double *imp, int i1, int lgth2, int *gapmap2 ) +{ +#if FASTMATCHCALC + double *pt = impmtx[i1]; + int *gapmappt = gapmap2; + while( lgth2-- ) + *imp++ += pt[*gapmappt++]; +#else + int j; + double *pt = impmtx[i1]; + for( j=0; j ", match[k], mid ); + match[k] -= matrices[mid][c1][c2] * eff1[i] * eff2[j]; +// fprintf( stderr, "match[k] = %f (mid=%d)\n", match[k], mid ); + } + } +// fprintf( stderr, "done\n" ); + return; +} + +#if SLOW +static void match_calc_slow( int **which, double ***matrices, double *match, int n1, char **seq1, double *eff1, int n2, char **seq2, double *eff2, int i1, int lgth2, double **doublework, int **intwork, int initialize, int flip ) +{ +// osoi! + int i, j, k; + int c1, c2; + int mid; +// fprintf( stderr, "\nmatch_calc_dynamicmtx... %d", i1 ); +// fprintf( stderr, "\nseq1[0]=%s\n", seq1[0] ); +// fprintf( stderr, "\nseq2[0]=%s\n", seq2[0] ); +// for( i=0; i-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} + +static void match_calc( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ +#if FASTMATCHCALC +// fprintf( stderr, "\nmatch_calc... %d", i1 ); + int j, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *matchpt, *cpmxpdpt, **cpmxpdptpt; + int *cpmxpdnpt, **cpmxpdnptpt; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + if( initialize ) + { + int count = 0; + for( j=0; j-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} + +static void Atracking_localhom( double *impwmpt, double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + int **ijp, int icyc, int jcyc, + int *warpis, int *warpjs, int warpbase ) +{ + int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, limk; + double wm; + char *gaptable1, *gt1bk; + char *gaptable2, *gt2bk; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + gt1bk = AllocateCharVec( lgth1+lgth2+1 ); + gt2bk = AllocateCharVec( lgth1+lgth2+1 ); + +#if 0 + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin; + while( --l >= 0 ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + } + break; + } + else + { + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + } + if( iin == lgth1 || jin == lgth2 ) + ; + else + { + *impwmpt += (double)imp_match_out_scD( iin, jin ); + +// fprintf( stderr, "impwm = %f (iin=%d, jin=%d) seq1=%c, seq2=%c\n", *impwmpt, iin, jin, seq1[0][iin], seq2[0][jin] ); + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + } + + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin; + while( --l >= 0 ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + } + break; + } + else + { + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + } + + for( i=0; i= first ) + { + if( *s-- != '-' ) return( v ); + v++; + } + if( s == first-1 ) return( v ); + return( -1 ); +} + +static void fillgaplen( Gaplen **mtx, int l ) +{ + int i, j, n, k, len, pos, idatnext; + double freq; + for( i=0; i<=l; i++ ) + { +// reporterr( "i=%d\n", i ); + if( mtx[i] == NULL ) continue; + for( n=0; (len=mtx[i][n].len)!=-1; n++ ) + { + freq = mtx[i][n].freq; + idatnext = n; + for( j=0; j 0 ) + { + if( known[gl] ) + { + ; + } + else + { + nknown++; + } + } + } + val += nknown; + } + free( known ); + + return( val ); +} + + +static void gaplencount( int n, int l, Gaplen **mtx, char **seq, double *eff ) +{ + int i, j, k, gl, *known, nknown; + known = calloc( l+1, sizeof( int ) ); +// for( i=0; i 0 ) + { + if( known[gl] ) + { +// reporterr( "gl=%d, Known!\n", gl ); + for( k=0; mtx[j][k].len!=-1; k++ ) if( mtx[j][k].len == gl ) break; + if( mtx[j][k].len == -1 ) + { + reporterr( "Unexpected error!\n" ); + exit( 1 ); + } + mtx[j][k].freq += eff[i]; + } + else + { +// reporterr( "gl=%d, First!\n", gl ); + mtx[j] = realloc( mtx[j], sizeof( Gaplen ) * (nknown+2) ); + mtx[j][nknown].len = gl; + mtx[j][nknown].relend = 0; + mtx[j][nknown].freq = eff[i]; + mtx[j][nknown].idatnext = -2; + mtx[j][nknown+1].len = -1; + mtx[j][nknown+1].idatnext = -1; + mtx[j][nknown+1].relend = -1; + mtx[j][nknown+1].freq = 0.0; + mtx[j][nknown+1].npat = -1; +#if USEGAPLENHALFORMTX + mtx[j][nknown].idatend = nknown; + mtx[j][nknown+1].idatend = -1; +#endif + known[gl]++; + nknown++; + mtx[j][0].npat = nknown; + } + } + } + } + fillgaplen( mtx, l ); +#if 0 + reporterr( "Gaplen:\n" ); + for( i=0; i<=l; i++ ) + { +// reporterr( "i=%d, gaplen[i] = %p\n", i, mtx[i] ); + if( mtx[i] ) + { + for( j=0; mtx[i][j].len!=-1; j++ ) + reporterr( "i=%d, len = %d, relend = %d, freq = %f\n", i, mtx[i][j].len, mtx[i][j].relend, mtx[i][j].freq ); + } + } + +#endif + + free( known ); +} + + +#if DEBUG +static void showgaplen( Gaplen **mtx, int seqlen ) +{ + int i, l; +#if USEGAPLENHALFORMTX + int id, pos; +#endif +// for( i=0; i<=seqlen; i++ ) + for( i=0; ; i++ ) + { +// reporterr( "chain[%d] = %d\n", i, chain[i] ); + if( mtx[i] == NULL ) continue; + if( mtx[i] == (Gaplen *)1 ) break; + for( l=0; mtx[i][l].idatnext!=-1; l++ ) + { +#if USEGAPLENHALFORMTX + reporterr( "i=%d, l=%d, len=%d, relend=%d, idatend=%d, idatnext=%d, idatprev=%d, freq=%f\n", i, l, mtx[i][l].len, mtx[i][l].relend, mtx[i][l].idatend, mtx[i][l].idatnext, mtx[i][l].idatprev, mtx[i][l].freq ); + pos = mtx[i][l].relend; + id = mtx[i][l].idatend; + if( mtx[i+pos] == NULL ) + { +// reporterr( "Error in SOURCE\n" ); + reporterr( ".len and .freq were lost when i=%d!\n", i ); +// exit( 1 ); + } +#else + reporterr( "i=%d, l=%d, len=%d, relend=%d, idatnext=%d, idatprev=%d, freq=%f\n", i, l, mtx[i][l].len, mtx[i][l].relend, mtx[i][l].idatnext, mtx[i][l].idatprev, mtx[i][l].freq ); +#endif + } + } +} +#endif + +#if WMCHECK +static int pairgapcount( char *s1, char *s2 ) +{ + char **tmpseq; + int i, len, st, k; + int v = 0; + + len = strlen( s1 ); + tmpseq = calloc( sizeof( char * ), 2 ); + tmpseq[0] = malloc( sizeof( char ) * ( len + 1 ) ); + tmpseq[1] = malloc( sizeof( char ) * ( len + 1 ) ); + + strcpy( tmpseq[0], s1 ); + strcpy( tmpseq[1], s2 ); + + commongappick( 2, tmpseq ); + len = strlen( tmpseq[0] ); + + + for( k=0; k<2; k++ ) + { + st = 0; + for( i=0; iidatnext!=-1; k++ ) + { + pos1 = g1->relend; + if( pos1 != 0 ) + { + pfac2 = 0.0; + if( gaplen2j ) for( l=0; (g2=gaplen2j+l)->idatnext!=-1; l++ ) + { + pos2 = g2->relend; + if( pos2 == 0 && g2->len >g1->len - (pos1) + newgaplen ) + { + pfac2 += g2->freq; +// reporterr( "hit! pfac2=%f, .freq=%f\n", pfac2, gaplen2[j][l].freq ); + } +// else +// reporterr( "does not hit! pfac2=%f, gaplen1[i][k].len=%d, gaplen[i][k].relend=%d, newgaplen=%d\n", pfac2, gaplen1[i][k].len, gaplen1[i][k].relend, newgaplen ); + } + pfac += pfac2 * g1->freq; + pfac1 += g1->freq; + } + else if( pos1 == 0 ) + { + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (g2=gaplen2j+l)->idatnext!=-1; l++ ) + { + pos2 = g2->relend; + if( pos2 == 0 && g2->len == g1->len+newgaplen ) pfac2 -= g2->freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && g2->len - (pos2-1) > g1->len+newgaplen ) pfac2 -= g2->freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +// reporterr( "pfac2 in line 1056 = %f\n", pfac2 ); + pfac += pfac2 * g1->freq; + pfac10 += g1->freq; + } + } +#if DEBUG + reporterr( "pfac1 (step2) = %f\n", pfac1 ); + reporterr( "pfac10 (step2) = %f\n", pfac10 ); + reporterr( "pfac (step2) = %f\n", pfac ); +#endif + + pfac1 = 1.0 - pfac1 - pfac10; + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (g2=gaplen2j+l)->idatnext!=-1; l++ ) + { + pos2 = g2->relend; + if( pos2 == 0 && g2->len == newgaplen ) pfac2 -= g2->freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && g2->len - (pos2-1) > newgaplen ) pfac2 -= g2->freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +#if DEBUG + reporterr( "pfac1 (type3) = %f\n", pfac1 ); + reporterr( "pfac2 (type3) = %f\n", pfac2 ); + reporterr( "pfac (step3) = %f\n", pfac ); +#endif + pfac += pfac1 * pfac2; +#if DEBUG + reporterr( "incomplete pfac = %f, pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", pfac, seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + + + return( pfac ); + +#else + + double pfac, pfac1, pfac10, pfac2; + int k, l, pos1, pos2, id1, id2; + Gaplen *gaplen1i, *gaplen2j; + +#if 0 // .len no shouryaku ni taiou shiteinai + int gl; + if( disp ) + { + reporterr( "calcpfac_gap_noidatend, %c (%d) - %c (%d)\n", seq1[i], i, seq2[j], j ); + reporterr( "newgaplen = %d\n", newgaplen ); + reporterr( "In calcpfac_gap, gaplen1[%d(%c)] = \n", i, seq1[i] ); + for( k=0; gaplen1[i]&&(id1=gaplen1[i][k].idatend)!=-1; k++ ) + { + pos1 = gaplen1[i][k].relend; + reporterr( ".len=%d, .relend=%d, .freq=%f\n", gaplen1[i+pos1][id1].len, gaplen1[i][k].relend, gaplen1[i+pos1][id1].freq[0] ); + } + reporterr( "In calcpfac_gap, gaplen2[%d(%c)] = \n", j, seq2[j] ); + showgaplen( gaplen2, strlen(seq2) ); + for( k=0; gaplen2[j]&&(id2=gaplen2[j][k].idatend)!=-1; k++ ) + { + pos2 = gaplen2[j][k].relend; + reporterr( ".len=%d, .relend=%d, .freq=%f\n", gaplen2[j+pos2][id2].len, gaplen2[j][k].relend, gaplen2[j+pos2][id2].freq[0] ); + } + } +#endif + gaplen2j = gaplen2[j]; + gaplen1i = gaplen1[i]; + + pfac = 0.0; + pfac1 = 0.0; + pfac10 = 0.0; + if( gaplen1i ) for( k=0; (gaplen1i[k].idatnext)!=-1; k++ ) + { + pos1 = gaplen1i[k].relend; + if( pos1 != 0 ) + { + pfac2 = 0.0; + if( gaplen2j ) for( l=0; (gaplen2j[l].idatnext)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + if( pos2 == 0 && gaplen2j[l].len > gaplen1i[k].len - (pos1) + newgaplen ) + { + pfac2 += gaplen2j[l].freq; +// reporterr( "hit! pfac2=%f, .freq=%f\n", pfac2, gaplen2[j][l].freq ); + } +// else +// reporterr( "does not hit! pfac2=%f, gaplen1[i][k].len=%d, gaplen[i][k].relend=%d, newgaplen=%d\n", pfac2, gaplen1[i][k].len, gaplen1[i][k].relend, newgaplen ); + } + pfac += pfac2 * gaplen1i[k].freq; + pfac1 += gaplen1i[k].freq; + } + else if( pos1 == 0 ) + { + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (gaplen2j[l].idatnext)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + if( pos2 == 0 && gaplen2j[l].len == gaplen1i[k].len+newgaplen ) pfac2 -= gaplen2j[l].freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && gaplen2j[l].len - (pos2-1) > gaplen1i[k].len+newgaplen ) pfac2 -= gaplen2j[l].freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +// reporterr( "pfac2 in line 1056 = %f\n", pfac2 ); + pfac += pfac2 * gaplen1i[k].freq; + pfac10 += gaplen1i[k].freq; + } + } +#if DEBUG + reporterr( "pfac1 (step2) = %f\n", pfac1 ); + reporterr( "pfac10 (step2) = %f\n", pfac10 ); + reporterr( "pfac (step2) = %f\n", pfac ); +#endif + + pfac1 = 1.0 - pfac1 - pfac10; + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (gaplen2j[l].idatnext)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + if( pos2 == 0 && gaplen2j[l].len == newgaplen ) pfac2 -= gaplen2j[l].freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && gaplen2j[l].len - (pos2-1) > newgaplen ) pfac2 -= gaplen2j[l].freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +#if DEBUG + reporterr( "pfac1 (type3) = %f\n", pfac1 ); + reporterr( "pfac2 (type3) = %f\n", pfac2 ); + reporterr( "pfac (step3) = %f\n", pfac ); +#endif + pfac += pfac1 * pfac2; +#if DEBUG + reporterr( "incomplete pfac = %f, pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", pfac, seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + + + return( pfac ); + +#endif +} + +#if USEGAPLENHALFORMTX + +static double calcpfac_gap_incomplete( Gaplen **gaplen1, Gaplen **gaplen2, int newgaplen, int i, int j, char *seq1, char *seq2, int disp ) // seq1 to seq2 ha debug you +{ + double pfac, pfac1, pfac10, pfac2; + int k, l, pos1, pos2, id1, id2; + Gaplen *gapend1, *gapend2; + Gaplen *gaplen1i, *gaplen2j; + +#if 0 // .len no shouryaku ni taiou shiteinai + int gl; + if( disp ) + { + reporterr( "calcpfac_gap_incomplete, %c (%d) - %c (%d)\n", seq1[i], i, seq2[j], j ); + reporterr( "newgaplen = %d\n", newgaplen ); + reporterr( "In calcpfac_gap, gaplen1[%d(%c)] = \n", i, seq1[i] ); + for( k=0; gaplen1[i]&&(id1=gaplen1[i][k].idatend)!=-1; k++ ) + { + pos1 = gaplen1[i][k].relend; + reporterr( ".len=%d, .relend=%d, .freq=%f\n", gaplen1[i+pos1][id1].len, gaplen1[i][k].relend, gaplen1[i+pos1][id1].freq[0] ); + } + reporterr( "In calcpfac_gap, gaplen2[%d(%c)] = \n", j, seq2[j] ); + showgaplen( gaplen2, strlen(seq2) ); + for( k=0; gaplen2[j]&&(id2=gaplen2[j][k].idatend)!=-1; k++ ) + { + pos2 = gaplen2[j][k].relend; + reporterr( ".len=%d, .relend=%d, .freq=%f\n", gaplen2[j+pos2][id2].len, gaplen2[j][k].relend, gaplen2[j+pos2][id2].freq[0] ); + } + } +#endif + gaplen2j = gaplen2[j]; + gaplen1i = gaplen1[i]; + + pfac = 0.0; + pfac1 = 0.0; + pfac10 = 0.0; + if( gaplen1i ) for( k=0; (id1=gaplen1i[k].idatend)!=-1; k++ ) + { + pos1 = gaplen1i[k].relend; + gapend1 = gaplen1[i+pos1]+id1; + if( pos1 != 0 ) + { + pfac2 = 0.0; + if( gaplen2j ) for( l=0; (id2=gaplen2j[l].idatend)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + gapend2 = gaplen2[j+pos2]+id2; +// if( pos2 == 0 && gapend2->len + 1 > gapend1->len - (pos1-1) + newgaplen ) + if( pos2 == 0 && gapend2->len > gapend1->len - (pos1) + newgaplen ) + { + pfac2 += gapend2->freq; +// reporterr( "hit! pfac2=%f, .freq=%f\n", pfac2, gaplen2[j][l].freq ); + } +// else +// reporterr( "does not hit! pfac2=%f, gaplen1[i][k].len=%d, gaplen[i][k].relend=%d, newgaplen=%d\n", pfac2, gaplen1[i][k].len, gaplen1[i][k].relend, newgaplen ); + } + pfac += pfac2 * gapend1->freq; + pfac1 += gapend1->freq; + } + else if( pos1 == 0 ) + { + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (id2=gaplen2j[l].idatend)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + gapend2 = gaplen2[j+pos2]+id2; + if( pos2 == 0 && gapend2->len == gapend1->len+newgaplen ) pfac2 -= gapend2->freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && gapend2->len - (pos2-1) > gapend1->len+newgaplen ) pfac2 -= gapend2->freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +// reporterr( "pfac2 in line 1056 = %f\n", pfac2 ); + pfac += pfac2 * gapend1->freq; + pfac10 += gapend1->freq; + } + } +#if DEBUG + reporterr( "pfac1 (step2) = %f\n", pfac1 ); + reporterr( "pfac10 (step2) = %f\n", pfac10 ); + reporterr( "pfac (step2) = %f\n", pfac ); +#endif + + pfac1 = 1.0 - pfac1 - pfac10; + pfac2 = 1.0; + if( gaplen2j ) for( l=0; (id2=gaplen2j[l].idatend)!=-1; l++ ) + { + pos2 = gaplen2j[l].relend; + gapend2 = gaplen2[j+pos2]+id2; + if( pos2 == 0 && gapend2->len == newgaplen ) pfac2 -= gapend2->freq;// kokode shuryou suru gap, gaplen1 ha kangaenai. + if( pos2 != 0 && gapend2->len - (pos2-1) > newgaplen ) pfac2 -= gapend2->freq;// keizoku suru gap, gaplen1 ha kangaenai. + } +#if DEBUG + reporterr( "pfac1 (type3) = %f\n", pfac1 ); + reporterr( "pfac2 (type3) = %f\n", pfac2 ); + reporterr( "pfac (step3) = %f\n", pfac ); +#endif + pfac += pfac1 * pfac2; +#if DEBUG + reporterr( "incomplete pfac = %f, pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", pfac, seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + + + return( pfac ); + +} + +static double calcpfac_gapex( Gaplen **gaplen1, Gaplen **gaplen2, int i, int j, int newgaplen, char *seq1, char *seq2, int disp ) +{ + double pfac, pfac1, pfac2, pfac10; + int k, l, id1, id2, pos1, pos2; + Gaplen *gapend1, *gapend2; + Gaplen *gaplen1i, *gaplen2j; + + gaplen1i = gaplen1[i]; + gaplen2j = gaplen2[j]; + + pfac = 0.0; + pfac2 = 0.0; +// for( k=0; gaplen2[j]&&(gl=gaplen2[j][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen2j ) for( k=0; (id2=gaplen2j[k].idatend)!=-1; k++ ) // ososugi! hash ni atode henkou + { +#if DEBUG + int gl; + pos2 = gaplen2j[k].relend; + id2 = gaplen2j[k].idatend; + gl = gaplen2[j+pos2][id2].len; + if( disp ) reporterr( "gaplen2[][].len=%d, .relend=%d, .freq=%f\n", gaplen2[j+pos2][id2].len, gaplen2[j][k].relend, gaplen2[j+pos2][id2].freq ); + if( disp ) reporterr( "gl = %d, newgaplen=%d\n", gl, newgaplen ); +#endif + if( (pos2=gaplen2[j][k].relend) != 0 ) continue; + + gapend2 = gaplen2[j+pos2]+id2; + pfac1 = 1.0; + pfac10 = 1.0; + if( gaplen1i ) for( l=0; (id1=gaplen1i[l].idatend)!=-1; l++ ) // ososugi! hash ni atode henkou + { + pos1 = gaplen1i[l].relend; + gapend1 = gaplen1[i+pos1]+id1; + pfac10 -= gapend1->freq; +#if DEBUG + if( disp ) reporterr( "gaplen1[][].len=%d, .relend=%d, .freq=%f\n", gaplen1[i+pos1][id1].len, gaplen1[i][l].relend, gaplen1[i+pos1][id1].freq ); +#endif + if( newgaplen + gapend1->len - (pos1) > gapend2->len - (pos2) ) pfac1 -= gapend1->freq; +// reporterr( "pfac1 = %f\n", pfac1 ); + } + pfac += pfac1 * gapend2->freq; + + +/* ???? */ + if( newgaplen >= gapend2->len - (pos2-1) ) // >= or >?? + { + pfac -= pfac10 * gapend2->freq; +// reporterr( "Hit! pfac1 = %f\n", pfac1 ); + } +/* ???? */ + + +// if( gaplen2[j][k].relend == -1 ) pfac += gaplen2[j][k].freq; + } + + return( pfac ); +} + +static double calcpfac( Gaplen **gaplen1, Gaplen **gaplen2, int i, int j, char *seq1, char *seq2, int disp ) // seq1 to seq2 ha debug you +{ + double pfac, pfac1, pfac2; + int k, l, pos1, pos2, id1, id2; + Gaplen *gapend1, *gapend2; + Gaplen *gaplen1i, *gaplen2j; + + gaplen1i = gaplen1[i]; + gaplen2j = gaplen2[j]; + +#if DEBUG + if( disp ) + { + reporterr( "seq1[0] = %s\n", seq1 ); + reporterr( "seq2[0] = %s\n", seq2 ); + reporterr( "i,j=%d,%d\n", i, j ); + + reporterr( "In calcpfac(), gaplen1[%d(%c)] = \n", i, seq1[i] ); +// showgaplen( gaplen1, seqlen( seq1 ) ); + for( k=0; gaplen1[i]&&(id1=gaplen1[i][k].idatend)!=-1; k++ ) + { + pos1 = gaplen1[i][k].relend; + reporterr( "pos1=%d, id1=%d\n", pos1, id1 ); + reporterr( ".len=%d, .relend=%d, .freq=%f\n", gaplen1[i+pos1][id1].len, gaplen1[i][k].relend, gaplen1[i+pos1][id1].freq ); + } + + reporterr( "In calcpfac(), gaplen2[%d(%c)] = \n", j, seq2[j] ); +// showgaplen( gaplen2, seqlen( seq2 ) ); + for( k=0; gaplen2[j]&&(id2=gaplen2[j][k].idatend)!=-1; k++ ) + { + pos2 = gaplen2[j][k].relend; + reporterr( "j=%d, k=%d, id2=%d, pos2=%d\n", j, k, id2, pos2 ); + reporterr( ".len=%d, .relend=%d\n", gaplen2[j+pos2][id2].len, gaplen2[j][k].relend ); + reporterr( ".freq=%f\n", gaplen2[j+pos2][id2].freq ); + } + } +#endif + + pfac1 = pfac2 = 0.0; + if( gaplen1i ) for( k=0; (id1=gaplen1i[k].idatend)!=-1; k++ ) + { + if( (pos1=gaplen1i[k].relend) == 0 ) pfac1 += gaplen1[i+pos1][id1].freq; + } + + if( gaplen2j ) for( l=0; (id2=gaplen2j[l].idatend)!=-1; l++ ) // ososugi! hash ni atode henkou + { + if( (pos2=gaplen2j[l].relend) == 0 ) pfac2 += gaplen2[j+pos2][id2].freq; + } +#if DEBUG + reporterr( "\n\nInitial pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + pfac = pfac1 * pfac2 + pfac1 * (1-pfac2) + pfac2 * (1-pfac1); +#if DEBUG + reporterr( "\n\nInitial pfac (%d,%d) = %f\n", i, j, pfac ); +#endif + +#if 1 +// if( pfac ) reporterr( "i,j=%d,%d, Cancel (eq len)? pfac = %f -> ", i, j, pfac ); + if( gaplen1i ) for( k=0; (id1=gaplen1i[k].idatend)!=-1; k++ ) // ososugi! hash ni atode henkou + { + pos1=gaplen1i[k].relend; + gapend1 = gaplen1[i+pos1]+id1; + if( gaplen2j ) for( l=0; (id2=gaplen2j[l].idatend)!=-1; l++ ) // ososugi! hash ni atode henkou + { + pos2 = gaplen2j[l].relend; + gapend2 = gaplen2[j+pos2]+id2; + if ( pos1 == 0 && pos2 == 0 && gapend1->len == gapend2->len ) pfac -= gapend1->freq * gapend2->freq; + else if( pos1 == 0 && pos2 != 0 && gapend2->len - (pos2-1) > gapend1->len ) pfac -= gapend1->freq * gapend2->freq; + else if( pos1 != 0 && pos2 == 0 && gapend1->len - (pos1-1) > gapend2->len ) pfac -= gapend1->freq * gapend2->freq; + } + } + +#if DEBUG + reporterr( "\n\nFinal pfac1,pfac2 (%c%d,%c%d, straight) = %f\n\n", seq1[i], i, seq2[j], j, pfac ); +#endif +#else +#endif + return( pfac ); +} +#endif + +static double calcpfac_gapex_noidatend( Gaplen **gaplen1, Gaplen **gaplen2, int i, int j, int newgaplen, char *seq1, char *seq2, int disp ) +{ +#if 1 + double pfac, pfac1, pfac2, pfac10; + int k, l, pos1, pos2; + Gaplen *gaplen1i, *gaplen2j, *g1, *g2; + + gaplen1i = gaplen1[i]; + gaplen2j = gaplen2[j]; + + pfac = 0.0; + pfac2 = 0.0; + if( gaplen2j ) for( k=0; (g2=gaplen2j+k)->idatnext!=-1; k++ ) + { +#if DEBUG + int gl; + pos2 = gaplen2j[k].relend; + gl = gaplen2j[k].len; + if( disp ) reporterr( "gaplen2[][].len=%d, .relend=%d, .freq=%f\n", gaplen2[j][k].len, gaplen2[j][k].relend, gaplen2[j][k].freq ); + if( disp ) reporterr( "gl = %d, newgaplen=%d\n", gl, newgaplen ); +#endif + if( (pos2=g2->relend) != 0 ) continue; + + pfac1 = 1.0; + pfac10 = 1.0; + if( gaplen1i ) for( l=0; (g1=gaplen1i+l)->idatnext!=-1; l++ ) + { + pos1 = g1->relend; + pfac10 -= g1->freq; +#if DEBUG + if( disp ) reporterr( "gaplen1[][].len=%d, .relend=%d, .freq=%f\n", gaplen1[i][l].len, gaplen1[i][l].relend, gaplen1[i][l].freq ); +#endif + if( newgaplen + g1->len - (pos1) > g2->len - (pos2) ) pfac1 -= g1->freq; +// reporterr( "pfac1 = %f\n", pfac1 ); + } + pfac += pfac1 * g2->freq; + + +/* ???? */ + if( newgaplen >= g2->len - (pos2-1) ) // >= or >?? + { + pfac -= pfac10 * g2->freq; +// reporterr( "Hit! pfac1 = %f\n", pfac1 ); + } +/* ???? */ + + +// if( gaplen2[j][k].relend == -1 ) pfac += gaplen2[j][k].freq; + } + + return( pfac ); +#else + double pfac, pfac1, pfac2, pfac10; + int k, l, id1, id2, pos1, pos2; + Gaplen *gaplen1i, *gaplen2j; + + gaplen1i = gaplen1[i]; + gaplen2j = gaplen2[j]; + + pfac = 0.0; + pfac2 = 0.0; +// for( k=0; gaplen2[j]&&(gl=gaplen2[j][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen2j ) for( k=0; (gaplen2j[k].idatnext)!=-1; k++ ) // ososugi! hash ni atode henkou + { +#if DEBUG + int gl; + pos2 = gaplen2j[k].relend; + gl = gaplen2j[k].len; + if( disp ) reporterr( "gaplen2[][].len=%d, .relend=%d, .freq=%f\n", gaplen2[j][k].len, gaplen2[j][k].relend, gaplen2[j][k].freq ); + if( disp ) reporterr( "gl = %d, newgaplen=%d\n", gl, newgaplen ); +#endif + if( (pos2=gaplen2[j][k].relend) != 0 ) continue; + + pfac1 = 1.0; + pfac10 = 1.0; + if( gaplen1i ) for( l=0; (gaplen1i[l].idatnext)!=-1; l++ ) // ososugi! hash ni atode henkou + { + pos1 = gaplen1i[l].relend; + pfac10 -= gaplen1i[l].freq; +#if DEBUG + if( disp ) reporterr( "gaplen1[][].len=%d, .relend=%d, .freq=%f\n", gaplen1[i][l].len, gaplen1[i][l].relend, gaplen1[i][l].freq ); +#endif + if( newgaplen + gaplen1i[l].len - (pos1) > gaplen2j[k].len - (pos2) ) pfac1 -= gaplen1i[l].freq; +// reporterr( "pfac1 = %f\n", pfac1 ); + } + pfac += pfac1 * gaplen2j[k].freq; + + +/* ???? */ + if( newgaplen >= gaplen2j[k].len - (pos2-1) ) // >= or >?? + { + pfac -= pfac10 * gaplen2j[k].freq; +// reporterr( "Hit! pfac1 = %f\n", pfac1 ); + } +/* ???? */ + + +// if( gaplen2[j][k].relend == -1 ) pfac += gaplen2[j][k].freq; + } + + return( pfac ); + +#endif +} + + +static double calcpfacnoidatend( Gaplen **gaplen1, Gaplen **gaplen2, int i, int j, char *seq1, char *seq2, int disp ) // seq1 to seq2 ha debug you +{ + double pfac, pfac1, pfac2; + int k, l, pos1, pos2; + Gaplen *gaplen1i, *gaplen2j, *g1, *g2; + + gaplen1i = gaplen1[i]; + gaplen2j = gaplen2[j]; + +#if DEBUG + if( disp ) + { + reporterr( "seq1[0] = %s\n", seq1 ); + reporterr( "seq2[0] = %s\n", seq2 ); + reporterr( "i,j=%d,%d\n", i, j ); + + reporterr( "In calcpfacnoidatend(), gaplen1[%d(%c)] = \n", i, seq1[i] ); + showgaplen( gaplen1, seqlen( seq1 ) ); + for( k=0; gaplen1[i]&&gaplen1[i][k].idatnext!=-1; k++ ) + { + pos1 = gaplen1[i][k].relend; + reporterr( ".len=%d, .relend=%d, .freq=%f (i=%d)\n", gaplen1[i][k].len, gaplen1[i][k].relend, gaplen1[i][k].freq, i ); + } + + reporterr( "In calcpfacnoidatend(), gaplen2[%d(%c)] = \n", j, seq2[j] ); + showgaplen( gaplen2, seqlen( seq2 ) ); + for( k=0; gaplen2[j]&&gaplen2[j][k].idatnext!=-1; k++ ) + { + pos2 = gaplen2[j][k].relend; + reporterr( ".len=%d, .relend=%d (j=%d)\n", gaplen2[j][k].len, gaplen2[j][k].relend, j ); + reporterr( ".freq=%f\n", gaplen2[j][k].freq ); + } + } +#endif + +#if 1 + pfac1 = pfac2 = 0.0; + if( gaplen1i ) for( k=0; (g1=gaplen1i+k)->idatnext!=-1; k++ ) + { + if( (pos1=g1->relend) == 0 ) pfac1 += g1->freq; + } + + if( gaplen2j ) for( l=0; (g2=gaplen2j+l)->idatnext!=-1; l++ ) // ososugi! hash ni atode henkou + { + if( (pos2=g2->relend) == 0 ) pfac2 += g2->freq; + } +#if DEBUG + reporterr( "\n\nInitial pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + pfac = pfac1 * pfac2 + pfac1 * (1-pfac2) + pfac2 * (1-pfac1); +#if DEBUG + reporterr( "\n\nInitial pfac (%d,%d) = %f\n", i, j, pfac ); +#endif + +// if( pfac ) reporterr( "i,j=%d,%d, Cancel (eq len)? pfac = %f -> ", i, j, pfac ); + if( gaplen1i ) for( k=0; (g1=gaplen1i+k)->idatnext!=-1; k++ ) // ososugi! hash ni atode henkou + { + pos1=g1->relend; + if( gaplen2j ) for( l=0; (g2=gaplen2j+l)->idatnext!=-1; l++ ) // ososugi! hash ni atode henkou + { + pos2 = gaplen2j[l].relend; + if ( pos1 == 0 && pos2 == 0 && g1->len == g2->len ) pfac -= g1->freq * g2->freq; + else if( pos1 == 0 && pos2 != 0 && g2->len - (pos2-1) > g1->len ) pfac -= g1->freq * g2->freq; + else if( pos1 != 0 && pos2 == 0 && g1->len - (pos1-1) > g2->len ) pfac -= g1->freq * g2->freq; + } + } + +#else + + pfac1 = pfac2 = 0.0; + if( gaplen1i ) for( k=0; (gaplen1i[k].idatnext)!=-1; k++ ) + { + if( gaplen1i[k].relend == 0 ) pfac1 += gaplen1[i][k].freq; + } + + if( gaplen2j ) for( l=0; (gaplen2j[l].idatnext)!=-1; l++ ) // ososugi! hash ni atode henkou + { + if( gaplen2j[l].relend == 0 ) pfac2 += gaplen2[j][l].freq; + } +#if DEBUG + reporterr( "\n\nInitial pfac1,pfac2 (%c%d,%c%d) = %f, %f\n", seq1[i], i, seq2[j], j, pfac1, pfac2 ); +#endif + pfac = pfac1 * pfac2 + pfac1 * (1-pfac2) + pfac2 * (1-pfac1); +#if DEBUG + reporterr( "\n\nInitial pfac (%d,%d) = %f\n", i, j, pfac ); +#endif + +#if 1 +// if( pfac ) reporterr( "i,j=%d,%d, Cancel (eq len)? pfac = %f -> ", i, j, pfac ); + if( gaplen1i ) for( k=0; (gaplen1i[k].idatnext)!=-1; k++ ) // ososugi! hash ni atode henkou + { + pos1=gaplen1i[k].relend; + if( gaplen2j ) for( l=0; (gaplen2j[l].idatnext)!=-1; l++ ) // ososugi! hash ni atode henkou + { + pos2 = gaplen2j[l].relend; + if ( pos1 == 0 && pos2 == 0 && gaplen1i[k].len == gaplen2j[l].len ) pfac -= gaplen1i[k].freq * gaplen2j[l].freq; + else if( pos1 == 0 && pos2 != 0 && gaplen2j[l].len - (pos2-1) > gaplen1i[k].len ) pfac -= gaplen1i[k].freq * gaplen2j[l].freq; + else if( pos1 != 0 && pos2 == 0 && gaplen1i[k].len - (pos1-1) > gaplen2j[l].len ) pfac -= gaplen1i[k].freq * gaplen2j[l].freq; + } + } +#endif +#endif + +#if DEBUG + reporterr( "\n\nFinal pfac1,pfac2 (%c%d,%c%d, straight) = %f\n\n", seq1[i], i, seq2[j], j, pfac ); +#endif + return( pfac ); +} + + +static void extendgaplencompactx( Gaplen **cpy, Gaplen **orig, int start ) +{ + Gaplen *opt, *cpt; + int l, id; +#if DEBUG + Gaplen cpybk; +#endif + +// if( start < 0 ) start = 0; + + if( orig[start] == NULL ) + { + if( cpy[start] ) + { + free( cpy[start] ); + cpy[start] = NULL; + } + return; + } + + +#if DEBUG + reporterr( "At first, cpy -> \n" ); + showgaplen( cpy, 100 ); + reporterr( "Look at %d \n", start ); +#endif + + if( cpy[start] == NULL ) + { + l = orig[start][0].npat; + + cpy[start] = realloc( cpy[start], (l+2) * sizeof( Gaplen ) ); + +#if 0 + for( l=0; (gl=orig[start][l].idatend)!=-1; l++ ) + cpy[start][l] = orig[start][l]; // freq ha pointer de copy + cpy[start][l] = orig[start][l]; // dekiru? +#else + for( opt = orig[start],cpt = cpy[start]; opt->idatnext!=-1; ) + *cpt++ = *opt++; + *cpt = *opt; +#endif + } + +#if DEBUG + cpybk = cpy[start][0]; +#endif + +#if 0 + for( l=0; (opt=orig[start]+l)->idatend!=-1; l++ ) + { + if( (pos=opt->relend) == 0 ) continue; + + if( cpy[posplus=start+pos] != NULL ) + { + id = opt->idatend; +// reporterr( "cpy[%d][%d].len: %d -> %d (relend=%d)\n", start, l, cpy[start][l].len, cpy[posplus][id].len, pos ); + cpy[start][l].len = cpy[posplus][id].len; // Ato de posplus wo tsukawanaiyouni henkou. + continue; // HITSUYOU!!! + } + else + { +// reporterr( "cpy[%d][%d].len: %d (relend=%d)\n", start, l, cpy[start][l].len, pos ); + } + +#if 0 + for( k=0; orig[start+pos][k].idatend!=-1; k++ ) + ; +#else + optplus = orig[posplus]; + k = optplus->npat; +#endif + + + cptplus = cpy[posplus] = realloc( cpy[posplus], (k+2) * sizeof( Gaplen ) ); +// cptplus = realloc( cptplus, (k+2) * sizeof( Gaplen ) ); + +#if 0 + for( k=0; optplus[k].idatend!=-1; k++ ) + { + cptplus[k] = optplus[k]; // dekiru? + } + cptplus[k] = optplus[k]; // dekiru? +#else + while( optplus->idatend!=-1 ) *cptplus++ = *optplus++; + *cptplus = *optplus; +#endif + } +#endif + + + if( start == 0 ) return; + if( cpy[start-1] == NULL ) return; + +#if DEBUG + reporterr( "cpy -> \n" ); + showgaplen( cpy, 100 ); + reporterr( "Look at %d \n", start ); +#endif + + for( l=0; orig[start][l].idatnext!=-1; l++ ) + { + if( (id=orig[start][l].idatprev) == -1 ) continue; + +// if( cpy[start][l].relend != 0 ) cpy[start][l].len = cpy[start-1][id].len; // Shinchou ni + cpy[start][l].len = cpy[start-1][id].len; // Shinchou ni + +// if( cpy[start][l].len != cpy[start-1][id].len ) +#if DEBUG + if( 1 || cpy[start][l].len != cpy[start-1][id].len ) + { + reporterr( "Check!! cpy[%d][%d].len=%d, but [start-1][].len=%d, relend=%d\n", start, l, cpy[start][l].len, cpy[start-1][id].len, cpy[start][l].relend ); + reporterr( "orig[%d][%d].len=%d, relend=%d\n", start, l, orig[start][l].len, orig[start][l].relend ); + reporterr( "cpybk.len=%d, relend=%d\n", cpybk.len, cpybk.relend ); + + } + else + { +// reporterr( "OK, cpy[%d][%d].len=%d, relend=%d\n", start, l, cpy[start][l].len, cpy[start][l].relend ); + } +#endif + } + +} + + +#if USEGAPLENHALFORMTX +static void extendgaplenpartly( Gaplen **cpy, Gaplen **orig, int start, int end ) +{ + int i, l, gl, extrascope; + Gaplen *pt; + + if( start < 0 ) start = 0; +// for( i=start; i<=end; i++ ) +// { +// if( cpy[i] == (Gaplen *)1 ) +// { +// end = i-1; +// break; +//// reporterr( "Okashii! i=%d\n", i ); +//// exit( 1 ); +// } +// if( cpy[i] ) free( cpy[i] ); +// cpy[i] = NULL; +// } + + + extrascope = 0; +#if 0 + for( i=start; i<=end; i++ ) if( orig[i] ) + { + for( pt=orig[i]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = i+gl-end+1; + } +// extrascope = 10; // Kinji + + } +#else + if( orig[end] ) + { + for( pt=orig[end]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = gl; + } +// extrascope = 10; // Kinji + + } +#endif + end += extrascope; + + for( i=start; i<=end; i++ ) + { + if( cpy[i] != NULL ) continue; + + if( orig[i] == NULL ) + { + if( cpy[i] ) free( cpy[i] ); // muda dakedo + cpy[i] = NULL; + continue; + } + + for( l=0; (gl=orig[i][l].idatend)!=-1; l++ ) + ; + + cpy[i] = realloc( cpy[i], (l+2) * sizeof( Gaplen ) ); +// cpy[i] = calloc( sizeof( Gaplen ), l+2 ); + + for( l=0; (gl=orig[i][l].idatend)!=-1; l++ ) + { +#if 1 + cpy[i][l] = orig[i][l]; // freq ha pointer de copy +#else + cpy[i][l].len = gl; + cpy[i][l].relend = orig[i][l].relend; + cpy[i][l].freq = orig[i][l].freq; + cpy[i][l].gapidatend = orig[i][l].gapidatend; +#endif + +// reporterr( "i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } + cpy[i][l] = orig[i][l]; // dekiru? +// cpy[i][l].relend = -1; +// cpy[i][l].len = -1; + } + +} +#endif + +static void duplicategaplencompactx( Gaplen **cpy, Gaplen **orig, int maxlen, int start, int end ) +{ + int i, l; + + + if( start < 0 ) start = 0; + for( i=start; i<=end; i++ ) + { +// reporterr( "i=%d / %d\n", i, maxlen ); + if( cpy[i] == (Gaplen *)1 ) + { + end = i-1; + break; +// reporterr( "Okashii! i=%d\n", i ); +// exit( 1 ); + } + if( cpy[i] ) free( cpy[i] ); + cpy[i] = NULL; + } + + for( i=start; i<=end; i++ ) + { + if( orig[i] == NULL ) + { + if( cpy[i] ) free( cpy[i] ); // muda dakedo + cpy[i] = NULL; + continue; + } + +#if 0 + for( l=0; (gl=orig[i][l].idatend)!=-1; l++ ) + ; +#else + l = orig[i][0].npat; +#endif + + cpy[i] = realloc( cpy[i], (l+2) * sizeof( Gaplen ) ); +// cpy[i] = calloc( sizeof( Gaplen ), l+2 ); + + for( l=0; orig[i][l].idatnext!=-1; l++ ) + { + cpy[i][l] = orig[i][l]; // freq ha pointer de copy +// reporterr( "i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } + cpy[i][l] = orig[i][l]; // dekiru? +// cpy[i][l].relend = -1; +// cpy[i][l].len = -1; + } + + return; +} + + + +#if USEGAPLENHALFORMTX +static void duplicategaplenpartly( Gaplen **cpy, Gaplen **orig, int start, int end ) +{ + int i, l, gl, extrascope; + Gaplen *pt; + + if( start < 0 ) start = 0; + for( i=start; i<=end; i++ ) + { + if( cpy[i] == (Gaplen *)1 ) + { + end = i-1; + break; +// reporterr( "Okashii! i=%d\n", i ); +// exit( 1 ); + } + if( cpy[i] ) free( cpy[i] ); + cpy[i] = NULL; + } + + + extrascope = 0; +#if 0 + for( i=start; i<=end; i++ ) if( orig[i] ) + { + for( pt=orig[i]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = i+gl-end+1; + } +// extrascope = 10; // Kinji + + } +#else + if( orig[end] ) + { + for( pt=orig[end]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = gl; + } +// extrascope = 10; // Kinji + + } +#endif + end += extrascope; + + for( i=start; i<=end; i++ ) + { + if( orig[i] == NULL ) + { + if( cpy[i] ) free( cpy[i] ); // muda dakedo + cpy[i] = NULL; + continue; + } + + for( l=0; (gl=orig[i][l].idatend)!=-1; l++ ) + ; + + cpy[i] = realloc( cpy[i], (l+2) * sizeof( Gaplen ) ); +// cpy[i] = calloc( sizeof( Gaplen ), l+2 ); + + for( l=0; (gl=orig[i][l].idatend)!=-1; l++ ) + { +#if 1 + cpy[i][l] = orig[i][l]; // freq ha pointer de copy +#else + cpy[i][l].len = gl; + cpy[i][l].relend = orig[i][l].relend; + cpy[i][l].freq = orig[i][l].freq; + cpy[i][l].gapidatend = orig[i][l].gapidatend; +#endif + +// reporterr( "i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } + cpy[i][l] = orig[i][l]; // dekiru? +// cpy[i][l].relend = -1; +// cpy[i][l].len = -1; + } + +} +#endif + + +static void gaplenextendnoidatend( Gaplen **cpy, int gapstartpos, int insertionlen ) +{ + int l, id, idn, pos, len; + +#if 0 +// reporterr( "inserting %d gaps at position %d\n", insertionlen, gapstartpos ); + for( l=0; cpy[gapstartpos] && (id=cpy[gapstartpos][l].idatend) !=-1; l++ ) + { + pos = cpy[gapstartpos][l].relend; + cpy[gapstartpos+pos][id].len += insertionlen; + } +#endif + +#if 1 + for( l=0; cpy[gapstartpos] && (id=cpy[gapstartpos][l].idatnext) !=-1; l++ ) + { + len = cpy[gapstartpos][l].len + insertionlen; +// reporterr( "ext\n" ); + for( pos=gapstartpos, idn=l; cpy[pos] != NULL && cpy[pos][idn].relend != 0; pos++ ) + { +// reporterr( "%d, plus %d %d->%d\n", pos, insertionlen, cpy[pos][idn].len, cpy[pos][idn].len+insertionlen ); + cpy[pos][idn].len = len; + idn = cpy[pos][idn].idatnext; +// if( pos == gapstartpos + 1 ) break; + break; + } +// reporterr( "end\n" ); + + idn = cpy[gapstartpos][l].idatprev; + if( gapstartpos != 0 && idn != -1 && cpy[gapstartpos-1] ) cpy[gapstartpos-1][idn].len = len; + } +#endif +} + + +#if USEGAPLENHALFORMTX + +static void gaplenextend( Gaplen **cpy, int gapstartpos, int insertionlen ) +{ + int l, id, idn, pos, len; + +#if 1 +// reporterr( "inserting %d gaps at position %d\n", insertionlen, gapstartpos ); + for( l=0; cpy[gapstartpos] && (id=cpy[gapstartpos][l].idatend) !=-1; l++ ) + { + pos = cpy[gapstartpos][l].relend; + cpy[gapstartpos+pos][id].len += insertionlen; + } +#endif + +#if 1 + for( l=0; cpy[gapstartpos] && (id=cpy[gapstartpos][l].idatend) !=-1; l++ ) + { + len = cpy[gapstartpos][l].len + insertionlen; +// reporterr( "ext\n" ); + for( pos=gapstartpos, idn=l; cpy[pos] != NULL && cpy[pos][idn].relend != 0; pos++ ) + { +// reporterr( "%d, plus %d %d->%d\n", pos, insertionlen, cpy[pos][idn].len, cpy[pos][idn].len+insertionlen ); + cpy[pos][idn].len = len; + idn = cpy[pos][idn].idatnext; +// if( pos == gapstartpos + 1 ) break; +// break; + } +// reporterr( "end\n" ); + + idn = cpy[gapstartpos][l].idatprev; + if( gapstartpos != 0 && idn != -1 && cpy[gapstartpos-1] ) cpy[gapstartpos-1][idn].len = len; + } +#endif +} +#endif + +static void copygaplencompactx( Gaplen **cpy, Gaplen **orig, int seqlen, int gapstartpos, int insertionlen, int posincopy, int posinori ) +{ + Gaplen *pt, *cpt; + + + +#if DEBUG + reporterr( "At the head of copygaplencompactx, cpy=\n" ); + showgaplen( cpy+posincopy, 100 ); + reporterr( "At the head of copygaplencompactx, orig=\n" ); + showgaplen( orig+posinori, 100 ); + reporterr( "posinori=%d\n", posinori ); +#endif + + if( orig[posinori] == NULL ) return; + +// for( pt=orig[posinori],cpt=cpy[posincopy]; pt->relend==0; ) // zenhan ni relend=0 ga matomatteirukara. + for( pt=orig[posinori],cpt=cpy[posincopy]; pt->idatnext!=-1; ) // kouhan mo copy + { + cpt++->len = pt++->len; + } + + +#if 0 + for( l=0; (id=orig[posinori][l].idatend)!=-1; l++ ) + { + pos = orig[posinori][l].relend; + if( pos == 0 ) continue; + if( orig[posinori+pos] == NULL ) + { + reporterr( "Okashii\n" ); + PFACERROR = 1; + continue; + } + +#if 0 + for( k=0; orig[posinori+pos][k].relend==0; k++ ) // zenhan dake + { + cpy[posincopy+pos][k].len = orig[posinori+pos][k].len; // dekiru? + } +#else + cpy[posincopy+pos][id].len = orig[posinori+pos][id].len; // dekiru? +#endif + } +#endif + + + if( gapstartpos == -1 ) gapstartpos = posincopy; + gaplenextendnoidatend( cpy, gapstartpos, insertionlen ); + +#if DEBUG + reporterr( "At the end of copygaplencompactx, cpy=\n" ); + showgaplen( cpy+posincopy, 100 ); +#endif +} + + +#if USEGAPLENHALF +static void copygaplenrestricted_zurasu( Gaplen **cpy, Gaplen **orig, int seqlen, int gapstartpos, int insertionlen, int startincopy, int endincopy, int startinori, int endinori ) +{ + int i, extrascope, gl, j; + int zure, newend; + Gaplen *pt, *cpt; +// int ncopied = 0; + +#if 0 +// mae houkou nimo renzoku gap de enchou suru hitsuyou ga aru to omou. + for( i=startinori-1; 0<=i&&i<=seqlen; i-- ) + { +// reporterr( "i=%d\n", i ); + if( orig[i] == NULL ) break; + for( pt=orig[i],cpt=cpy[i]; (gl=pt++->len)!=-1; ) cpt++->len = gl; + } +#endif + + zure = startincopy - startinori; // end ha check shinai + +// int ncopied = 0; + if( orig[endinori] ) + { + extrascope = 0; + for( pt=orig[endinori]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = gl; + } +// extrascope = 10; // Kinji + + newend = endinori + extrascope; + } + else newend = endinori; + +// reporterr( "ncopy = %d\n", newend - startinori ); +// +#if 0 // extra end wo shizen ni kimereba iranai + if( newend > seqlen ) newend = seqlen; +// if( startinori < 0 ) startinori = 0; +#endif + + for( i=startinori, j=startincopy; i<=newend; i++, j++ ) + { + if( orig[i] == NULL ) continue; + +// ncopied += 1; + +#if 0 + for( pt=orig[i],cpt=cpy[i]; (gl=pt++->len)!=-1; ) + cpt++->len = gl; +#else + for( pt=orig[i],cpt=cpy[j]; pt->relend==0; ) // zenhan ni relend=0 ga matomatteirukara. +// int k; +// for( k=0; orig[i][k].relend==0; k++ ) // zenhan ni relend=0 ga matomatteirukara. + { + cpt++->len = pt++->len; +// reporterr( "i=%d, k=%d\n", i, k ); +// cpy[i][k].len = orig[i][k].len; + } +#endif + } + + + +#if 0 + for( i=0; i<=seqlen; i++ ) + { + for( l=0; cpy[i]&&(gl=cpy[i][l].len)!=-1; l++ ) + reporterr( "after copy, i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } +#endif + + if( gapstartpos < 0 ) return; + + gaplenextend( cpy, gapstartpos, insertionlen ); + + + +// return; + + +// TEST +// for( i=endinori+1; i<=newend; i++ ) + for( i=endincopy+1; i<=newend+zure; i++ ) + { + if( cpy[i] == NULL ) continue; + for( j=0; cpy[i][j].idatend!=-1; j++ ) + { + if( cpy[i][j].relend == 0 ) + { + break; + } + } + if( cpy[i][j].idatend == -1 ) + { + free( cpy[i] ); + cpy[i] = NULL; + } + } + + + + + + +#if 0 + reporterr( "\n" ); + for( i=0; i<=seqlen; i++ ) + { + for( l=0; cpy[i]&&(gl=cpy[i][l].len)!=-1; l++ ) + reporterr( "after add, i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } +#endif +} +#endif + +#if USEGAPLENHALFORMTX +static void copygaplenrestricted( Gaplen **cpy, Gaplen **orig, int seqlen, int gapstartpos, int insertionlen, int scopestart, int scopeend ) +{ + int i, j, extrascope, gl, endinori, newend; + Gaplen *pt, *cpt; +// int ncopied = 0; + +#if 0 +// mae houkou nimo renzoku gap de enchou suru hitsuyou ga aru to omou. + for( i=scopestart-1; 0<=i&&i<=seqlen; i-- ) + { +// reporterr( "i=%d\n", i ); + if( orig[i] == NULL ) break; + for( pt=orig[i],cpt=cpy[i]; (gl=pt++->len)!=-1; ) cpt++->len = gl; + } +#endif + +// int ncopied = 0; + endinori = scopeend; + if( orig[scopeend] ) + { + extrascope = 0; + for( pt=orig[scopeend]; (pt->idatend)!=-1; ) + { + if( (gl=pt++->relend) > extrascope ) extrascope = gl; + } +// extrascope = 10; // Kinji + + scopeend += extrascope; + } + newend = scopeend; + +// reporterr( "ncopy = %d\n", scopeend - scopestart ); +// +#if 0 // extra end wo shizen ni kimereba iranai + if( scopeend > seqlen ) scopeend = seqlen; +// if( scopestart < 0 ) scopestart = 0; +#endif + + if( scopestart < 0 ) scopestart = 0; + for( i=scopestart; i<=scopeend; i++ ) + { + if( orig[i] == NULL ) continue; + +// ncopied += 1; + +#if 0 + for( pt=orig[i],cpt=cpy[i]; (gl=pt++->len)!=-1; ) + cpt++->len = gl; +#else + for( pt=orig[i],cpt=cpy[i]; pt->relend==0; ) // zenhan ni relend=0 ga matomatteirukara. +// int k; +// for( k=0; orig[i][k].relend==0; k++ ) // zenhan ni relend=0 ga matomatteirukara. + { + cpt++->len = pt++->len; +// reporterr( "i=%d, k=%d\n", i, k ); +// cpy[i][k].len = orig[i][k].len; + } +#endif + } + + + +#if 0 + for( i=0; i<=seqlen; i++ ) + { + for( l=0; cpy[i]&&(gl=cpy[i][l].len)!=-1; l++ ) + reporterr( "after copy, i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } +#endif + + if( gapstartpos < 0 ) return; + + gaplenextend( cpy, gapstartpos, insertionlen ); + + return; + +// TEST extra scope de tsukaunoha end dake? + for( i=endinori+1; i<=newend; i++ ) + { + if( cpy[i] == NULL ) continue; + for( j=0; cpy[i][j].idatend!=-1; j++ ) + { + if( cpy[i][j].relend == 0 ) break; + } + if( cpy[i][j].idatend == -1 ) + { + free( cpy[i] ); + cpy[i] = NULL; + } + } + + + +#if 0 + reporterr( "\n" ); + for( i=0; i<=seqlen; i++ ) + { + for( l=0; cpy[i]&&(gl=cpy[i][l].len)!=-1; l++ ) + reporterr( "after add, i=%d, l=%d, len=%d, freq=%f, relend=%d\n", i, l, cpy[i][l].len, cpy[i][l].freq, cpy[i][l].relend ); + } +#endif +} +#endif + +#if 1 +static void freegaplenpartly( Gaplen **mtx, int startpos, int endpos ) +{ + int i; + Gaplen **pt; + if( startpos < 0 ) startpos = 0; + + for( i=startpos; i<=endpos; i++ ) + { + if( *(pt=mtx+i) == (Gaplen *)1 ) break; + if( *pt ) free( *pt ); + *pt = NULL; + } +} +#else +static void freegaplenpartly( Gaplen **mtx, int startpos, int endpos ) +{ + int i; + if( startpos < 0 ) startpos = 0; + + for( i=startpos; i<=endpos; i++ ) + { + if( mtx[i] == (Gaplen *)1 ) break; + if( mtx[i] ) free( mtx[i] ); + mtx[i] = NULL; + } +} +#endif + + +double D__align( double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + +// int k; + register int i, j; + + + + + int lasti, lastj; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +// double fpenalty = (double)penalty; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; +#endif +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double **cpmx1; + static TLS double **cpmx2; + static TLS int **intwork; + static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; +#if USEGAPLENHALF + Gaplen ****gaplen1half = NULL; // NULL ga iru to omou. + Gaplen ****gaplen2half = NULL; // NULL ga iru to omou. +#endif +#if USEGAPLENMTX + Gaplen ****gaplen1mtx = NULL; // NULL ga iru to omou. + Gaplen ****gaplen2mtx = NULL; // NULL ga iru to omou. +#endif + static TLS Gaplen **gaplen1 = NULL; // NULL ga iru to omou. + static TLS Gaplen **gaplen2 = NULL; // NULL ga iru to omou. + static TLS Gaplen ***gaplen1jprev = NULL; + static TLS Gaplen ***gaplen2jprev = NULL; + static TLS Gaplen ***gaplen1jcurr = NULL; + static TLS Gaplen ***gaplen2jcurr = NULL; + static TLS Gaplen ***gaplen1icurr = NULL; + static TLS Gaplen ***gaplen2icurr = NULL; + static TLS Gaplen ***gaplen1jbestkamo = NULL; + static TLS Gaplen ***gaplen2jbestkamo = NULL; + static TLS Gaplen ***gaplen1ibestkamo = NULL; + static TLS Gaplen ***gaplen2ibestkamo = NULL; + static TLS Gaplen ***gaplen1jbest = NULL; + static TLS Gaplen ***gaplen2jbest = NULL; + double fpenalty = (double)penalty; + double fpenalty_shift = (double)penalty_shift; + static TLS Gaplen ****gaplens = NULL; + + Gaplen ***gaplentmp = NULL; + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + int k; + double pfac, pfactmp; + int newgaplen; + +// for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + + + free( gaplens ); + + if( gaplen1ibestkamo ) FreeGaplenCub( gaplen1ibestkamo ); gaplen1ibestkamo = NULL; + if( gaplen2ibestkamo ) FreeGaplenCub( gaplen2ibestkamo ); gaplen2ibestkamo = NULL; + if( gaplen1icurr ) FreeGaplenCub( gaplen1icurr ); gaplen1icurr = NULL; + if( gaplen2icurr ) FreeGaplenCub( gaplen2icurr ); gaplen2icurr = NULL; + + if( gaplen1jcurr ) FreeGaplenCub( gaplen1jcurr ); gaplen1jcurr = NULL; + if( gaplen1jprev ) FreeGaplenCub( gaplen1jprev ); gaplen1jprev = NULL; + if( gaplen2jcurr ) FreeGaplenCub( gaplen2jcurr ); gaplen2jcurr = NULL; + if( gaplen2jprev ) FreeGaplenCub( gaplen2jprev ); gaplen2jprev = NULL; + if( gaplen1jbestkamo ) FreeGaplenCub( gaplen1jbestkamo ); gaplen1jbestkamo = NULL; + if( gaplen2jbestkamo ) FreeGaplenCub( gaplen2jbestkamo ); gaplen2jbestkamo = NULL; + if( gaplen1jbest ) FreeGaplenCub( gaplen1jbest ); gaplen1jbest = NULL; + if( gaplen2jbest ) FreeGaplenCub( gaplen2jbest ); gaplen2jbest = NULL; + if( gaplen1 ) FreeGaplenMtx( gaplen1, 1 ); gaplen1 = NULL; + if( gaplen2 ) FreeGaplenMtx( gaplen2, 1 ); gaplen2 = NULL; + + + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + +#if FASTMATCHCALC + doublework = AllocateFloatMtx( MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntMtx( MAX( ll1, ll2 )+2, nalphabets+1 ); +#else + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); +#endif + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + + +// reporterr( "Allocating gaplen1 and gaplen2\n" ); + gaplen1 = (Gaplen ** )calloc( ll1+2, sizeof( Gaplen * ) ); + gaplen1[ll1+1] = (Gaplen *)1; + gaplen2 = (Gaplen ** )calloc( ll2+2, sizeof( Gaplen * ) ); + gaplen2[ll2+1] = (Gaplen *)1; + + +// reporterr( "Allocating gaplen*\n" ); + gaplen1ibestkamo = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen2ibestkamo = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen1icurr = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen2icurr = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen1jbestkamo = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jbestkamo = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jbest = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jbest = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jcurr = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jcurr = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jprev = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jprev = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + + gaplens = calloc( sizeof( Gaplen ***), 12 ); + gaplens[0] = gaplen1ibestkamo; + gaplens[1] = gaplen2ibestkamo; + gaplens[2] = gaplen1icurr; + gaplens[3] = gaplen2icurr; + gaplens[4] = gaplen1jbestkamo; + gaplens[5] = gaplen2jbestkamo; + gaplens[6] = gaplen1jbest; + gaplens[7] = gaplen2jbest; + gaplens[8] = gaplen1jcurr; + gaplens[9] = gaplen2jcurr; + gaplens[10] = gaplen1jprev; + gaplens[11] = gaplen2jprev; +// reporterr( "Allocation end\n" ); + } + + { + int ll1 = lgth1; + int ll2 = lgth2; + +// reporterr( "Allocating gaplen*i\n" ); + for(i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + +#if 0 + { + double t = 0.0; + for( i=0; i zurasu -> error? + + +// duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1, lgth1, 0, 1 ); +// duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1+i, lgth1-i, 0, 1 ); // half + duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1+i, lgth1-i, 0, 0 ); // half +// duplicategaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, lgth2 ); + duplicategaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, 0 ); +// copygaplenrestricted( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, 0 ); // -> zurasu -> error? +// copygaplenrestricted_zurasu( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, lgth2, 0, lgth2 ); // -> zurasu -> error? + copygaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, 0 ); // -> zurasu -> error? + } + +// reporterr( "Duplicating gaplen*j*curr \n" ); +// int nduplicated = 0; + for( j=0; j tbfast.c // impossible + if( localhom ) + imp_match_calc( n_dynamicmtx, currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + + for( j=1; j ", seq1[0][0], seq2[0][j], j, currentw[j] ); + currentw[j] += fpenalty * pfac; // tekitou +// reporterr( " %f\n", currentw[j] ); + } + for( i=1; ifull, 2j->half +#if USEGAPLENMTX +//reporterr( "#### FULL, i,j=%d,%d\n", i, j ); + pfactmp = calcpfac( gaplen1mtx[i-1][j-1], gaplen2mtx[i-1][j-1], i, j, seq1[0], seq2[0], one ); +#endif +#if USEGAPLENHALF +//reporterr( "#### HALF, i,j=%d/%d,%d/%d\n", i, lgth1, j, lgth2 ); +// showgaplen( gaplen2half[i-1][j-1], lgth2-j ); + pfactmp = calcpfac( gaplen1half[i-1][j-1], gaplen2half[i-1][j-1], 1, 1, seq1[0]+i, seq2[0]+j, zero ); +#endif +#if USEGAPLENMTX + USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(straight) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + exit( 1 ); + } +#endif +//if( i==50 && j==135 ) exit( 1 ); + + +// reporterr( "i,j=%d,%d, *prept = %f\n", i, j, *prept ); + +#if ALGZSTRAIGHT + wm = *prept; // Machigai!! +#else + wm = *prept + fpenalty * pfac; +#endif + *ijppt = 0; + + +#if DEBUG + if( i == j ) + { + fprintf( stderr, "\n i=%d, j=%d %c, %c ", i, j, seq1[0][i], seq2[0][j] ); + fprintf( stderr, "%5.0f, pfac for straight =%f\n", wm, pfac ); + } +#endif + newgaplen = j-mpi-1; + + +//if( i == 53 && j == 93 ) exit( 1 ); + + + + +// pfac = calcpfac_gap_incomplete( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], newgaplen, i, j, seq1[0], seq2[0], 0 ); // i-1 + pfac = calcpfac_gap_noidatend( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], newgaplen, 1, j, seq1[0]+i-1, seq2[0], 0 ); // i-1 +#if USEGAPLENMTX + pfactmp = calcpfac_gap_incomplete( gaplen1mtx[i-1][mpi], gaplen2mtx[i-1][mpi], newgaplen, i, j, seq1[0], seq2[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gap_incomplete( gaplen1half[i-1][mpi], gaplen2half[i-1][mpi], newgaplen, 1, j-mpi, seq1[0]+i-1, seq2[0]+mpi, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(igap) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + } +#endif + + +#if DEBUG + reporterr( "%c-%c pfac for igap end incomplete = %f\n", seq1[0][i], seq2[0][j], pfac ); + reporterr( "mi when igap end checking = %f\n", mi ); + reporterr( "wm = %f, mi+fpenalty*pfac=%f\n", wm, mi+fpenalty*pfac ); +#endif + + +#if ALGZGAP + if( (g=mi+*fgcp2pt*gf1va) > wm ) +#else + if( (g=mi+fpenalty*pfac) > wm ) +#endif + { + wm = g; + *ijppt = -( j - mpi ); +#if DEBUG80 + reporterr( "Selected as igap end! wm = %f, mi = %f\n", wm, mi ); + fprintf( stderr, "Jump from %d-%d (%c-%c) to %d (%c-%c)!\n", i, j, seq1[0][i], seq2[0][j], mpi, seq1[0][i-1], seq2[0][mpi] ); +#endif + } + + +#if 0 + fprintf( stderr, "%5.0f->", wm ); +#endif +// if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) + +#if 0 +// reporterr( "Checking %c, (current pos = %c)\n", seq2[0][j+1], seq2[0][j] ); + sfac = 1.0; + for( k=0; gaplen2[j+1]&&(gl=gaplen2[j+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + { +// reporterr( ".len = %d, .relend = %d\n", gaplen2[j+1][k].len, gaplen2[j+1][k].relend ); + if( gl - 1 == gaplen2[j+1][k].relend ) + { + sfac -= gaplen2[j+1][k].freq; +// reporterr( "Hit! sfac = %f\n", sfac ); + } + } + sfac2 = 1.0; + for( k=0; gaplen1[i+1]&&(gl=gaplen1[i+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen1[i+1][k].relend != -1 ) sfac2 -= gaplen1[i+1][k].freq; + sfac *= sfac2; +#else +// sfac = 0.0; +#endif + + + +#if ALGZGAP + if( (g=*prept+*ogcp2pt*gf1vapre) >= mi ) +#else +// if( (g=*prept + fpenalty * sfac ) >= mi ) + if( (g=*prept ) >= mi ) +#endif + { +// mpibk = mpi; +// mi = g - fpenalty * sfac; + mi = g; + mpi = j-1; +#if DEBUG80 + reporterr( "Selected as igap start! %c%d-%c%d, mi=%f, g=%f\n", seq1[0][i-1], i-1, seq2[0][mpi], mpi, mi, g ); +#endif + +#if FREEFREQUENTLY +// freegaplenpartly( gaplen1ibestkamo[i-1], 0, i-1 ); + freegaplenpartly( gaplen2ibestkamo[i-1], j-3, j-2 ); +#endif +// freegaplenpartly( gaplen1jprev[mpibk], 0, lgth2 ); // full +// freegaplenpartly( gaplen2jprev[mpibk], 0, lgth2-mpibk ); // half +// if( gaplen1jprev[mpibk] ) FreeGaplenMtx( gaplen1jprev[mpibk], 0 ); +// gaplen1jprev[mpibk] = NULL; +// if( gaplen2jprev[mpibk] ) FreeGaplenMtx( gaplen2jprev[mpibk], 0 ); +// gaplen2jprev[mpibk] = NULL; + + +// addnewgaplen( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); +// copygaplenrestricted( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); // i-1, i + copygaplencompactx( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], lgth1, -1, 0, 1, i ); // half +// copygaplenrestricted( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); // mpi, j + copygaplencompactx( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], lgth2, -1, 0, j, 1 ); //half + + + } + + + + + + +// reporterr( "g=%f, *prept=%f, mi=%f\n", g, *prept, mi ); + + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if ALGZGAP + pfac = 0.0; // CHUUI! +#else + +// pfac = calcpfac_gapex( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], i, j, j-mpi, seq1[0], seq2[0], 1 ); // i-1 + pfac = calcpfac_gapex_noidatend( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], 1, j, j-mpi, seq1[0]+i, seq2[0], 1 ); // 1ibest->half, 2ibest->full +#if USEGAPLENMTX + pfactmp = calcpfac_gapex( gaplen1mtx[i-1][mpi], gaplen2mtx[i-1][mpi], i, j, j-mpi, seq1[0], seq2[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gapex( gaplen1half[i-1][mpi], gaplen2half[i-1][mpi], 1, j-mpi, j-mpi, seq1[0]+i, seq2[0]+mpi, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(igapex) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + } +#endif + + + + + + + +#if DEBUG + reporterr( "%c-%c, igap extension check, pfac = %f\n\n", '=', seq2[0][j], pfac ); +#endif +#endif +// reporterr( "mi = %f -> ", mi ); + mi += fpenalty * pfac; +// reporterr( "mi = %f\n", mi ); + + +// reporterr( "using %d-%d, %d, %d\n", *mpjpt, j-1, i, j ); + newgaplen = i-*mpjpt-1; +// pfac = calcpfac_gap_incomplete( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], newgaplen, j, i, seq2[0], seq1[0], 0 ); // j-1 deha??? + + + pfac = calcpfac_gap_noidatend( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], newgaplen, 1, i, seq2[0]+j-1, seq1[0], 1 ); // 2jbestkamo->half, 1jbestkamo->full +#if USEGAPLENMTX + pfactmp = calcpfac_gap_incomplete( gaplen2mtx[*mpjpt][j-1], gaplen1mtx[*mpjpt][j-1], newgaplen, j, i, seq2[0], seq1[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gap_incomplete( gaplen2half[*mpjpt][j-1], gaplen1half[*mpjpt][j-1], newgaplen, 1, i-*mpjpt, seq2[0]+j-1, seq1[0]+*mpjpt, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(jgap) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); +// exit( 1 ); + PFACERROR = 1; + } +#endif + +#if ALGZGAP + if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) +#else + if( (g=*mjpt + fpenalty*pfac) > wm ) +#endif + { + wm = g; + *ijppt = +( i - *mpjpt ); + + +#if FREEFREQUENTLY + freegaplenpartly( gaplen1jbest[j-1], i-3, i-2 ); +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); +#endif + + +#if DEBUG + reporterr( "Selected as jgap end!, pfac = %f\n", pfac ); + fprintf( stderr, "Jump from %d (%c) to %d (%c)!\n", j, seq1[0][j], *mpjpt, seq1[0][*mpjpt] ); +#endif +// addnewgaplen( gaplen1jbest[j-1], gaplen1jbestkamo[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], gaplen2, lgth2, -1, 0 ); + copygaplencompactx( gaplen1jbest[j-1], gaplen1jbestkamo[j-1], lgth1, -1, 0, i, i );// *mpjpt, i +// copygaplenrestricted( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], lgth2, -1, 0, j, j ); // j-1, j + copygaplencompactx( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], lgth2, -1, 0, 1, 1 ); // half! + + + + + } + + +// extendgaplenpartly( gaplen1jbest[j-1], gaplen1, i, i ); // tmptmptmp +// extendgaplenpartly( gaplen2jbest[j-1], gaplen2, 0, 0 ); // tmptmptmp + +#if 0 + sfac = 1.0; + for( l=0; gaplen1[i+1]&&(gl=gaplen1[i+1][l].len)!=-1; l++ ) // ososugi! hash ni atode henkou + if( gl - 1 == gaplen1[i+1][l].relend ) sfac -= gaplen1[i+1][l].freq; + sfac2 = 1.0; + for( k=0; gaplen2[j+1]&&(gl=gaplen2[j+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen2[j+1][k].relend != -1 ) sfac2 -= gaplen2[j+1][k].freq; + sfac *= sfac2; +#else +// sfac = 0.0; +#endif + +#if DEBUG + reporterr( " (jgap start check i=%d) -> *prept=%f, *mjpt=%f\n", i, seq1[0][i], seq2[0][j], *prept, *mjpt ); +#endif + +#if ALGZGAP + if( (g=*prept+ ogcp1va* *gf2ptpre) >= *mjpt ) +#else +// if( (g=*prept + fpenalty * sfac ) >= *mjpt ) + if( (g=*prept ) >= *mjpt ) +#endif + { +// *mjpt = g - fpenalty * sfac; + *mjpt = g; + *mpjpt = i-1; +#if DEBUG + reporterr( "Selected as jgap start!\n" ); +#endif + + +#if FREEFREQUENTLY + freegaplenpartly( gaplen1jbestkamo[j-1], i-3, i-2 ); +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); +#endif + + +// addnewgaplen( gaplen1jbestkamo[j-1], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); +// reporterr( "copying gaplen1jbestkamo[%d-1] from galpen1jprev, j=%d, i=%d\n", j, j, i ); + copygaplencompactx( gaplen1jbestkamo[j-1], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); // *mpjpt, i +// copygaplenrestricted( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); // j-1, j +// copygaplencompactx( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2, -1, 0, j, 1 ); // half! +// reporterr( "copying gaplen2jbestkamo[%d-1] from galpen2jprev\n", j ); + copygaplencompactx( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2-j, -1, 0, 1, 1 ); // ryouhou half! + + +// if( j==2 && i==1 ) exit( 1 ); + + + + } + +// extendgaplenpartly( gaplen1ibestkamo[i-1], gaplen1, 0, 0 ); // tmptmptmp +// extendgaplenpartly( gaplen2ibestkamo[i-1], gaplen2, j, j ); // tmptmptmp + + +// extendgaplenpartly( gaplen1jbestkamo[j-1], gaplen1, i, i ); // tmptmptmp +// extendgaplenpartly( gaplen2jbestkamo[j-1], gaplen2, 0, 0 ); // tmptmptmp + + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if ALGZGAP + pfac = 0.0; +#else + +// pfactmp = calcpfac_gapex( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], j, i, i-*mpjpt, seq2[0], seq1[0], 0 ); // j-1 + pfactmp = calcpfac_gapex_noidatend( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], 1, i, i-*mpjpt, seq2[0]+j, seq1[0], 0 ); // 2jbestkamo->half, 1jbestkamo->full +#if USEGAPLENMTX + pfac = calcpfac_gapex( gaplen2mtx[*mpjpt][j-1], gaplen1mtx[*mpjpt][j-1], j, i, i-*mpjpt, seq2[0], seq1[0], 0 ); +#endif +#if USEGAPLENHALF + pfac = calcpfac_gapex( gaplen2half[*mpjpt][j-1], gaplen1half[*mpjpt][j-1], 1, i-*mpjpt, i-*mpjpt, seq2[0]+j, seq1[0]+*mpjpt, 0 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(jgapex) pfac=%f, but pfactmp=%f (i,j=%d,%d) diff=%f\n", pfac, pfactmp, i, j, pfac-pfactmp ); +// exit( 1 ); + PFACERROR = 1; + } +#endif + pfac = pfactmp; +#if DEBUG + reporterr( "%c-%c, jgap extension check (j=%d), pfac = %f\n", seq1[0][i], '=', j, pfac ); +#endif +#endif + m[j] += fpenalty * pfac; + + + + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { +// fprintf( stderr, "WARP!!\n" ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + curm = *curpt + wm; + + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + +#if DEBUG + reporterr( "extention-x 1j???, before extention-x, j=%d\n", j ); + showgaplen( gaplen1jcurr[j], 100 ); +#endif + extendgaplencompactx( gaplen1jcurr[j], gaplen1, i ); + +#if DEBUG + reporterr( "after extention-x\n" ); + showgaplen( gaplen1jcurr[j], 100 ); + reporterr( "extention-x 2j???\n" ); +#endif + extendgaplencompactx( gaplen2jcurr[j], gaplen2+j, 0 ); + + +#if 1 + if( *ijppt < 0 ) + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-1, j+*ijppt, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Inserting %d gaps to gaplen1 and copying gaplen2 (%c%d-%c%d)\n", -*ijppt-1, seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-1][j+*ijppt], gaplen1, lgth1, i, -*ijppt-1 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-1][j+*ijppt], gaplen2, lgth2, -1, 0 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-1][j+*ijppt], lgth1, i, -*ijppt-1, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-1][j+*ijppt], lgth2, -1, 0, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-1][j+*ijppt], lgth1, 0, -*ijppt-1, 0, 0, 1, 1 ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-1][j+*ijppt], lgth2, -1, 0, 0, 0, -*ijppt, -*ijppt ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jprev[j+*ijppt], gaplen1, lgth1, i, -*ijppt-1 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], gaplen2, lgth2, -1, 0 ); +// reporterr( "copying gaplen1jcurr from gaplen1jbest, with a %d insertion\n", -*ijppt-1 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jprev[j+*ijppt], lgth1, i, -*ijppt-1, i, i ); // scope: i+*ijppt+1, i ? +// reporterr( "copy end\n" ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], lgth2, -1, 0, j, j ); + copygaplencompactx( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], lgth2, -1, 0, 0, -*ijppt ); // half! ryouho zureteru + } + else if( *ijppt > 0 ) + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-*ijppt, j-1, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Copying gaplen1 inserting %d gaps to gaplen2 (%c%d-%c%d)\n", *ijppt-1, seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-*ijppt][j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-*ijppt][j-1], gaplen2, lgth2, j, *ijppt-1 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-*ijppt][j-1], lgth1, -1, 0, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-*ijppt][j-1], lgth2, j, *ijppt-1, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-*ijppt][j-1], lgth1, -1, 0, 0, 0, *ijppt, *ijppt ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-*ijppt][j-1], lgth2, 0, *ijppt-1, 0, 0, 1, 1 ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jbest[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jbest[j-1], gaplen2, lgth2, j, *ijppt-1 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jbest[j-1], lgth1, -1, 0, i, i ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, j, *ijppt-1, j, j ); // j-*ijppt+1? +// copygaplenrestricted_zurasu( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, 0, *ijppt-1, 0, 0, j, j ); // 2jcurr->half, but 2jbest->full, imanotokoro + copygaplencompactx( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, 0, *ijppt-1, 0, 1 ); //ryouhou half + + } + else +#endif + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-1, j-1, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Copying gaplen1 and gaplen2 (%c%d-%c%d)\n", seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-1][j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-1][j-1], gaplen2, lgth2, -1, 0 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-1][j-1], lgth1, -1, 0, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-1][j-1], lgth2, -1, 0, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-1][j-1], lgth1, -1, 0, 0, 0, 1, 1 ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-1][j-1], lgth2, -1, 0, 0, 0, 1, 1 ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); + copygaplencompactx( gaplen2jcurr[j], gaplen2jprev[j-1], lgth2, -1, 0, 0, 1 ); // half + } + +#if DEBUG + reporterr( "at the end of j loop, gaplen1jcurr[%d] = \n", j ); + showgaplen( gaplen1jcurr[j], 100 ); + reporterr( "at the end of j loop, gaplen1prev[%d] = \n", j ); + showgaplen( gaplen1jprev[j], 100 ); +#endif + + + +#if 1 + freegaplenpartly( gaplen1jcurr[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // half! + freegaplenpartly( gaplen1jbestkamo[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jbest[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); // -1 dehanaku -2?? +#else + freegaplenpartly( gaplen1jprev[j-1], 0, i-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jcurr[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // half! + freegaplenpartly( gaplen1jbestkamo[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jbest[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); // -1 dehanaku -2?? +#endif + + +#if USEGAPLENMTX +// freegaplenpartly( gaplen1mtx[i-1][j-1], 0, i-2 ); +// freegaplenpartly( gaplen2mtx[i-1][j-1], 0, j-2 ); +#endif + + + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + } + lastverticalw[i] = currentw[lgth2-1]; + +#if 1 +// freegaplenpartly( gaplen1icurr[i-1], i-1, i-1 ); + freegaplenpartly( gaplen1icurr[i-1], 0, lgth1-i ); + freegaplenpartly( gaplen2icurr[i-1], 0, lgth2 ); +// freegaplenpartly( gaplen1ibestkamo[i-1], i-1, i-1 ); + freegaplenpartly( gaplen1ibestkamo[i-1], 0, lgth1-i ); + freegaplenpartly( gaplen2ibestkamo[i-1], 0, lgth2 ); +#endif + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } +#if 0 + fprintf( stderr, "i=%d, %15.5f \n", i, wm ); +#endif +//if( i == 2 ) exit( 1 ); + } + + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + for( i=0; i %f\n", kenzan, (double)kenzan /( icyc*jcyc ) ); + + double pairscore, nogappairscore; + char **pseq; + pseq = AllocateCharMtx( 2, strlen( seq1[0] ) + 1 ); + pairscore = nogappairscore = 0.0; + for( i=0; i 0.01 ) || PFACERROR ) // abs() -> fabs(), 2019/Jan/25 +// if( abs( pairscore - wm +*impmatch ) > 0.01 ) +#else + if( abs( pairscore - wm +*impmatch ) > 0.01 ) +#endif +// if( abs( pairscore - wm +*impmatch ) > 0.01 ) + { + for( i=0; igroup1\n%s\n", seq1[i] ); + for( j=0; jgroup2\n%s\n", seq2[j] ); + exit( 1 ); + } +#else + reporterr( "\n" ); +#endif + +#if 0 +// if( strlen( seq1[0] ) - lgth1 > 100 && icyc > 1 || strlen( seq2[0] ) - lgth2 > 100 & jcyc > 1 ) + if( strstr( seq1[0], "LNDDAT" ) && icyc == 1 || strstr( seq2[0], "LNDDAT" ) && jcyc==1) + { + for( i=0; igroup1\n%s\n", seq1[i] ); + for( j=0; jgroup2\n%s\n", seq2[j] ); + exit( 1 ); + } +#endif + + + return( wm ); +} + + +double D__align_ls( double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ) +{ + int v1, v2; + double val; + +#if 1 + v1 = gapvariety( icyc, strlen( seq1[0] ), seq1 ); + v2 = gapvariety( jcyc, strlen( seq2[0] ), seq2 ); +#else + v1 = icyc; + v2 = jcyc; +#endif + +// reporterr( "\nicyc,jcyc = %d,%d\n", icyc, jcyc ); + reporterr( " v1,v2 = %d,%d\n", v1, v2 ); + + if( v1 >= v2 ) + { + val = D__align( n_dynamicmtx, seq1, seq2, eff1, eff2, icyc, jcyc, alloclen, constraint, impmatch, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + } + else + { + val = D__align( n_dynamicmtx, seq2, seq1, eff2, eff1, jcyc, icyc, alloclen, constraint, impmatch, sgap2, sgap1, egap2, egap1, chudanpt, chudanref, chudanres, headgp, tailgp ); + } + return val; +} + + + +double D__align_gapmap( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int *gapmap1, int *gapmap2 ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + fprintf( stderr, "Unexpected error. Please contact katoh@ifrec.osaka-u.ac.jp\n" ); + exit( 1 ); +} + + +double D__align_variousdist( int **which, double ***matrices, double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + +// int k; + register int i, j, c; + int lasti, lastj; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +// double fpenalty = (double)penalty; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; +#endif +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double ***cpmx1s; + static TLS double ***cpmx2s; + static TLS int ***intwork; + static TLS double ***doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; +#if USEGAPLENHALF + Gaplen ****gaplen1half = NULL; // NULL ga iru to omou. + Gaplen ****gaplen2half = NULL; // NULL ga iru to omou. +#endif +#if USEGAPLENMTX + Gaplen ****gaplen1mtx = NULL; // NULL ga iru to omou. + Gaplen ****gaplen2mtx = NULL; // NULL ga iru to omou. +#endif + static TLS Gaplen **gaplen1 = NULL; // NULL ga iru to omou. + static TLS Gaplen **gaplen2 = NULL; // NULL ga iru to omou. + static TLS Gaplen ***gaplen1jprev = NULL; + static TLS Gaplen ***gaplen2jprev = NULL; + static TLS Gaplen ***gaplen1jcurr = NULL; + static TLS Gaplen ***gaplen2jcurr = NULL; + static TLS Gaplen ***gaplen1icurr = NULL; + static TLS Gaplen ***gaplen2icurr = NULL; + static TLS Gaplen ***gaplen1jbestkamo = NULL; + static TLS Gaplen ***gaplen2jbestkamo = NULL; + static TLS Gaplen ***gaplen1ibestkamo = NULL; + static TLS Gaplen ***gaplen2ibestkamo = NULL; + static TLS Gaplen ***gaplen1jbest = NULL; + static TLS Gaplen ***gaplen2jbest = NULL; + double fpenalty = (double)penalty; + double fpenalty_shift = (double)penalty_shift; + static TLS Gaplen ****gaplens = NULL; + + Gaplen ***gaplentmp = NULL; + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + int k; + double pfac, pfactmp; + int newgaplen; + int **masklist1 = NULL, **masklist2 = NULL; + int *nmask; + +// for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatCub( cpmx1s ); + FreeFloatCub( cpmx2s ); + + FreeFloatCub( doublework ); + FreeIntCub( intwork ); + + + free( gaplens ); + + if( gaplen1ibestkamo ) FreeGaplenCub( gaplen1ibestkamo ); gaplen1ibestkamo = NULL; + if( gaplen2ibestkamo ) FreeGaplenCub( gaplen2ibestkamo ); gaplen2ibestkamo = NULL; + if( gaplen1icurr ) FreeGaplenCub( gaplen1icurr ); gaplen1icurr = NULL; + if( gaplen2icurr ) FreeGaplenCub( gaplen2icurr ); gaplen2icurr = NULL; + + if( gaplen1jcurr ) FreeGaplenCub( gaplen1jcurr ); gaplen1jcurr = NULL; + if( gaplen1jprev ) FreeGaplenCub( gaplen1jprev ); gaplen1jprev = NULL; + if( gaplen2jcurr ) FreeGaplenCub( gaplen2jcurr ); gaplen2jcurr = NULL; + if( gaplen2jprev ) FreeGaplenCub( gaplen2jprev ); gaplen2jprev = NULL; + if( gaplen1jbestkamo ) FreeGaplenCub( gaplen1jbestkamo ); gaplen1jbestkamo = NULL; + if( gaplen2jbestkamo ) FreeGaplenCub( gaplen2jbestkamo ); gaplen2jbestkamo = NULL; + if( gaplen1jbest ) FreeGaplenCub( gaplen1jbest ); gaplen1jbest = NULL; + if( gaplen2jbest ) FreeGaplenCub( gaplen2jbest ); gaplen2jbest = NULL; + if( gaplen1 ) FreeGaplenMtx( gaplen1, 1 ); gaplen1 = NULL; + if( gaplen2 ) FreeGaplenMtx( gaplen2, 1 ); gaplen2 = NULL; + + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + cpmx1s = AllocateFloatCub( maxdistclass, nalphabets, ll1+2 ); + cpmx2s = AllocateFloatCub( maxdistclass, nalphabets, ll2+2 ); + + doublework = AllocateFloatCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets+1 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + + +// reporterr( "Allocating gaplen1 and gaplen2\n" ); + gaplen1 = (Gaplen ** )calloc( ll1+2, sizeof( Gaplen * ) ); + gaplen1[ll1+1] = (Gaplen *)1; + gaplen2 = (Gaplen ** )calloc( ll2+2, sizeof( Gaplen * ) ); + gaplen2[ll2+1] = (Gaplen *)1; + + +// reporterr( "Allocating gaplen*\n" ); + gaplen1ibestkamo = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen2ibestkamo = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen1icurr = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen2icurr = (Gaplen ***)calloc( (ll1+2), sizeof( Gaplen **) ); + gaplen1jbestkamo = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jbestkamo = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jbest = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jbest = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jcurr = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jcurr = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen1jprev = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + gaplen2jprev = (Gaplen ***)calloc( (ll2+2), sizeof( Gaplen **) ); + + gaplens = calloc( sizeof( Gaplen ***), 12 ); + gaplens[0] = gaplen1ibestkamo; + gaplens[1] = gaplen2ibestkamo; + gaplens[2] = gaplen1icurr; + gaplens[3] = gaplen2icurr; + gaplens[4] = gaplen1jbestkamo; + gaplens[5] = gaplen2jbestkamo; + gaplens[6] = gaplen1jbest; + gaplens[7] = gaplen2jbest; + gaplens[8] = gaplen1jcurr; + gaplens[9] = gaplen2jcurr; + gaplens[10] = gaplen1jprev; + gaplens[11] = gaplen2jprev; +// reporterr( "Allocation end\n" ); + } + + { + int ll1 = lgth1; + int ll2 = lgth2; + +// reporterr( "Allocating gaplen*i\n" ); + for(i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + +#if 0 + { + double t = 0.0; + for( i=0; i zurasu -> error? + + +// duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1, lgth1, 0, 1 ); +// duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1+i, lgth1-i, 0, 1 ); // half + duplicategaplencompactx( gaplen1ibestkamo[i], gaplen1+i, lgth1-i, 0, 0 ); // half +// duplicategaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, lgth2 ); + duplicategaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, 0 ); +// copygaplenrestricted( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, 0 ); // -> zurasu -> error? +// copygaplenrestricted_zurasu( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, lgth2, 0, lgth2 ); // -> zurasu -> error? + copygaplencompactx( gaplen2ibestkamo[i], gaplen2, lgth2, 0, i, 0, 0 ); // -> zurasu -> error? + } + +// reporterr( "Duplicating gaplen*j*curr \n" ); +// int nduplicated = 0; + for( j=0; j tbfast.c // impossible + if( localhom ) + imp_match_calc( n_dynamicmtx, currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + + for( j=1; j ", seq1[0][0], seq2[0][j], j, currentw[j] ); + currentw[j] += fpenalty * pfac; // tekitou +// reporterr( " %f\n", currentw[j] ); + } + for( i=1; ifull, 2j->half +#if USEGAPLENMTX +//reporterr( "#### FULL, i,j=%d,%d\n", i, j ); + pfactmp = calcpfac( gaplen1mtx[i-1][j-1], gaplen2mtx[i-1][j-1], i, j, seq1[0], seq2[0], one ); +#endif +#if USEGAPLENHALF +//reporterr( "#### HALF, i,j=%d/%d,%d/%d\n", i, lgth1, j, lgth2 ); +// showgaplen( gaplen2half[i-1][j-1], lgth2-j ); + pfactmp = calcpfac( gaplen1half[i-1][j-1], gaplen2half[i-1][j-1], 1, 1, seq1[0]+i, seq2[0]+j, zero ); +#endif +#if USEGAPLENMTX + USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(straight) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + exit( 1 ); + } +#endif +//if( i==50 && j==135 ) exit( 1 ); + + +// reporterr( "i,j=%d,%d, *prept = %f\n", i, j, *prept ); + +#if ALGZSTRAIGHT + wm = *prept; // Machigai!! +#else + wm = *prept + fpenalty * pfac; +#endif + *ijppt = 0; + + +#if DEBUG + if( i == j ) + { + fprintf( stderr, "\n i=%d, j=%d %c, %c ", i, j, seq1[0][i], seq2[0][j] ); + fprintf( stderr, "%5.0f, pfac for straight =%f\n", wm, pfac ); + } +#endif + newgaplen = j-mpi-1; + + +//if( i == 53 && j == 93 ) exit( 1 ); + + + + +// pfac = calcpfac_gap_incomplete( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], newgaplen, i, j, seq1[0], seq2[0], 0 ); // i-1 + pfac = calcpfac_gap_noidatend( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], newgaplen, 1, j, seq1[0]+i-1, seq2[0], 0 ); // i-1 +#if USEGAPLENMTX + pfactmp = calcpfac_gap_incomplete( gaplen1mtx[i-1][mpi], gaplen2mtx[i-1][mpi], newgaplen, i, j, seq1[0], seq2[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gap_incomplete( gaplen1half[i-1][mpi], gaplen2half[i-1][mpi], newgaplen, 1, j-mpi, seq1[0]+i-1, seq2[0]+mpi, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(igap) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + } +#endif + + +#if DEBUG + reporterr( "%c-%c pfac for igap end incomplete = %f\n", seq1[0][i], seq2[0][j], pfac ); + reporterr( "mi when igap end checking = %f\n", mi ); + reporterr( "wm = %f, mi+fpenalty*pfac=%f\n", wm, mi+fpenalty*pfac ); +#endif + + +#if ALGZGAP + if( (g=mi+*fgcp2pt*gf1va) > wm ) +#else + if( (g=mi+fpenalty*pfac) > wm ) +#endif + { + wm = g; + *ijppt = -( j - mpi ); +#if DEBUG80 + reporterr( "Selected as igap end! wm = %f, mi = %f\n", wm, mi ); + fprintf( stderr, "Jump from %d-%d (%c-%c) to %d (%c-%c)!\n", i, j, seq1[0][i], seq2[0][j], mpi, seq1[0][i-1], seq2[0][mpi] ); +#endif + } + + +#if 0 + fprintf( stderr, "%5.0f->", wm ); +#endif +// if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) + +#if 0 +// reporterr( "Checking %c, (current pos = %c)\n", seq2[0][j+1], seq2[0][j] ); + sfac = 1.0; + for( k=0; gaplen2[j+1]&&(gl=gaplen2[j+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + { +// reporterr( ".len = %d, .relend = %d\n", gaplen2[j+1][k].len, gaplen2[j+1][k].relend ); + if( gl - 1 == gaplen2[j+1][k].relend ) + { + sfac -= gaplen2[j+1][k].freq; +// reporterr( "Hit! sfac = %f\n", sfac ); + } + } + sfac2 = 1.0; + for( k=0; gaplen1[i+1]&&(gl=gaplen1[i+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen1[i+1][k].relend != -1 ) sfac2 -= gaplen1[i+1][k].freq; + sfac *= sfac2; +#else +// sfac = 0.0; +#endif + + + +#if ALGZGAP + if( (g=*prept+*ogcp2pt*gf1vapre) >= mi ) +#else +// if( (g=*prept + fpenalty * sfac ) >= mi ) + if( (g=*prept ) >= mi ) +#endif + { +// mpibk = mpi; +// mi = g - fpenalty * sfac; + mi = g; + mpi = j-1; +#if DEBUG80 + reporterr( "Selected as igap start! %c%d-%c%d, mi=%f, g=%f\n", seq1[0][i-1], i-1, seq2[0][mpi], mpi, mi, g ); +#endif + +#if FREEFREQUENTLY +// freegaplenpartly( gaplen1ibestkamo[i-1], 0, i-1 ); + freegaplenpartly( gaplen2ibestkamo[i-1], j-3, j-2 ); +#endif +// freegaplenpartly( gaplen1jprev[mpibk], 0, lgth2 ); // full +// freegaplenpartly( gaplen2jprev[mpibk], 0, lgth2-mpibk ); // half +// if( gaplen1jprev[mpibk] ) FreeGaplenMtx( gaplen1jprev[mpibk], 0 ); +// gaplen1jprev[mpibk] = NULL; +// if( gaplen2jprev[mpibk] ) FreeGaplenMtx( gaplen2jprev[mpibk], 0 ); +// gaplen2jprev[mpibk] = NULL; + + +// addnewgaplen( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); +// copygaplenrestricted( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); // i-1, i + copygaplencompactx( gaplen1ibestkamo[i-1], gaplen1jprev[j-1], lgth1, -1, 0, 1, i ); // half +// copygaplenrestricted( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); // mpi, j + copygaplencompactx( gaplen2ibestkamo[i-1], gaplen2jprev[j-1], lgth2, -1, 0, j, 1 ); //half + + + } + + + + + + +// reporterr( "g=%f, *prept=%f, mi=%f\n", g, *prept, mi ); + + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if ALGZGAP + pfac = 0.0; // CHUUI! +#else + +// pfac = calcpfac_gapex( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], i, j, j-mpi, seq1[0], seq2[0], 1 ); // i-1 + pfac = calcpfac_gapex_noidatend( gaplen1ibestkamo[i-1], gaplen2ibestkamo[i-1], 1, j, j-mpi, seq1[0]+i, seq2[0], 1 ); // 1ibest->half, 2ibest->full +#if USEGAPLENMTX + pfactmp = calcpfac_gapex( gaplen1mtx[i-1][mpi], gaplen2mtx[i-1][mpi], i, j, j-mpi, seq1[0], seq2[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gapex( gaplen1half[i-1][mpi], gaplen2half[i-1][mpi], 1, j-mpi, j-mpi, seq1[0]+i, seq2[0]+mpi, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(igapex) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); + PFACERROR = 1; + } +#endif + + + + + + + +#if DEBUG + reporterr( "%c-%c, igap extension check, pfac = %f\n\n", '=', seq2[0][j], pfac ); +#endif +#endif +// reporterr( "mi = %f -> ", mi ); + mi += fpenalty * pfac; +// reporterr( "mi = %f\n", mi ); + + +// reporterr( "using %d-%d, %d, %d\n", *mpjpt, j-1, i, j ); + newgaplen = i-*mpjpt-1; +// pfac = calcpfac_gap_incomplete( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], newgaplen, j, i, seq2[0], seq1[0], 0 ); // j-1 deha??? + + + pfac = calcpfac_gap_noidatend( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], newgaplen, 1, i, seq2[0]+j-1, seq1[0], 1 ); // 2jbestkamo->half, 1jbestkamo->full +#if USEGAPLENMTX + pfactmp = calcpfac_gap_incomplete( gaplen2mtx[*mpjpt][j-1], gaplen1mtx[*mpjpt][j-1], newgaplen, j, i, seq2[0], seq1[0], 1 ); +#endif +#if USEGAPLENHALF + pfactmp = calcpfac_gap_incomplete( gaplen2half[*mpjpt][j-1], gaplen1half[*mpjpt][j-1], newgaplen, 1, i-*mpjpt, seq2[0]+j-1, seq1[0]+*mpjpt, 1 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(jgap) pfac=%f, but pfactmp=%f (i,j=%d,%d)\n", pfac, pfactmp, i, j ); +// exit( 1 ); + PFACERROR = 1; + } +#endif + +#if ALGZGAP + if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) +#else + if( (g=*mjpt + fpenalty*pfac) > wm ) +#endif + { + wm = g; + *ijppt = +( i - *mpjpt ); + + +#if FREEFREQUENTLY + freegaplenpartly( gaplen1jbest[j-1], i-3, i-2 ); +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); +#endif + + +#if DEBUG + reporterr( "Selected as jgap end!, pfac = %f\n", pfac ); + fprintf( stderr, "Jump from %d (%c) to %d (%c)!\n", j, seq1[0][j], *mpjpt, seq1[0][*mpjpt] ); +#endif +// addnewgaplen( gaplen1jbest[j-1], gaplen1jbestkamo[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], gaplen2, lgth2, -1, 0 ); + copygaplencompactx( gaplen1jbest[j-1], gaplen1jbestkamo[j-1], lgth1, -1, 0, i, i );// *mpjpt, i +// copygaplenrestricted( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], lgth2, -1, 0, j, j ); // j-1, j + copygaplencompactx( gaplen2jbest[j-1], gaplen2jbestkamo[j-1], lgth2, -1, 0, 1, 1 ); // half! + + + + + } + + +// extendgaplenpartly( gaplen1jbest[j-1], gaplen1, i, i ); // tmptmptmp +// extendgaplenpartly( gaplen2jbest[j-1], gaplen2, 0, 0 ); // tmptmptmp + +#if 0 + sfac = 1.0; + for( l=0; gaplen1[i+1]&&(gl=gaplen1[i+1][l].len)!=-1; l++ ) // ososugi! hash ni atode henkou + if( gl - 1 == gaplen1[i+1][l].relend ) sfac -= gaplen1[i+1][l].freq; + sfac2 = 1.0; + for( k=0; gaplen2[j+1]&&(gl=gaplen2[j+1][k].len)!=-1; k++ ) // ososugi! hash ni atode henkou + if( gaplen2[j+1][k].relend != -1 ) sfac2 -= gaplen2[j+1][k].freq; + sfac *= sfac2; +#else +// sfac = 0.0; +#endif + +#if DEBUG + reporterr( " (jgap start check i=%d) -> *prept=%f, *mjpt=%f\n", i, seq1[0][i], seq2[0][j], *prept, *mjpt ); +#endif + +#if ALGZGAP + if( (g=*prept+ ogcp1va* *gf2ptpre) >= *mjpt ) +#else +// if( (g=*prept + fpenalty * sfac ) >= *mjpt ) + if( (g=*prept ) >= *mjpt ) +#endif + { +// *mjpt = g - fpenalty * sfac; + *mjpt = g; + *mpjpt = i-1; +#if DEBUG + reporterr( "Selected as jgap start!\n" ); +#endif + + +#if FREEFREQUENTLY + freegaplenpartly( gaplen1jbestkamo[j-1], i-3, i-2 ); +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); +#endif + + +// addnewgaplen( gaplen1jbestkamo[j-1], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); +// reporterr( "copying gaplen1jbestkamo[%d-1] from galpen1jprev, j=%d, i=%d\n", j, j, i ); + copygaplencompactx( gaplen1jbestkamo[j-1], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); // *mpjpt, i +// copygaplenrestricted( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); // j-1, j +// copygaplencompactx( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2, -1, 0, j, 1 ); // half! +// reporterr( "copying gaplen2jbestkamo[%d-1] from galpen2jprev\n", j ); + copygaplencompactx( gaplen2jbestkamo[j-1], gaplen2jprev[j-1], lgth2-j, -1, 0, 1, 1 ); // ryouhou half! + + +// if( j==2 && i==1 ) exit( 1 ); + + + + } + +// extendgaplenpartly( gaplen1ibestkamo[i-1], gaplen1, 0, 0 ); // tmptmptmp +// extendgaplenpartly( gaplen2ibestkamo[i-1], gaplen2, j, j ); // tmptmptmp + + +// extendgaplenpartly( gaplen1jbestkamo[j-1], gaplen1, i, i ); // tmptmptmp +// extendgaplenpartly( gaplen2jbestkamo[j-1], gaplen2, 0, 0 ); // tmptmptmp + + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if ALGZGAP + pfac = 0.0; +#else + +// pfactmp = calcpfac_gapex( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], j, i, i-*mpjpt, seq2[0], seq1[0], 0 ); // j-1 + pfactmp = calcpfac_gapex_noidatend( gaplen2jbestkamo[j-1], gaplen1jbestkamo[j-1], 1, i, i-*mpjpt, seq2[0]+j, seq1[0], 0 ); // 2jbestkamo->half, 1jbestkamo->full +#if USEGAPLENMTX + pfac = calcpfac_gapex( gaplen2mtx[*mpjpt][j-1], gaplen1mtx[*mpjpt][j-1], j, i, i-*mpjpt, seq2[0], seq1[0], 0 ); +#endif +#if USEGAPLENHALF + pfac = calcpfac_gapex( gaplen2half[*mpjpt][j-1], gaplen1half[*mpjpt][j-1], 1, i-*mpjpt, i-*mpjpt, seq2[0]+j, seq1[0]+*mpjpt, 0 ); +#endif +#if USEGAPLENMTX || USEGAPLENHALF + if( pfac != pfactmp ) + { + reporterr( "(jgapex) pfac=%f, but pfactmp=%f (i,j=%d,%d) diff=%f\n", pfac, pfactmp, i, j, pfac-pfactmp ); +// exit( 1 ); + PFACERROR = 1; + } +#endif + pfac = pfactmp; +#if DEBUG + reporterr( "%c-%c, jgap extension check (j=%d), pfac = %f\n", seq1[0][i], '=', j, pfac ); +#endif +#endif + m[j] += fpenalty * pfac; + + + + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { +// fprintf( stderr, "WARP!!\n" ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + curm = *curpt + wm; + + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + +#if DEBUG + reporterr( "extention-x 1j???, before extention-x, j=%d\n", j ); + showgaplen( gaplen1jcurr[j], 100 ); +#endif + extendgaplencompactx( gaplen1jcurr[j], gaplen1, i ); + +#if DEBUG + reporterr( "after extention-x\n" ); + showgaplen( gaplen1jcurr[j], 100 ); + reporterr( "extention-x 2j???\n" ); +#endif + extendgaplencompactx( gaplen2jcurr[j], gaplen2+j, 0 ); + + +#if 1 + if( *ijppt < 0 ) + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-1, j+*ijppt, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Inserting %d gaps to gaplen1 and copying gaplen2 (%c%d-%c%d)\n", -*ijppt-1, seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-1][j+*ijppt], gaplen1, lgth1, i, -*ijppt-1 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-1][j+*ijppt], gaplen2, lgth2, -1, 0 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-1][j+*ijppt], lgth1, i, -*ijppt-1, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-1][j+*ijppt], lgth2, -1, 0, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-1][j+*ijppt], lgth1, 0, -*ijppt-1, 0, 0, 1, 1 ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-1][j+*ijppt], lgth2, -1, 0, 0, 0, -*ijppt, -*ijppt ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jprev[j+*ijppt], gaplen1, lgth1, i, -*ijppt-1 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], gaplen2, lgth2, -1, 0 ); +// reporterr( "copying gaplen1jcurr from gaplen1jbest, with a %d insertion\n", -*ijppt-1 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jprev[j+*ijppt], lgth1, i, -*ijppt-1, i, i ); // scope: i+*ijppt+1, i ? +// reporterr( "copy end\n" ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], lgth2, -1, 0, j, j ); + copygaplencompactx( gaplen2jcurr[j], gaplen2jprev[j+*ijppt], lgth2, -1, 0, 0, -*ijppt ); // half! ryouho zureteru + } + else if( *ijppt > 0 ) + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-*ijppt, j-1, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Copying gaplen1 inserting %d gaps to gaplen2 (%c%d-%c%d)\n", *ijppt-1, seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-*ijppt][j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-*ijppt][j-1], gaplen2, lgth2, j, *ijppt-1 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-*ijppt][j-1], lgth1, -1, 0, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-*ijppt][j-1], lgth2, j, *ijppt-1, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-*ijppt][j-1], lgth1, -1, 0, 0, 0, *ijppt, *ijppt ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-*ijppt][j-1], lgth2, 0, *ijppt-1, 0, 0, 1, 1 ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jbest[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jbest[j-1], gaplen2, lgth2, j, *ijppt-1 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jbest[j-1], lgth1, -1, 0, i, i ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, j, *ijppt-1, j, j ); // j-*ijppt+1? +// copygaplenrestricted_zurasu( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, 0, *ijppt-1, 0, 0, j, j ); // 2jcurr->half, but 2jbest->full, imanotokoro + copygaplencompactx( gaplen2jcurr[j], gaplen2jbest[j-1], lgth2, 0, *ijppt-1, 0, 1 ); //ryouhou half + + } + else +#endif + { +#if DEBUG + reporterr( "Path: %d-%d->%d-%d, i=%d (%c), j=%d (%c), *ijppt=%d\n", i, j, i-1, j-1, i, seq1[0][i], j, seq2[0][j], *ijppt ); + reporterr( "Copying gaplen1 and gaplen2 (%c%d-%c%d)\n", seq1[0][i], i, seq2[0][j], j ); +#endif +#if USEGAPLENMTX +// addnewgaplen( gaplen1mtx[i][j], gaplen1mtx[i-1][j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2mtx[i][j], gaplen2mtx[i-1][j-1], gaplen2, lgth2, -1, 0 ); + copygaplenrestricted( gaplen1mtx[i][j], gaplen1mtx[i-1][j-1], lgth1, -1, 0, i, i ); // 0, lgth1 + copygaplenrestricted( gaplen2mtx[i][j], gaplen2mtx[i-1][j-1], lgth2, -1, 0, j, j ); // 0, lgth2 +#endif +#if USEGAPLENHALF + copygaplenrestricted_zurasu( gaplen1half[i][j], gaplen1half[i-1][j-1], lgth1, -1, 0, 0, 0, 1, 1 ); // 0, lgth1 + copygaplenrestricted_zurasu( gaplen2half[i][j], gaplen2half[i-1][j-1], lgth2, -1, 0, 0, 0, 1, 1 ); // 0, lgth2 +#endif +// addnewgaplen( gaplen1jcurr[j], gaplen1jprev[j-1], gaplen1, lgth1, -1, 0 ); +// addnewgaplen( gaplen2jcurr[j], gaplen2jprev[j-1], gaplen2, lgth2, -1, 0 ); + copygaplencompactx( gaplen1jcurr[j], gaplen1jprev[j-1], lgth1, -1, 0, i, i ); +// copygaplenrestricted( gaplen2jcurr[j], gaplen2jprev[j-1], lgth2, -1, 0, j, j ); + copygaplencompactx( gaplen2jcurr[j], gaplen2jprev[j-1], lgth2, -1, 0, 0, 1 ); // half + } + +#if DEBUG + reporterr( "at the end of j loop, gaplen1jcurr[%d] = \n", j ); + showgaplen( gaplen1jcurr[j], 100 ); + reporterr( "at the end of j loop, gaplen1prev[%d] = \n", j ); + showgaplen( gaplen1jprev[j], 100 ); +#endif + + + +#if 1 + freegaplenpartly( gaplen1jcurr[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // half! + freegaplenpartly( gaplen1jbestkamo[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jbest[j-1], i-3, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); // -1 dehanaku -2?? +#else + freegaplenpartly( gaplen1jprev[j-1], 0, i-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jcurr[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jcurr[j-1], j-3, j-2 ); // half! + freegaplenpartly( gaplen1jbestkamo[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbestkamo[j-1], j-3, j-2 ); // -1 dehanaku -2?? + freegaplenpartly( gaplen1jbest[j-1], 0, i-2 ); // -1 dehanaku -2?? +// freegaplenpartly( gaplen2jbest[j-1], j-3, j-2 ); // -1 dehanaku -2?? +#endif + + +#if USEGAPLENMTX +// freegaplenpartly( gaplen1mtx[i-1][j-1], 0, i-2 ); +// freegaplenpartly( gaplen2mtx[i-1][j-1], 0, j-2 ); +#endif + + + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + } + lastverticalw[i] = currentw[lgth2-1]; + +#if 1 +// freegaplenpartly( gaplen1icurr[i-1], i-1, i-1 ); + freegaplenpartly( gaplen1icurr[i-1], 0, lgth1-i ); + freegaplenpartly( gaplen2icurr[i-1], 0, lgth2 ); +// freegaplenpartly( gaplen1ibestkamo[i-1], i-1, i-1 ); + freegaplenpartly( gaplen1ibestkamo[i-1], 0, lgth1-i ); + freegaplenpartly( gaplen2ibestkamo[i-1], 0, lgth2 ); +#endif + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } +#if 0 + fprintf( stderr, "i=%d, %15.5f \n", i, wm ); +#endif +//if( i == 2 ) exit( 1 ); + } + + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + for( i=0; i %f\n", kenzan, (double)kenzan /( icyc*jcyc ) ); + + double pairscore, nogappairscore, diff; + char **pseq; + pseq = AllocateCharMtx( 2, strlen( seq1[0] ) + 1 ); + pairscore = nogappairscore = 0.0; +#if 1 + for( i=0; i 0.01 ) || PFACERROR ) +// if( abs( pairscore - wm +*impmatch ) > 0.01 ) +#else + if( abs( pairscore - wm +*impmatch ) > 0.01 ) +#endif +// if( abs( pairscore - wm +*impmatch ) > 0.01 ) + { + for( i=0; igroup1\n%s\n", seq1[i] ); + for( j=0; jgroup2\n%s\n", seq2[j] ); + exit( 1 ); + } +#else + reporterr( "\n" ); +#endif + +#if 0 +// if( strlen( seq1[0] ) - lgth1 > 100 && icyc > 1 || strlen( seq2[0] ) - lgth2 > 100 & jcyc > 1 ) + if( strstr( seq1[0], "LNDDAT" ) && icyc == 1 || strstr( seq2[0], "LNDDAT" ) && jcyc==1) + { + for( i=0; igroup1\n%s\n", seq1[i] ); + for( j=0; jgroup2\n%s\n", seq2[j] ); + exit( 1 ); + } +#endif + + + return( wm ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/Falign.c b/mafft/src/mafft-7.487-with-extensions/core/Falign.c new file mode 100644 index 0000000000..1aa4147dd3 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/Falign.c @@ -0,0 +1,3611 @@ +#include "mltaln.h" + +#if 0 +static FILE *fftfp; +#endif +static TLS int n20or4or2; + +#define KEIKA 0 +#define RND 0 +#define DEBUG 0 + + +#if RND // by D.Mathog +static void generateRndSeq( char *seq, int len ) +{ + while( len-- ) +#if 1 + *seq++ = (int)( rnd() * n20or4or2 ); +#else + *seq++ = (int)1; +#endif +} +#endif + +static void vec_init( Fukusosuu *result, int nlen ) +{ + while( nlen-- ) + { + result->R = result->I = 0.0; + result++; + } +} + +#if 0 // by D.Mathog +static void vec_init2( Fukusosuu **result, char *seq, double eff, int st, int ed ) +{ + int i; + for( i=st; i= 0 ) result->R += incr * score[n]; +#if 0 + fprintf( stderr, "n=%d, score=%f, inc=%f R=%f\n",n, score[n], incr * score[n], result->R ); +#endif + } +} + +static void seq_vec_3( Fukusosuu **result, double incr, char *seq ) +{ + int i; + int n; + for( i=0; *seq; i++ ) + { + n = amino_n[(int)*seq++]; + if( n < n20or4or2 && n >= 0 ) result[n][i].R += incr; + } +} + +static void seq_vec_5( Fukusosuu *result, double *score1, double *score2, double incr, char *seq ) +{ + int n; + for( ; *seq; result++ ) + { + n = amino_n[(int)*seq++]; + if( n > 20 ) continue; + result->R += incr * score1[n]; + result->I += incr * score2[n]; +#if 0 + fprintf( stderr, "n=%d, score=%f, inc=%f R=%f\n",n, score[n], incr * score[n], result->R ); +#endif + } +} + + +static void seq_vec_4( Fukusosuu *result, double incr, char *seq ) +{ + char s; + for( ; *seq; result++ ) + { + s = *seq++; + if( s == 'a' ) + result->R += incr; + else if( s == 't' ) + result->R -= incr; + else if( s == 'g' ) + result->I += incr; + else if( s == 'c' ) + result->I -= incr; + } +} + +#if 0 // by D.Mathog +static void seq_vec( Fukusosuu *result, char query, double incr, char *seq ) +{ +#if 0 + int bk = nlen; +#endif + while( *seq ) + { + if( *seq++ == query ) result->R += incr; + result++; +#if 0 +fprintf( stderr, "i = %d result->R = %f\n", bk-nlen, (result-1)->R ); +#endif + } +} + +static int checkRepeat( int num, int *cutpos ) +{ + int tmp, buf; + + buf = *cutpos; + while( num-- ) + { + if( ( tmp = *cutpos++ ) < buf ) return( 1 ); + buf = tmp; + } + return( 0 ); +} + +static int segcmp( void *ptr1, void *ptr2 ) +{ + int diff; + Segment **seg1 = (Segment **)ptr1; + Segment **seg2 = (Segment **)ptr2; +#if 0 + return( (*seg1)->center - (*seg2)->center ); +#else + diff = (*seg1)->center - (*seg2)->center; + if( diff ) return( diff ); + + diff = (*seg1)->start - (*seg2)->start; + if( diff ) return( diff ); + + diff = (*seg1)->end - (*seg2)->end; + if( diff ) return( diff ); + + fprintf( stderr, "USE STABLE SORT !!\n" ); + exit( 1 ); + return( 0 ); +#endif +} +#endif + + +static void mymergesort( int first, int last, Segment **seg ) +{ + int middle; + static TLS int i, j, k, p; + static TLS int allo = 0; + static TLS Segment **work = NULL; + + if( seg == NULL ) + { + if( work ) free( work ); + work = NULL; + allo = 0; + return; + } + + if( last > allo ) + { + allo = last; + if( work ) free( work ); + work = (Segment **)calloc( allo / 2 + 1, sizeof( Segment *) ); + } + + if( first < last ) + { + middle = ( first + last ) / 2; + mymergesort( first, middle, seg ); + mymergesort( middle+1, last, seg ); + p = 0; + for( i=first; i<=middle; i++ ) work[p++] = seg[i]; + i = middle + 1; j = 0; k = first; + while( i <= last && j < p ) + { + if( work[j]->center <= seg[i]->center ) + seg[k++] = work[j++]; + else + seg[k++] = seg[i++]; + } + while( j < p ) seg[k++] = work[j++]; + } +} + + +double Fgetlag( + double **n_dynamicmtx, + char **seq1, char **seq2, + double *eff1, double *eff2, + int clus1, int clus2, + int alloclen ) +{ + int i, j, k, l, m; + int nlen, nlen2, nlen4; + static TLS int crossscoresize = 0; + static TLS char **tmpseq1 = NULL; + static TLS char **tmpseq2 = NULL; + static TLS char **tmpptr1 = NULL; + static TLS char **tmpptr2 = NULL; + static TLS char **tmpres1 = NULL; + static TLS char **tmpres2 = NULL; + static TLS char **result1 = NULL; + static TLS char **result2 = NULL; +#if RND + static TLS char **rndseq1 = NULL; + static TLS char **rndseq2 = NULL; +#endif + static TLS Fukusosuu **seqVector1 = NULL; + static TLS Fukusosuu **seqVector2 = NULL; + static TLS Fukusosuu **naiseki = NULL; + static TLS Fukusosuu *naisekiNoWa = NULL; + static TLS double *soukan = NULL; + static TLS double **crossscore = NULL; + int nlentmp; + static TLS int *kouho = NULL; + static TLS Segment *segment = NULL; + static TLS Segment *segment1 = NULL; + static TLS Segment *segment2 = NULL; + static TLS Segment **sortedseg1 = NULL; + static TLS Segment **sortedseg2 = NULL; + static TLS int *cut1 = NULL; + static TLS int *cut2 = NULL; + static TLS int localalloclen = 0; + int lag; + int tmpint; + int count, count0; + int len1, len2; + int totallen; + double dumdb = 0.0; + int headgp, tailgp; + + len1 = strlen( seq1[0] ); + len2 = strlen( seq2[0] ); + nlentmp = MAX( len1, len2 ); + + nlen = 1; + while( nlentmp >= nlen ) nlen <<= 1; +#if 0 + fprintf( stderr, "### nlen = %d\n", nlen ); +#endif + + nlen2 = nlen/2; nlen4 = nlen2 / 2; + +#if DEBUG + fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 ); + fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen ); +#endif + + if( !localalloclen ) + { + kouho = AllocateIntVec( NKOUHO ); + cut1 = AllocateIntVec( MAXSEG ); + cut2 = AllocateIntVec( MAXSEG ); + tmpptr1 = AllocateCharMtx( njob, 0 ); + tmpptr2 = AllocateCharMtx( njob, 0 ); + result1 = AllocateCharMtx( njob, alloclen ); + result2 = AllocateCharMtx( njob, alloclen ); + tmpres1 = AllocateCharMtx( njob, alloclen ); + tmpres2 = AllocateCharMtx( njob, alloclen ); +// crossscore = AllocateDoubleMtx( MAXSEG, MAXSEG ); + segment = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + segment1 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + segment2 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + sortedseg1 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + sortedseg2 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + if( !( segment && segment1 && segment2 && sortedseg1 && sortedseg2 ) ) + ErrorExit( "Allocation error\n" ); + + if ( scoremtx == -1 ) n20or4or2 = 4; + else if( fftscore == 1 ) n20or4or2 = 2; + else n20or4or2 = 20; + } + if( localalloclen < nlen ) + { + if( localalloclen ) + { +#if 1 + FreeFukusosuuMtx ( seqVector1 ); + FreeFukusosuuMtx ( seqVector2 ); + FreeFukusosuuVec( naisekiNoWa ); + FreeFukusosuuMtx( naiseki ); + FreeDoubleVec( soukan ); + FreeCharMtx( tmpseq1 ); + FreeCharMtx( tmpseq2 ); +#endif +#if RND + FreeCharMtx( rndseq1 ); + FreeCharMtx( rndseq2 ); +#endif + } + + + tmpseq1 = AllocateCharMtx( njob, nlen ); + tmpseq2 = AllocateCharMtx( njob, nlen ); + naisekiNoWa = AllocateFukusosuuVec( nlen ); + naiseki = AllocateFukusosuuMtx( n20or4or2, nlen ); + seqVector1 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 ); + seqVector2 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 ); + soukan = AllocateDoubleVec( nlen+1 ); + +#if RND + rndseq1 = AllocateCharMtx( njob, nlen ); + rndseq2 = AllocateCharMtx( njob, nlen ); + for( i=0; i /dev/tty" ); +#endif + + if( fftkeika ) fprintf( stderr, " FFT ... " ); + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( k=0; k /dev/tty " ); +#endif + + fft( -nlen, naisekiNoWa, 0 ); + + for( m=0; m<=nlen2; m++ ) + soukan[m] = naisekiNoWa[nlen2-m].R; + for( m=nlen2+1; m /dev/tty" ); +#if 0 +fftfp = fopen( "list.plot", "w" ); +fprintf( fftfp, "plot 'frt'\n pause +1" ); +fclose( fftfp ); +system( "/usr/bin/gnuplot list.plot" ); +#endif +#endif + + + getKouho( kouho, NKOUHO, soukan, nlen ); + +#if 0 + for( i=0; iCandidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr1[0] ); + fprintf( fftfp, ">Candidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr2[0] ); + fprintf( fftfp, ">\n", k+1, lag ); + fclose( fftfp ); +#endif + tmpint = alignableReagion( clus1, clus2, tmpptr1, tmpptr2, eff1, eff2, segment+count ); + + if( count+tmpint > MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); + + + if( tmpint == 0 ) break; // 060430 iinoka ? + while( tmpint-- > 0 ) + { + if( lag > 0 ) + { + segment1[count].start = segment[count].start ; + segment1[count].end = segment[count].end ; + segment1[count].center = segment[count].center; + segment1[count].score = segment[count].score; + + segment2[count].start = segment[count].start + lag; + segment2[count].end = segment[count].end + lag; + segment2[count].center = segment[count].center + lag; + segment2[count].score = segment[count].score ; + } + else + { + segment1[count].start = segment[count].start - lag; + segment1[count].end = segment[count].end - lag; + segment1[count].center = segment[count].center - lag; + segment1[count].score = segment[count].score ; + + segment2[count].start = segment[count].start ; + segment2[count].end = segment[count].end ; + segment2[count].center = segment[count].center; + segment2[count].score = segment[count].score ; + } +#if 0 + fprintf( stderr, "Goukaku=%dko\n", tmpint ); + fprintf( stderr, "in 1 %d\n", segment1[count].center ); + fprintf( stderr, "in 2 %d\n", segment2[count].center ); +#endif + segment1[count].pair = &segment2[count]; + segment2[count].pair = &segment1[count]; + count++; +#if 0 + fprintf( stderr, "count=%d\n", count ); +#endif + } + } + +#if 1 + fprintf( stderr, "done. (%d anchors)\r", count ); +#endif + if( !count && fftNoAnchStop ) + ErrorExit( "Cannot detect anchor!" ); +#if 0 + fprintf( stdout, "RESULT before sort:\n" ); + for( l=0; lnumber = i; + for( i=0; inumber = i; + + if( crossscoresize < count+2 ) + { + crossscoresize = count+2; + fprintf( stderr, "####################################################################################################################################allocating crossscore, size = %d\n", crossscoresize ); + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + + for( i=0; inumber+1] = segment1[i].score; + cut1[i+1] = sortedseg1[i]->center; + cut2[i+1] = sortedseg2[i]->center; + } + +#if DEBUG + fprintf( stderr, "AFTER SORT\n" ); + for( i=0; i count ) + { + fprintf( stderr, "REPEAT!? \n" ); + if( fftRepeatStop ) exit( 1 ); + } +#if KEIKA + else + fprintf( stderr, "done\n" ); + fprintf( stderr, "done. (%d anchors)\n", count ); +#endif + } + +#if 0 + fftfp = fopen( "fft", "a" ); + fprintf( fftfp, "RESULT after sort:\n" ); + for( l=0; l alloclen ) ErrorExit( "LENGTH OVER in Falign\n " ); + for( j=0; j= nlen ) nlen <<= 1; +#if 0 + fprintf( stderr, "### nlen = %d\n", nlen ); +#endif + + nlen2 = nlen/2; nlen4 = nlen2 / 2; + +#if DEBUG + fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 ); + fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen ); +#endif + + result1 = AllocateCharMtx( clus1, alloclen ); + result2 = AllocateCharMtx( clus2, alloclen ); + tmpres1 = AllocateCharMtx( clus1, alloclen ); + tmpres2 = AllocateCharMtx( clus2, alloclen ); + sgap1 = AllocateCharVec( clus1 ); + egap1 = AllocateCharVec( clus1 ); + sgap2 = AllocateCharVec( clus2 ); + egap2 = AllocateCharVec( clus2 ); + tmpptr1 = calloc( clus1, sizeof( char * ) ); + tmpptr2 = calloc( clus2, sizeof( char * ) ); + tmpseq1 = AllocateCharMtx( clus1, nlen ); + tmpseq2 = AllocateCharMtx( clus2, nlen ); +#if RND + rndseq1 = AllocateCharMtx( clus1, nlen ); + rndseq2 = AllocateCharMtx( clus2, nlen ); + for( i=0; i /dev/tty" ); +#endif + if( !kobetsubunkatsu ) + { + if( fftkeika ) fprintf( stderr, " FFT ... " ); + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( k=0; k /dev/tty " ); +#endif + + fft( -nlen, naisekiNoWa, 0 ); + + for( m=0; m<=nlen2; m++ ) + soukan[m] = naisekiNoWa[nlen2-m].R; + for( m=nlen2+1; mCandidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr1[0] ); + fprintf( fftfp, ">Candidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr2[0] ); + fprintf( fftfp, ">\n", k+1, lag ); + fclose( fftfp ); +#endif + +// fprintf( stderr, "lag = %d\n", lag ); + tmpint = alignableReagion( clus1, clus2, tmpptr1, tmpptr2, eff1, eff2, segment+count ); + +// if( lag == -50 ) exit( 1 ); + + if( count+tmpint > MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); + + + if( tmpint == 0 ) break; // 060430 iinoka ? + while( tmpint-- > 0 ) + { +#if 0 + if( segment[count].end - segment[count].start < fftWinSize ) + { + count++; + continue; + } +#endif + if( lag > 0 ) + { + segment1[count].start = segment[count].start ; + segment1[count].end = segment[count].end ; + segment1[count].center = segment[count].center; + segment1[count].score = segment[count].score; + + segment2[count].start = segment[count].start + lag; + segment2[count].end = segment[count].end + lag; + segment2[count].center = segment[count].center + lag; + segment2[count].score = segment[count].score ; + } + else + { + segment1[count].start = segment[count].start - lag; + segment1[count].end = segment[count].end - lag; + segment1[count].center = segment[count].center - lag; + segment1[count].score = segment[count].score ; + + segment2[count].start = segment[count].start ; + segment2[count].end = segment[count].end ; + segment2[count].center = segment[count].center; + segment2[count].score = segment[count].score ; + } +#if 0 + fprintf( stderr, "in 1 %d\n", segment1[count].center ); + fprintf( stderr, "in 2 %d\n", segment2[count].center ); +#endif + segment1[count].pair = &segment2[count]; + segment2[count].pair = &segment1[count]; + count++; + } + } +#if 0 + if( !kobetsubunkatsu && fftkeika ) + fprintf( stderr, "%d anchors found\r", count ); +#endif + if( !count && fftNoAnchStop ) + ErrorExit( "Cannot detect anchor!" ); +#if 0 + fprintf( stderr, "RESULT before sort:\n" ); + for( l=0; lnumber = i; + for( i=0; inumber = i; + + + if( kobetsubunkatsu ) + { + for( i=0; icenter; + cut2[i+1] = sortedseg2[i]->center; + } + cut1[0] = 0; + cut2[0] = 0; + cut1[count+1] = len1; + cut2[count+1] = len2; + count += 2; + } + else + { + if( crossscoresize < count+2 ) + { + crossscoresize = count+2; +#if 1 + if( fftkeika ) fprintf( stderr, "######allocating crossscore, size = %d\n", crossscoresize ); +#endif + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + for( i=0; inumber+1] = segment1[i].score; + cut1[i+1] = sortedseg1[i]->center; + cut2[i+1] = sortedseg2[i]->center; + } + +#if 0 + fprintf( stderr, "AFTER SORT\n" ); + for( i=0; i count ) + { +#if 0 + fprintf( stderr, "\7 REPEAT!? \n" ); +#else + fprintf( stderr, "REPEAT!? \n" ); +#endif + if( fftRepeatStop ) exit( 1 ); + } +#if KEIKA + else fprintf( stderr, "done\n" ); +#endif + } + } + +#if 0 + fftfp = fopen( "fft", "a" ); + fprintf( fftfp, "RESULT after sort:\n" ); + for( l=0; l%d of GROUP1\n", j ); + fprintf( stdout, "%s\n", tmpres1[j] ); + } + for( j=0; j%d of GROUP2\n", j ); + fprintf( stdout, "%s\n", tmpres2[j] ); + } + fflush( stdout ); +#endif + switch( alg ) + { + case( 'a' ): + totalscore += Aalign( tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen ); + break; + case( 'M' ): + if( scoringmatrices ) // called by tditeration.c + totalscore += MSalignmm_variousdist( NULL, scoringmatrices, NULL, tmpres1, tmpres2, eff1, eff2, eff1s, eff2s, clus1, clus2, alloclen, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + else + totalscore += MSalignmm( n_dynamicmtx, tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp, NULL, NULL, NULL, 0.0, 0.0 ); +// totalscore += MSalignmm( n_dis_consweight_multi, tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + break; + case( 'd' ): + if( clus1 == 1 && clus2 == 1 ) + { + totalscore += G__align11( n_dynamicmtx, tmpres1, tmpres2, alloclen, headgp, tailgp ); + } + else + { + if( scoringmatrices ) // called by tditeration.c + { + totalscore += D__align_variousdist( whichmtx, scoringmatrices, NULL, tmpres1, tmpres2, eff1, eff2, eff1s, eff2s, clus1, clus2, alloclen, 0, &dumdb, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + } + else + totalscore += D__align( n_dynamicmtx, tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, 0, &dumdb, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + } + break; + case( 'A' ): + if( clus1 == 1 && clus2 == 1 ) + { + totalscore += G__align11( n_dynamicmtx, tmpres1, tmpres2, alloclen, headgp, tailgp ); + } + else + { + if( scoringmatrices ) // called by tditeration.c + { + totalscore += A__align_variousdist( whichmtx, scoringmatrices, NULL, penalty, penalty_ex, tmpres1, tmpres2, eff1, eff2, eff1s, eff2s, clus1, clus2, alloclen, 0, &dumdb, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp ); + } + else + totalscore += A__align( n_dynamicmtx, penalty, penalty_ex, tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, 0, &dumdb, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres, headgp, tailgp, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + } + break; + default: + fprintf( stderr, "alg = %c\n", alg ); + ErrorExit( "ERROR IN SOURCE FILE Falign.c" ); + break; + } + +#ifdef enablemultithread + if( chudanres && *chudanres ) + { +// fprintf( stderr, "\n\n## CHUUDAN!!! at Falign_localhom\n" ); +// Added 2021/Jul/25. + FreeCharMtx( result1 ); + FreeCharMtx( result2 ); + FreeCharMtx( tmpres1 ); + FreeCharMtx( tmpres2 ); + FreeCharMtx( tmpseq1 ); + FreeCharMtx( tmpseq2 ); + free( sgap1 ); + free( egap1 ); + free( sgap2 ); + free( egap2 ); + free( tmpptr1 ); + free( tmpptr2 ); +#if RND + FreeCharMtx( rndseq1 ); + FreeCharMtx( rndseq2 ); +#endif + return( -1.0 ); + } +#endif + + nlen = strlen( tmpres1[0] ); + if( totallen + nlen > alloclen ) + { + fprintf( stderr, "totallen=%d + nlen=%d > alloclen = %d\n", totallen, nlen, alloclen ); + ErrorExit( "LENGTH OVER in Falign\n " ); + } + for( j=0; j= n / 2 ) break; + } + if( o >= n/2 ) c[(j-start)*d] = 'o'; + else c[(j-start)*d] = '-'; + } + c[(j-start)*d] = 0; + + reporterr( "c=%s\n", c ); + + l = 0; + for( j=start; j!=end; j+=d ) + if( c[j] == 'o' ) l++; + reporterr( "l=%d\n", l ); + free( c ); + return( l ); +} + +static int nogapmargin( int n, char **s, int start, int end, int m ) +{ + int i, j, l, d; + int minl; + + if( start < end ) d = 1; else d = -1; + +// reporterr( "\nin nogapmargin, d=%d\n", d ); + + minl = (end-start)*d; + for( i=0; im ) break; + } +// reporterr( "i=%d, l=%d, j=%d\n", i, l, j ); + if( (j-start)*d < minl ) minl = (j-start)*d; + } + minl += 1; +// reporterr( "minl=%d, so returning %d\n", minl, start+minl*d ); + return( start + minl*d ); +} +#endif + +double Falign_givenanchors( ExtAnch *pairanch, + int **whichmtx, double ***scoringmatrices, + double **n_dynamicmtx, + char **seq1, char **seq2, + double *eff1, double *eff2, + double **eff1s, double **eff2s, + int clus1, int clus2, + int alloclen, int *fftlog ) +{ + + int i, j; + int nlen, nlen2, nlen4; + static TLS int prevalloclen = 0; + //static TLS int crossscoresize = 0; + //static TLS char **tmpseq1 = NULL; + //static TLS char **tmpseq2 = NULL; + //static TLS char **tmpptr1 = NULL; + //static TLS char **tmpptr2 = NULL; + static TLS char **tmpres1 = NULL; + static TLS char **tmpres2 = NULL; + static TLS char **result1 = NULL; + static TLS char **result2 = NULL; +#if RND + //static TLS char **rndseq1 = NULL; + //static TLS char **rndseq2 = NULL; +#endif + //static TLS Fukusosuu **seqVector1 = NULL; + //static TLS Fukusosuu **seqVector2 = NULL; + //static TLS Fukusosuu **naiseki = NULL; + //static TLS Fukusosuu *naisekiNoWa = NULL; + //static TLS double *soukan = NULL; + //static TLS double **crossscore = NULL; + int nlentmp; + //static TLS int *kouho = NULL; + //static TLS Segment *segment = NULL; + //static TLS Segment *segment1 = NULL; + //static TLS Segment *segment2 = NULL; + //static TLS Segment **sortedseg1 = NULL; + //static TLS Segment **sortedseg2 = NULL; + static TLS int *alignorcopy = NULL; + static TLS int *cut1 = NULL; + static TLS int *cut2 = NULL; + static TLS char *sgap1, *egap1, *sgap2, *egap2; + static TLS int localalloclen = 0; +// int lag; +// int tmpint; + int count, count0; + int len1, len2; + int totallen; + double totalscore; +// int nkouho = 0; + int headgp, tailgp; +// double dumfl = 0.0; + int orilen1, orilen2; + int cutadd; + int starttermcut1, starttermcut2, endtermcut1, endtermcut2; + double marginfac1, marginfac2; + + if( seq1 == NULL ) + { + if( result1 ) + { +// fprintf( stderr, "### Freeing localarrays in Falign\n" ); + localalloclen = 0; + prevalloclen = 0; + //crossscoresize = 0; + mymergesort( 0, 0, NULL ); + //alignableReagion( 0, 0, NULL, NULL, NULL, NULL, NULL ); + //fft( 0, NULL, 1 ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + A__align_variousdist( NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + D__align_variousdist( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); + //blockAlign2( NULL, NULL, NULL, NULL, NULL, NULL ); + //if( crossscore ) FreeDoubleMtx( crossscore ); + //crossscore = NULL; // reallocate sareru kanousei ga arunode. + FreeCharMtx( result1 ); result1 = NULL; + FreeCharMtx( result2 ); + FreeCharMtx( tmpres1 ); + FreeCharMtx( tmpres2 ); + //FreeCharMtx( tmpseq1 ); + //FreeCharMtx( tmpseq2 ); + free( sgap1 ); + free( egap1 ); + free( sgap2 ); + free( egap2 ); + //free( kouho ); + free( alignorcopy ); + free( cut1 ); + free( cut2 ); + //free( tmpptr1 ); + //free( tmpptr2 ); + //free( segment ); + //free( segment1 ); + //free( segment2 ); + //free( sortedseg1 ); + //free( sortedseg2 ); + //if( !kobetsubunkatsu ) + //{ + // FreeFukusosuuMtx ( seqVector1 ); + // FreeFukusosuuMtx ( seqVector2 ); + // FreeFukusosuuVec( naisekiNoWa ); + // FreeFukusosuuMtx( naiseki ); + // FreeDoubleVec( soukan ); + //} + } + else + { +// fprintf( stderr, "Did not allocate localarrays in Falign\n" ); + } + + return( 0.0 ); + } + + + + len1 = strlen( seq1[0] ); + len2 = strlen( seq2[0] ); + nlentmp = MAX( len1, len2 ); + + nlen = 1; + while( nlentmp >= nlen ) nlen <<= 1; +#if 0 + fprintf( stderr, "### nlen = %d\n", nlen ); +#endif + + nlen2 = nlen/2; nlen4 = nlen2 / 2; + +#if 0 + fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 ); + fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen ); +#endif + + if( prevalloclen != alloclen ) // Falign_noudp mo kaeru + { + if( prevalloclen ) + { + FreeCharMtx( result1 ); + FreeCharMtx( result2 ); + FreeCharMtx( tmpres1 ); + FreeCharMtx( tmpres2 ); + } +// fprintf( stderr, "\n\n\nreallocating ...\n" ); + result1 = AllocateCharMtx( njob, alloclen ); // ato de loca nseq ni kakihaosu + result2 = AllocateCharMtx( njob, alloclen ); + tmpres1 = AllocateCharMtx( njob, alloclen ); + tmpres2 = AllocateCharMtx( njob, alloclen ); + prevalloclen = alloclen; + } + + if( !localalloclen ) + { + sgap1 = AllocateCharVec( njob ); + egap1 = AllocateCharVec( njob ); + sgap2 = AllocateCharVec( njob ); + egap2 = AllocateCharVec( njob ); + //kouho = AllocateIntVec( NKOUHO_LONG ); + alignorcopy = AllocateIntVec( MAXSEG ); + cut1 = AllocateIntVec( MAXSEG ); + cut2 = AllocateIntVec( MAXSEG ); + //tmpptr1 = AllocateCharMtx( njob, 0 ); + //tmpptr2 = AllocateCharMtx( njob, 0 ); + //segment = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + //segment1 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + //segment2 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + //sortedseg1 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + //sortedseg2 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + //if( !( segment && segment1 && segment2 && sortedseg1 && sortedseg2 ) ) + // ErrorExit( "Allocation error\n" ); + + //if ( scoremtx == -1 ) n20or4or2 = 1; + //else if( fftscore ) n20or4or2 = 1; + //else n20or4or2 = 20; + } + if( localalloclen < nlen ) + { + if( localalloclen ) + { +#if 1 + //if( !kobetsubunkatsu ) + //{ + // FreeFukusosuuMtx ( seqVector1 ); + // FreeFukusosuuMtx ( seqVector2 ); + // FreeFukusosuuVec( naisekiNoWa ); + // FreeFukusosuuMtx( naiseki ); + // FreeDoubleVec( soukan ); + //} + //FreeCharMtx( tmpseq1 ); + //FreeCharMtx( tmpseq2 ); +#endif +#if RND + //FreeCharMtx( rndseq1 ); + //FreeCharMtx( rndseq2 ); +#endif + } + + + //tmpseq1 = AllocateCharMtx( njob, nlen ); + //tmpseq2 = AllocateCharMtx( njob, nlen ); + //if( !kobetsubunkatsu ) + //{ + // naisekiNoWa = AllocateFukusosuuVec( nlen ); + // naiseki = AllocateFukusosuuMtx( n20or4or2, nlen ); + // seqVector1 = AllocateFukusosuuMtx( n20or4or2, nlen+1 ); + // seqVector2 = AllocateFukusosuuMtx( n20or4or2, nlen+1 ); + // soukan = AllocateDoubleVec( nlen+1 ); + //} +#if RND + //rndseq1 = AllocateCharMtx( njob, nlen ); + //rndseq2 = AllocateCharMtx( njob, nlen ); + //for( i=0; i MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); + +// fprintf( stderr, "##### k=%d / %d\n", k, maxk ); +// if( tmpint == 0 ) break; // 060430 iinoka ? // 090530 yameta + while( tmpint-- > 0 ) + { +#if 0 + if( segment[count].end - segment[count].start < fftWinSize ) + { + count++; + continue; + } +#endif + if( lag > 0 ) + { + segment1[count].start = segment[count].start ; + segment1[count].end = segment[count].end ; + segment1[count].center = segment[count].center; + segment1[count].score = segment[count].score; + + segment2[count].start = segment[count].start + lag; + segment2[count].end = segment[count].end + lag; + segment2[count].center = segment[count].center + lag; + segment2[count].score = segment[count].score ; + } + else + { + segment1[count].start = segment[count].start - lag; + segment1[count].end = segment[count].end - lag; + segment1[count].center = segment[count].center - lag; + segment1[count].score = segment[count].score ; + + segment2[count].start = segment[count].start ; + segment2[count].end = segment[count].end ; + segment2[count].center = segment[count].center; + segment2[count].score = segment[count].score ; + } +#if 0 + fprintf( stderr, "##### k=%d / %d\n", k, maxk ); + fprintf( stderr, "anchor %d, score = %f\n", count, segment1[count].score ); + fprintf( stderr, "in 1 %d\n", segment1[count].center ); + fprintf( stderr, "in 2 %d\n", segment2[count].center ); +#endif + segment1[count].pair = &segment2[count]; + segment2[count].pair = &segment1[count]; + count++; +#if 0 + fprintf( stderr, "count=%d\n", count ); +#endif + } + } +#if 1 + if( !kobetsubunkatsu ) + if( fftkeika ) fprintf( stderr, "done. (%d anchors) ", count ); +#endif + if( !count && fftNoAnchStop ) + ErrorExit( "Cannot detect anchor!" ); +#if 0 + fprintf( stderr, "RESULT before sort:\n" ); + for( l=0; lnumber = i; + for( i=0; inumber = i; + + + + if( kobetsubunkatsu ) + { + for( i=0; icenter; + cut2[i+1] = sortedseg2[i]->center; + } + cut1[0] = 0; + cut2[0] = 0; + cut1[count+1] = len1; + cut2[count+1] = len2; + count += 2; + } + + else + { + if( count < 5000 ) + { + if( crossscoresize < count+2 ) + { + crossscoresize = count+2; +#if 1 + if( fftkeika ) fprintf( stderr, "######allocating crossscore, size = %d\n", crossscoresize ); +#endif + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + for( i=0; inumber+1] = segment1[i].score; + cut1[i+1] = sortedseg1[i]->center; + cut2[i+1] = sortedseg2[i]->center; + } + +#if 0 + fprintf( stderr, "AFTER SORT\n" ); + for( i=0; i count ) + { +#if 0 + fprintf( stderr, "\7 REPEAT!? \n" ); +#else + fprintf( stderr, "REPEAT!? \n" ); +#endif + if( fftRepeatStop ) exit( 1 ); + } +#if KEIKA + else fprintf( stderr, "done\n" ); +#endif + } + } + + + else + { + fprintf( stderr, "\nMany anchors were found. The upper-level DP is skipped.\n\n" ); + + cut1[0] = 0; + cut2[0] = 0; + count0 = 0; + for( i=0; icenter, sortedseg1[i]->pair->center ); + if( sortedseg1[i]->center > cut1[count0] + && sortedseg1[i]->pair->center > cut2[count0] ) + { + count0++; + cut1[count0] = sortedseg1[i]->center; + cut2[count0] = sortedseg1[i]->pair->center; + } + else + { + if( i && sortedseg1[i]->score > sortedseg1[i-1]->score ) + { + if( sortedseg1[i]->center > cut1[count0-1] + && sortedseg1[i]->pair->center > cut2[count0-1] ) + { + cut1[count0] = sortedseg1[i]->center; + cut2[count0] = sortedseg1[i]->pair->center; + } + else + { +// count0--; + } + } + } + } +// if( count-count0 ) +// fprintf( stderr, "%d anchors unused\n", count-count0 ); + cut1[count0+1] = len1; + cut2[count0+1] = len2; + count = count0 + 2; + count0 = count; + + } + } + //uwagaki! +#endif + + marginfac1 = 1.0 + estimategapfreq( clus1, seq1 ); + marginfac2 = 1.0 + estimategapfreq( clus2, seq2 ); + starttermcut1 = starttermcut2 = 0; + endtermcut1 = endtermcut2 = 0; +// reporterr( "marginfac1=%f\n", marginfac1 ); +// reporterr( "marginfac2=%f\n", marginfac2 ); + +// reporterr( "length1,length2=%d,%d\n", len1, len2 ); +// reporterr( "pairanch when uwagaki: %d:%d\n", pairanch[0].starti, pairanch[0].startj ); +// reporterr( "pairanch when uwagaki: i=%d, j=%d\n", pairanch[0].i, pairanch[0].j ); + count = count0 = 0; + cut1[0] = 0; + cut2[0] = 0; + alignorcopy[0] = 'a'; +// while( pairanch[count].i == 0 && pairanch[count].j == 0 ) // ato de kentou + while( pairanch[count0].i > -1 ) + { + if( pairanch[count0].starti == -1 ) + { + count0++; + continue; + } + if( count+2 > MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); +#if 1 // mattan no tansaku hann'i wo seigen + if( count == 0 ) + { +// if( pairanch[count0].starti - pairanch[count0].startj > TERMINALSEGMENTLENGTH ) // you kentou +// nogaplen1 = estimatenogaplen( clus1, seq1, pairanch[count0].starti, 0 ); +// nogaplen2 = estimatenogaplen( clus2, seq2, pairanch[count0].startj, 0 ); + if( pairanch[count0].starti > terminalmargin(pairanch[count0].startj,marginfac1) ) + { +// alignorcopy[1] = 'A'; +// reporterr( "check 1, because starti=%d > startj=%d -> %d (clus1=%d)\n", pairanch[count0].starti, pairanch[count0].startj, terminalmargin(pairanch[count0].startj,marginfac1), clus1 ); + cutadd = pairanch[count0].starti - terminalmargin(pairanch[count0].startj,marginfac1); +// reporterr( "cutadd(1)=%d\n", cutadd ); +// if( 1 || cutadd > TERMINALMARGIN(0) ) // iranai + { + cut1[1] = cutadd; + cut2[1] = 0; + count += 1; + alignorcopy[1] = 'A'; + starttermcut1 = 1; + } + } + else if( pairanch[count0].startj > terminalmargin(pairanch[count0].starti, marginfac2) ) + { +// alignorcopy[1] = 'A'; +// reporterr( "check 2, because startj=%d > starti=%d -> %d (clus2=%d)\n", pairanch[count0].startj, pairanch[count0].starti, terminalmargin(pairanch[count0].starti,marginfac2), clus2 ); + cutadd = pairanch[count0].startj - terminalmargin( pairanch[count0].starti, marginfac2 ); +// reporterr( "cutadd(2)=%d\n", cutadd ); + { + cut1[1] = 0; + cut2[1] = cutadd; + count += 1; + alignorcopy[1] = 'A'; + starttermcut2 = 1; + } + } + } +#endif +#if 1 +// reporterr( "pairanch when uwagaki: %d:%d\n", pairanch[count0].starti, pairanch[count0].startj ); + cut1[count+1] = pairanch[count0].starti; + cut2[count+1] = pairanch[count0].startj; + alignorcopy[count+1] = 'c'; + count += 1; + +#if 1 + if( pairanch[count0].endi - cut1[count] == pairanch[count0].endj - cut2[count] ) + while( pairanch[count0].endi+1 - cut1[count] > 100 && pairanch[count0].endj+1 - cut2[count] > 100 ) + { + reporterr( "added an anchor, because the length is %d,%d > 100\n", pairanch[count0].endi+1 - cut1[count], pairanch[count0].endj+1 - cut2[count] ); + cut1[count+1] = cut1[count] + 100; + cut2[count+1] = cut2[count] + 100; + alignorcopy[count+1] = 'c'; + count += 1; + } +#endif + + cut1[count+1] = pairanch[count0].endi+1; + cut2[count+1] = pairanch[count0].endj+1; + alignorcopy[count+1] = 'a'; +// reporterr( "\n###cut1 at %d / %d\n", cut1[count+1], len1 ); +// reporterr( "###cut2 at %d / %d\n", cut2[count+1], len2 ); +// reporterr( "sa1=%d, sa2=%d\n", cut1[count+1]-cut1[count], cut2[count+1]-cut2[count] ); + count += 1; + count0++; + } + +#if 1 // mattan no tansaku hanni wo seigen + alignorcopy[count] = 'a'; +// if( count > 1 && (len1-cut1[count]) > (len2-cut2[count]) + 2*TERMINALSEGMENTLENGTH ) // 2 ha tekitou + if( count > 1 && (len1-cut1[count]) > terminalmargin(len2-cut2[count],marginfac1) ) + { +// reporterr( "last\n" ); +// alignorcopy[count] = 'A'; // mae no wo uwagaki + //reporterr( "insert one anchor to restrict terminal gap length, 1, cut1[count]=%d, cut2[count]=%d\n", cut1[count], cut2[count] ); + //alignorcopy[count] = 'A'; // mae no wo uwagaki +// cut1[count+1] = cut1[count] + TERMINALSEGMENTLENGTH; +// cut1[count+1] = cut1[count] + (len2-cut2[count]) + TERMINALSEGMENTLENGTH; + + cutadd = len1 - 1 - ( (len1-cut1[count]) - terminalmargin(len2-cut2[count], marginfac1) ); // wakarinikuikedo + +// if( 1 || len1-1 - cutadd > TERMINALMARGIN(0) ) + { + alignorcopy[count] = 'A'; // mae no wo uwagaki + cut1[count+1] = cutadd; + cut2[count+1] = len2; + alignorcopy[count+1] = 'a'; + cut1[count+2] = len1; + cut2[count+2] = len2; + alignorcopy[count+2] = 'c'; // tsukawanai + count += 1; + endtermcut1 = 1; + } + } +// else if( count > 1 && (len2-cut2[count]) > (len1-cut1[count]) + 2*TERMINALSEGMENTLENGTH ) // 2 ha tekitou + else if( count > 1 && (len2-cut2[count]) > terminalmargin(len1-cut1[count],marginfac2) ) + { +// reporterr( "last\n" ); +// alignorcopy[count] = 'A'; // mae no wo uwagaki + //reporterr( "insert one anchor to restrict terminal gap length, 2, cut1[count]=%d, cut2[count]=%d\n", cut1[count], cut2[count] ); + //alignorcopy[count] = 'A'; // mae no wo uwagaki + cutadd = len2 - 1 - ( (len2-cut2[count]) - terminalmargin(len1-cut1[count], marginfac2) ); + +// if( 1 || len2-1 - cutadd > TERMINALMARGIN(0) ) // iranai + { + alignorcopy[count] = 'A'; // mae no wo uwagaki + cut1[count+1] = len1; + cut2[count+1] = cutadd; + alignorcopy[count+1] = 'a'; + cut1[count+2] = len1; + cut2[count+2] = len2; + alignorcopy[count+2] = 'c'; // tsukawanai + count += 1; + endtermcut2 = 1; + } + } +#endif + + if( cut1[count] != len1 || cut2[count] != len2 ) + { + cut1[count+1] = len1; + cut2[count+1] = len2; + alignorcopy[count+1] = 'c'; // tsukawanai kedo + count += 1; + } + count += 1; + + + +#if 0 + for( i=0; i%d of GROUP1\n", j ); + fprintf( stdout, "%s\n", tmpres1[j] ); + } + for( j=0; j%d of GROUP2\n", j ); + fprintf( stdout, "%s\n", tmpres2[j] ); + } + fflush( stdout ); +#endif +// reporterr( "i=%d, orilen1=%d, len1=%d, strlen(tmpseq1[0])=%d\n", i, orilen1, len1, strlen(tmpres1[0]) ); +// if( i%2 == 1 && orilen1==len1 && orilen1==orilen2 && orilen1==strlen( tmpres1[0] ) ) // zenchou itchi no toki nomi +// if( 0 && i%2 == 1 && orilen1==orilen2 && orilen1==strlen( tmpres1[0] ) && !strcmp( tmpres1[0], tmpres2[0] ) ) // ato de fukkatsu saseru + if( alignorcopy[i] == 'c' && orilen1==orilen2 && orilen1==strlen( tmpres1[0] ) && !strcmp( tmpres1[0], tmpres2[0] ) ) // ato de fukkatsu saseru + { +// checklength = 1; +#if 0 + reporterr( "\ncopying\n" ); + for( j=0; j alloclen ) + { + fprintf( stderr, "totallen=%d + nlen=%d > alloclen = %d\n", totallen, nlen, alloclen ); + ErrorExit( "LENGTH OVER in Falign\n " ); + } + for( j=0; jgroup1-%d\n%100.100s\n", j, result1[j] ); + } + fprintf( stderr, "- - - - - - - - - - -\n" ); + for( j=0; jgroup2-%d\n%100.100s\n", j, result2[j] ); + } +// if( clus1 == 1 && clus2 == 5 ) exit( 1 ); +#endif + return( totalscore ); +} + + + + + +/* +sakujo wo kentou (2010/10/05) +*/ +double Falign_udpari_long( + int **whichmtx, double ***scoringmatrices, + double **n_dynamicmtx, + char **seq1, char **seq2, + double *eff1, double *eff2, + double **eff1s, double **eff2s, + int clus1, int clus2, + int alloclen, int *fftlog ) +{ + int i, j, k, l, m, maxk; + int nlen, nlen2, nlen4; + static TLS int crossscoresize = 0; + char **tmpseq1 = NULL; + char **tmpseq2 = NULL; + char **tmpptr1 = NULL; + char **tmpptr2 = NULL; + char **tmpres1 = NULL; + char **tmpres2 = NULL; + char **result1 = NULL; + char **result2 = NULL; +#if RND + char **rndseq1 = NULL; + char **rndseq2 = NULL; +#endif + static TLS Fukusosuu **seqVector1 = NULL; + static TLS Fukusosuu **seqVector2 = NULL; + static TLS Fukusosuu **naiseki = NULL; + static TLS Fukusosuu *naisekiNoWa = NULL; + static TLS double *soukan = NULL; + static TLS double **crossscore = NULL; + int nlentmp; + static TLS int *kouho = NULL; + static TLS Segment *segment = NULL; + static TLS Segment *segment1 = NULL; + static TLS Segment *segment2 = NULL; + static TLS Segment **sortedseg1 = NULL; + static TLS Segment **sortedseg2 = NULL; + static TLS int *cut1 = NULL; + static TLS int *cut2 = NULL; + char *sgap1, *egap1, *sgap2, *egap2; + static TLS int localalloclen = 0; + int lag; + int tmpint; + int count, count0; + int len1, len2; + int totallen; + double totalscore; + int nkouho = 0; + int headgp, tailgp; +// double dumfl = 0.0; + + if( seq1 == NULL ) + { + if( kouho ) + { +// fprintf( stderr, "### Freeing localarrays in Falign\n" ); + localalloclen = 0; + crossscoresize = 0; + mymergesort( 0, 0, NULL ); + alignableReagion( 0, 0, NULL, NULL, NULL, NULL, NULL ); + fft( 0, NULL, 1 ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + A__align_variousdist( NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + D__align_variousdist( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); + blockAlign2( NULL, NULL, NULL, NULL, NULL, NULL ); + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = NULL; // reallocate sareru kanousei ga arunode. + free( kouho ); + kouho = NULL; + free( cut1 ); + free( cut2 ); + free( segment ); + free( segment1 ); + free( segment2 ); + free( sortedseg1 ); + free( sortedseg2 ); + if( !kobetsubunkatsu ) + { + FreeFukusosuuMtx ( seqVector1 ); + FreeFukusosuuMtx ( seqVector2 ); + FreeFukusosuuVec( naisekiNoWa ); + FreeFukusosuuMtx( naiseki ); + FreeDoubleVec( soukan ); + } + } + else + { +// fprintf( stderr, "Did not allocate localarrays in Falign\n" ); + } + + return( 0.0 ); + } + + len1 = strlen( seq1[0] ); + len2 = strlen( seq2[0] ); + nlentmp = MAX( len1, len2 ); + + nlen = 1; + while( nlentmp >= nlen ) nlen <<= 1; +#if 0 + fprintf( stderr, "### nlen = %d\n", nlen ); +#endif + + nlen2 = nlen/2; nlen4 = nlen2 / 2; + +#if 0 + fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 ); + fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen ); +#endif + + result1 = AllocateCharMtx( clus1, alloclen ); + result2 = AllocateCharMtx( clus2, alloclen ); + tmpres1 = AllocateCharMtx( clus1, alloclen ); + tmpres2 = AllocateCharMtx( clus2, alloclen ); + sgap1 = AllocateCharVec( clus1 ); + egap1 = AllocateCharVec( clus1 ); + sgap2 = AllocateCharVec( clus2 ); + egap2 = AllocateCharVec( clus2 ); + + tmpseq1 = AllocateCharMtx( clus1, nlen ); + tmpseq2 = AllocateCharMtx( clus2, nlen ); + tmpptr1 = calloc( clus1, sizeof(char*) ); + tmpptr2 = calloc( clus2, sizeof(char*) ); + +#if RND + rndseq1 = AllocateCharMtx( clus1, nlen ); + rndseq2 = AllocateCharMtx( clus2, nlen ); + for( i=0; i /dev/tty" ); +#endif + if( !kobetsubunkatsu ) + { + if( fftkeika ) fprintf( stderr, " FFT ... " ); + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( k=0; k /dev/tty " ); +#endif + + fft( -nlen, naisekiNoWa, 0 ); + + for( m=0; m<=nlen2; m++ ) + soukan[m] = naisekiNoWa[nlen2-m].R; + for( m=nlen2+1; mCandidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr1[0] ); + fprintf( fftfp, ">Candidate No.%d lag = %d\n", k+1, lag ); + fprintf( fftfp, "%s\n", tmpptr2[0] ); + fprintf( fftfp, ">\n", k+1, lag ); + fclose( fftfp ); +#endif + +// fprintf( stderr, "lag = %d\n", lag ); + tmpint = alignableReagion( clus1, clus2, tmpptr1, tmpptr2, eff1, eff2, segment+count ); +// fprintf( stderr, "lag = %d, %d found\n", lag, tmpint ); + +// if( lag == -50 ) exit( 1 ); + + if( count+tmpint > MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); + +// fprintf( stderr, "##### k=%d / %d\n", k, maxk ); +// if( tmpint == 0 ) break; // 060430 iinoka ? // 090530 yameta + while( tmpint-- > 0 ) + { +#if 0 + if( segment[count].end - segment[count].start < fftWinSize ) + { + count++; + continue; + } +#endif + if( lag > 0 ) + { + segment1[count].start = segment[count].start ; + segment1[count].end = segment[count].end ; + segment1[count].center = segment[count].center; + segment1[count].score = segment[count].score; + + segment2[count].start = segment[count].start + lag; + segment2[count].end = segment[count].end + lag; + segment2[count].center = segment[count].center + lag; + segment2[count].score = segment[count].score ; + } + else + { + segment1[count].start = segment[count].start - lag; + segment1[count].end = segment[count].end - lag; + segment1[count].center = segment[count].center - lag; + segment1[count].score = segment[count].score ; + + segment2[count].start = segment[count].start ; + segment2[count].end = segment[count].end ; + segment2[count].center = segment[count].center; + segment2[count].score = segment[count].score ; + } +#if 0 + fprintf( stderr, "##### k=%d / %d\n", k, maxk ); + fprintf( stderr, "anchor %d, score = %f\n", count, segment1[count].score ); + fprintf( stderr, "in 1 %d\n", segment1[count].center ); + fprintf( stderr, "in 2 %d\n", segment2[count].center ); +#endif + segment1[count].pair = &segment2[count]; + segment2[count].pair = &segment1[count]; + count++; +#if 0 + fprintf( stderr, "count=%d\n", count ); +#endif + } + } +#if 1 + if( !kobetsubunkatsu ) + if( fftkeika ) fprintf( stderr, "done. (%d anchors) ", count ); +#endif + if( !count && fftNoAnchStop ) + ErrorExit( "Cannot detect anchor!" ); +#if 0 + fprintf( stderr, "RESULT before sort:\n" ); + for( l=0; lnumber = i; + for( i=0; inumber = i; + + + + if( kobetsubunkatsu ) + { + for( i=0; icenter; + cut2[i+1] = sortedseg2[i]->center; + } + cut1[0] = 0; + cut2[0] = 0; + cut1[count+1] = len1; + cut2[count+1] = len2; + count += 2; + } + + else + { + if( count < 5000 ) + { + if( crossscoresize < count+2 ) + { + crossscoresize = count+2; +#if 1 + if( fftkeika ) fprintf( stderr, "######allocating crossscore, size = %d\n", crossscoresize ); +#endif + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + for( i=0; inumber+1] = segment1[i].score; + cut1[i+1] = sortedseg1[i]->center; + cut2[i+1] = sortedseg2[i]->center; + } + +#if 0 + fprintf( stderr, "AFTER SORT\n" ); + for( i=0; i count ) + { +#if 0 + fprintf( stderr, "\7 REPEAT!? \n" ); +#else + fprintf( stderr, "REPEAT!? \n" ); +#endif + if( fftRepeatStop ) exit( 1 ); + } +#if KEIKA + else fprintf( stderr, "done\n" ); +#endif + } + } + + + else + { + fprintf( stderr, "\nMany anchors were found. The upper-level DP is skipped.\n\n" ); + + cut1[0] = 0; + cut2[0] = 0; + count0 = 0; + for( i=0; icenter, sortedseg1[i]->pair->center ); + if( sortedseg1[i]->center > cut1[count0] + && sortedseg1[i]->pair->center > cut2[count0] ) + { + count0++; + cut1[count0] = sortedseg1[i]->center; + cut2[count0] = sortedseg1[i]->pair->center; + } + else + { + if( i && sortedseg1[i]->score > sortedseg1[i-1]->score ) + { + if( sortedseg1[i]->center > cut1[count0-1] + && sortedseg1[i]->pair->center > cut2[count0-1] ) + { + cut1[count0] = sortedseg1[i]->center; + cut2[count0] = sortedseg1[i]->pair->center; + } + else + { +// count0--; + } + } + } + } +// if( count-count0 ) +// fprintf( stderr, "%d anchors unused\n", count-count0 ); + cut1[count0+1] = len1; + cut2[count0+1] = len2; + count = count0 + 2; + count0 = count; + + } + } + +// exit( 0 ); + +#if 0 + fftfp = fopen( "fft", "a" ); + fprintf( fftfp, "RESULT after sort:\n" ); + for( l=0; l%d of GROUP1\n", j ); + fprintf( stdout, "%s\n", tmpres1[j] ); + } + for( j=0; j%d of GROUP2\n", j ); + fprintf( stdout, "%s\n", tmpres2[j] ); + } + fflush( stdout ); +#endif + switch( alg ) + { + case( 'M' ): + if( scoringmatrices ) // called by tditeration.c + totalscore += MSalignmm_variousdist( NULL, scoringmatrices, NULL, tmpres1, tmpres2, eff1, eff2, eff1s, eff2s, clus1, clus2, alloclen, sgap1, sgap2, egap1, egap2, NULL, 0, NULL, headgp, tailgp ); + else + totalscore += MSalignmm( n_dynamicmtx, tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, sgap1, sgap2, egap1, egap2, NULL, 0, NULL, headgp, tailgp, NULL, NULL, NULL, 0.0, 0.0 ); +// totalscore += G__align11( n_dynamicmtx, tmpres1, tmpres2, alloclen, headgp, tailgp ); // CHUUI!!! + break; + default: + fprintf( stderr, "alg = %c\n", alg ); + ErrorExit( "ERROR IN SOURCE FILE Falign.c" ); + break; + } + + nlen = strlen( tmpres1[0] ); + if( totallen + nlen > alloclen ) + { + fprintf( stderr, "totallen=%d + nlen=%d > alloclen = %d\n", totallen, nlen, alloclen ); + ErrorExit( "LENGTH OVER in Falign\n " ); + } + for( j=0; jR = result->I = 0.0; + result++; + } +} + +#if 0 +static void vec_init2( Fukusosuu **result, char *seq, double eff, int st, int ed ) +{ + int i; + for( i=st; i= 0 ) result->R += incr * score[n]; +#if 0 + fprintf( stderr, "n=%d, score=%f, inc=%f R=%f\n",n, score[n], incr * score[n], result->R ); +#endif + } +} + +static void seq_vec_3( Fukusosuu **result, double incr, char *seq ) +{ + int i; + int n; + for( i=0; *seq; i++ ) + { + n = amino_n[(unsigned char)*seq++]; + if( n < n20or4or2 && n >= 0 ) result[n][i].R += incr; + } +} + + +#if 0 +static void seq_vec( Fukusosuu *result, char query, double incr, char *seq ) +{ +#if 0 + int bk = nlen; +#endif + while( *seq ) + { + if( *seq++ == query ) result->R += incr; + result++; +#if 0 +fprintf( stderr, "i = %d result->R = %f\n", bk-nlen, (result-1)->R ); +#endif + } +} + +static int checkRepeat( int num, int *cutpos ) +{ + int tmp, buf; + + buf = *cutpos; + while( num-- ) + { + if( ( tmp = *cutpos++ ) < buf ) return( 1 ); + buf = tmp; + } + return( 0 ); +} + +static int segcmp( void *ptr1, void *ptr2 ) +{ + int diff; + Segment **seg1 = (Segment **)ptr1; + Segment **seg2 = (Segment **)ptr2; +#if 0 + return( (*seg1)->center - (*seg2)->center ); +#else + diff = (*seg1)->center - (*seg2)->center; + if( diff ) return( diff ); + + diff = (*seg1)->start - (*seg2)->start; + if( diff ) return( diff ); + + diff = (*seg1)->end - (*seg2)->end; + if( diff ) return( diff ); + + fprintf( stderr, "USE STABLE SORT !!\n" ); + exit( 1 ); + return( 0 ); +#endif +} + +#endif + + +static void mymergesort( int first, int last, Segment **seg ) +{ + int middle; + static TLS int i, j, k, p; + static TLS int allo = 0; + static TLS Segment **work = NULL; + + if( seg == NULL ) + { + free( work ); work = NULL; + return; + } + + if( last > allo ) + { + allo = last; + if( work ) free( work ); + work = (Segment **)calloc( allo / 2 + 1, sizeof( Segment *) ); + } + + if( first < last ) + { + middle = ( first + last ) / 2; + mymergesort( first, middle, seg ); + mymergesort( middle+1, last, seg ); + p = 0; + for( i=first; i<=middle; i++ ) work[p++] = seg[i]; + i = middle + 1; j = 0; k = first; + while( i <= last && j < p ) + { + if( work[j]->center <= seg[i]->center ) + seg[k++] = work[j++]; + else + seg[k++] = seg[i++]; + } + while( j < p ) seg[k++] = work[j++]; + } +} + + +double Falign_localhom( int **whichmtx, double ***scoringmatrices, double **n_dynamicmtx, + char **seq1, char **seq2, + double *eff1, double *eff2, + double **eff1s, double **eff2s, + int clus1, int clus2, + int alloclen, + int constraint, double *totalimpmatch, + int *gapmap1, int *gapmap2, + int *chudanpt, int chudanref, int *chudanres ) +{ + // tditeration.c deha alloclen ha huhen nanode + // prevalloclen ha iranai. + int i, j, k, l, m, maxk; + int nlen, nlen2, nlen4; + static TLS int crossscoresize = 0; + static TLS char **tmpseq1 = NULL; + static TLS char **tmpseq2 = NULL; + static TLS char **tmpptr1 = NULL; + static TLS char **tmpptr2 = NULL; + static TLS char **tmpres1 = NULL; + static TLS char **tmpres2 = NULL; + static TLS char **result1 = NULL; + static TLS char **result2 = NULL; +#if RND + static TLS char **rndseq1 = NULL; + static TLS char **rndseq2 = NULL; +#endif + static TLS Fukusosuu **seqVector1 = NULL; + static TLS Fukusosuu **seqVector2 = NULL; + static TLS Fukusosuu **naiseki = NULL; + static TLS Fukusosuu *naisekiNoWa = NULL; + static TLS double *soukan = NULL; + static TLS double **crossscore = NULL; + int nlentmp; + static TLS int *kouho = NULL; + static TLS Segment *segment = NULL; + static TLS Segment *segment1 = NULL; + static TLS Segment *segment2 = NULL; + static TLS Segment **sortedseg1 = NULL; + static TLS Segment **sortedseg2 = NULL; + static TLS int *cut1 = NULL; + static TLS int *cut2 = NULL; + static TLS char *sgap1, *egap1, *sgap2, *egap2; + static TLS int localalloclen = 0; + int lag; + int tmpint; + int count, count0; + int len1, len2; + int totallen; + double totalscore; + double impmatch; + + extern Fukusosuu *AllocateFukusosuuVec(); + extern Fukusosuu **AllocateFukusosuuMtx(); + + if( seq1 == NULL ) + { + if( result1 ) + { +// fprintf( stderr, "Freeing localarrays in Falign\n" ); + localalloclen = 0; + crossscoresize = 0; + mymergesort( 0, 0, NULL ); + alignableReagion( 0, 0, NULL, NULL, NULL, NULL, NULL ); + fft( 0, NULL, 1 ); +// A__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1 ); // iru? + G__align11( NULL, NULL, NULL, 0, 0, 0 ); + partA__align( NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL ); + partA__align_variousdist( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL ); + blockAlign2( NULL, NULL, NULL, NULL, NULL, NULL ); + if( crossscore ) FreeDoubleMtx( crossscore ); + FreeCharMtx( result1 ); + FreeCharMtx( result2 ); + FreeCharMtx( tmpres1 ); + FreeCharMtx( tmpres2 ); + FreeCharMtx( tmpseq1 ); + FreeCharMtx( tmpseq2 ); + free( sgap1 ); + free( egap1 ); + free( sgap2 ); + free( egap2 ); + free( kouho ); + free( cut1 ); + free( cut2 ); + free( tmpptr1 ); + free( tmpptr2 ); + free( segment ); + free( segment1 ); + free( segment2 ); + free( sortedseg1 ); + free( sortedseg2 ); + if( !kobetsubunkatsu ) + { + FreeFukusosuuMtx ( seqVector1 ); + FreeFukusosuuMtx ( seqVector2 ); + FreeFukusosuuVec( naisekiNoWa ); + FreeFukusosuuMtx( naiseki ); + FreeDoubleVec( soukan ); + } + } + else + { +// fprintf( stderr, "Did not allocate localarrays in Falign\n" ); + } + + return( 0.0 ); + } + + len1 = strlen( seq1[0] ); + len2 = strlen( seq2[0] ); + nlentmp = MAX( len1, len2 ); + + nlen = 1; + while( nlentmp >= nlen ) nlen <<= 1; +#if 0 + fprintf( stderr, "### nlen = %d\n", nlen ); +#endif + + nlen2 = nlen/2; nlen4 = nlen2 / 2; + +#if DEBUG + fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 ); + fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen ); +#endif + + if( !localalloclen ) + { + sgap1 = AllocateCharVec( njob ); + egap1 = AllocateCharVec( njob ); + sgap2 = AllocateCharVec( njob ); + egap2 = AllocateCharVec( njob ); + kouho = AllocateIntVec( NKOUHO ); + cut1 = AllocateIntVec( MAXSEG ); + cut2 = AllocateIntVec( MAXSEG ); + tmpptr1 = AllocateCharMtx( njob, 0 ); + tmpptr2 = AllocateCharMtx( njob, 0 ); + result1 = AllocateCharMtx( njob, alloclen ); + result2 = AllocateCharMtx( njob, alloclen ); + tmpres1 = AllocateCharMtx( njob, alloclen ); + tmpres2 = AllocateCharMtx( njob, alloclen ); +// crossscore = AllocateDoubleMtx( MAXSEG, MAXSEG ); + segment = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + segment1 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + segment2 = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); + sortedseg1 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + sortedseg2 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) ); + if( !( segment && segment1 && segment2 && sortedseg1 && sortedseg2 ) ) + ErrorExit( "Allocation error\n" ); + + if ( scoremtx == -1 ) n20or4or2 = 4; + else if( fftscore == 1 ) n20or4or2 = 2; + else n20or4or2 = 20; + } + if( localalloclen < nlen ) + { + if( localalloclen ) + { +#if 1 + if( !kobetsubunkatsu ) + { + FreeFukusosuuMtx ( seqVector1 ); + FreeFukusosuuMtx ( seqVector2 ); + FreeFukusosuuVec( naisekiNoWa ); + FreeFukusosuuMtx( naiseki ); + FreeDoubleVec( soukan ); + } + FreeCharMtx( tmpseq1 ); + FreeCharMtx( tmpseq2 ); +#endif +#if RND + FreeCharMtx( rndseq1 ); + FreeCharMtx( rndseq2 ); +#endif + } + + tmpseq1 = AllocateCharMtx( njob, nlen ); + tmpseq2 = AllocateCharMtx( njob, nlen ); + if( !kobetsubunkatsu ) + { + naisekiNoWa = AllocateFukusosuuVec( nlen ); + naiseki = AllocateFukusosuuMtx( n20or4or2, nlen ); + seqVector1 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 ); + seqVector2 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 ); + soukan = AllocateDoubleVec( nlen+1 ); + } +#if RND + rndseq1 = AllocateCharMtx( njob, nlen ); + rndseq2 = AllocateCharMtx( njob, nlen ); + for( i=0; i /dev/tty" ); +#endif + if( !kobetsubunkatsu ) + { + fprintf( stderr, "FFT ... " ); + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( j=0; j /dev/tty" ); +#endif + + for( k=0; k /dev/tty " ); +#endif + + fft( -nlen, naisekiNoWa, 0 ); + + for( m=0; m<=nlen2; m++ ) + soukan[m] = naisekiNoWa[nlen2-m].R; + for( m=nlen2+1; m /dev/tty" ); +#if 0 + fftfp = fopen( "list.plot", "w" ); + fprintf( fftfp, "plot 'frt'\n pause +1" ); + fclose( fftfp ); + system( "/usr/bin/gnuplot list.plot" ); +#endif +#endif + + + getKouho( kouho, NKOUHO, soukan, nlen ); + +#if 0 + for( i=0; i MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" ); + + + while( tmpint-- > 0 ) + { + if( lag > 0 ) + { + segment1[count].start = segment[count].start ; + segment1[count].end = segment[count].end ; + segment1[count].center = segment[count].center; + segment1[count].score = segment[count].score; + + segment2[count].start = segment[count].start + lag; + segment2[count].end = segment[count].end + lag; + segment2[count].center = segment[count].center + lag; + segment2[count].score = segment[count].score ; + } + else + { + segment1[count].start = segment[count].start - lag; + segment1[count].end = segment[count].end - lag; + segment1[count].center = segment[count].center - lag; + segment1[count].score = segment[count].score ; + + segment2[count].start = segment[count].start ; + segment2[count].end = segment[count].end ; + segment2[count].center = segment[count].center; + segment2[count].score = segment[count].score ; + } +#if 0 + fftfp = fopen( "cand", "a" ); + fprintf( fftfp, "Goukaku=%dko\n", tmpint ); + fprintf( fftfp, "in 1 %d\n", segment1[count].center ); + fprintf( fftfp, "in 2 %d\n", segment2[count].center ); + fclose( fftfp ); +#endif + segment1[count].pair = &segment2[count]; + segment2[count].pair = &segment1[count]; + count++; +#if 0 + fprintf( stderr, "count=%d\n", count ); +#endif + } + } +#if 1 + if( !kobetsubunkatsu ) + fprintf( stderr, "%d segments found\n", count ); +#endif + if( !count && fftNoAnchStop ) + ErrorExit( "Cannot detect anchor!" ); +#if 0 + fftfp = fopen( "fft", "a" ); + fprintf( fftfp, "RESULT before sort:\n" ); + for( l=0; lnumber = i; + for( i=0; inumber = i; + + + if( kobetsubunkatsu ) + { + for( i=0; icenter; + cut2[i+1] = sortedseg2[i]->center; + } + cut1[0] = 0; + cut2[0] = 0; + cut1[count+1] = len1; + cut2[count+1] = len2; + count += 2; + } + else + { + if( crossscoresize < count+2 ) + { + crossscoresize = count+2; +#if 1 + fprintf( stderr, "######allocating crossscore, size = %d\n", crossscoresize ); +#endif + if( crossscore ) FreeDoubleMtx( crossscore ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + for( i=0; inumber+1] = segment1[i].score; + cut1[i+1] = sortedseg1[i]->center; + cut2[i+1] = sortedseg2[i]->center; + } + +#if DEBUG + fprintf( stderr, "AFTER SORT\n" ); + for( i=0; i count ) + { +#if 0 + fprintf( stderr, "\7 REPEAT!? \n" ); +#else + fprintf( stderr, "REPEAT!? \n" ); +#endif + if( fftRepeatStop ) exit( 1 ); + } +#if KEIKA + else fprintf( stderr, "done\n" ); +#endif + } + +#if 0 + fftfp = fopen( "fft", "a" ); + fprintf( fftfp, "RESULT after sort:\n" ); + for( l=0; l alloclen ) + { + fprintf( stderr, "totallen=%d + nlen=%d > alloclen = %d\n", totallen, nlen, alloclen ); + ErrorExit( "LENGTH OVER in Falign\n " ); + } + for( j=0; j= warpbase ) + if( tailgp == 1 ) + ; + else + { +#if 1 +// reporterr( "lastverticalw[lgth1-1] = %f\n", lastverticalw[lgth1-1] ); +// reporterr( "lasthorizontalw[lgth2-1] = %f\n", lasthorizontalw[lgth2-1] ); + wm = lasthorizontalw[lgth2-1] - 1.0; // lasthorizontalw[lgth2-1] yori kanarazu chiisai. + for( j=lgth2-2; j>=0; j-- ) + { + if( (g=lasthorizontalw[j]+ ( fpenalty * TERMGAPFAC + fpenalty_ex * (lgth2-1-j) * TERMGAPFAC_EX ) ) > wm ) + { + wm = g; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + for( i=lgth1-2; i>=0; i-- ) + { + if( ( g=lastverticalw[i]+ ( fpenalty * TERMGAPFAC + fpenalty_ex * (lgth1-1-i) * TERMGAPFAC_EX ) ) > wm ) + { + wm = g; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + if( lasthorizontalw[lgth2-1] > wm ) // score ga onaji baai erabarenai + { + wm = lasthorizontalw[lgth2-1]; + iin = lgth1-1; jin = lgth2-1; + ijp[lgth1][lgth2] = 0; + } +#else + wm = lastverticalw[0]; + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } +#endif + } + + + + mseq1[0] += lgth1+lgth2; + *mseq1[0] = 0; + mseq2[0] += lgth1+lgth2; + *mseq2[0] = 0; + + + + iin = lgth1; jin = lgth2; + limk = lgth1+lgth2 + 1; + for( k=0; k= warpbase ) + { +// fprintf( stderr, "WARP!\n" ); + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--mseq1[0] = seq1[0][l]; + *--mseq2[0] = *gap; + k++; + } + l= jin; + while( --l >= 0 ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][l]; + k++; + } + break; + } + else + { + l = iin - ifi; + while( --l > 0 ) + { + *--mseq1[0] = seq1[0][ifi+l]; + *--mseq2[0] = *gap; + k++; + } + l= jin - jfi; + while( --l > 0 ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][jfi+l]; + k++; + } + } + if( iin <= 0 || jin <= 0 ) break; + *--mseq1[0] = seq1[0][ifi]; + *--mseq2[0] = seq2[0][jfi]; + k++; + iin = ifi; jin = jfi; + } + +// fprintf( stderr, "%s\n", mseq1[0] ); +// fprintf( stderr, "%s\n", mseq2[0] ); + return( wm ); +} + + +double G__align11( double **n_dynamicmtx, char **seq1, char **seq2, int alloclen, int headgp, int tailgp ) +{ + +// int k; + register int i, j; + int lasti; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lastj; + int lgth1, lgth2; + int resultlen; + double wm, wmo; /* int ?????? */ + double g; + double *currentw, *previousw; + double fpenalty = (double)penalty; + double fpenalty_shift = (double)penalty_shift; + double fpenalty_tmp; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; + double fpenalty_ex_i; +#endif +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi = 0.0; + static TLS double *m = NULL; + static TLS int **ijp = NULL; + static TLS int mpi = 0; + static TLS int *mp = NULL; + static TLS double *w1 = NULL; + static TLS double *w2 = NULL; + static TLS double *match = NULL; + static TLS double *initverticalw = NULL; /* kufuu sureba iranai */ + static TLS double *lastverticalw = NULL; /* kufuu sureba iranai */ + static TLS char **mseq1 = NULL; + static TLS char **mseq2 = NULL; + static TLS char **mseq = NULL; + static TLS int **intwork = NULL; + static TLS double **doublework = NULL; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double **amino_dynamicmtx = NULL; // ?? + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + + + if( seq1 == NULL ) + { + if( orlgth1 > 0 && orlgth2 > 0 ) + { + orlgth1 = 0; + orlgth2 = 0; + if( mseq1 ) free( mseq1 ); mseq1 = NULL; + if( mseq2 ) free( mseq2 ); mseq2 = NULL; + if( w1 ) FreeFloatVec( w1 ); w1 = NULL; + if( w2 ) FreeFloatVec( w2 ); w2 = NULL; + if( match ) FreeFloatVec( match ); match = NULL; + if( initverticalw ) FreeFloatVec( initverticalw ); initverticalw = NULL; + if( lastverticalw ) FreeFloatVec( lastverticalw ); lastverticalw = NULL; + + if( m ) FreeFloatVec( m ); m = NULL; + if( mp ) FreeIntVec( mp ); mp = NULL; + + if( mseq ) FreeCharMtx( mseq ); mseq = NULL; + + + + if( doublework ) FreeFloatMtx( doublework ); doublework = NULL; + if( intwork ) FreeIntMtx( intwork ); intwork = NULL; + + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + } + orlgth1 = 0; + orlgth2 = 0; + return( 0.0 ); + } + + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + warpbase = lgth1 + lgth2; + warpis = NULL; + warpjs = NULL; + warpn = 0; + if( trywarp ) + { +// fprintf( stderr, "IN G__align11\n" ); + if( headgp == 0 || tailgp == 0 ) + { + fprintf( stderr, "At present, headgp and tailgp must be 1.\n" ); + exit( 1 ); + } + + wmrecords = AllocateFloatVec( lgth2+1 ); + warpi = AllocateIntVec( lgth2+1 ); + warpj = AllocateIntVec( lgth2+1 ); + prevwmrecords = AllocateFloatVec( lgth2+1 ); + prevwarpi = AllocateIntVec( lgth2+1 ); + prevwarpj = AllocateIntVec( lgth2+1 ); + for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + FreeDoubleMtx( amino_dynamicmtx ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( 2, ll1+ll2 ); // 2020/Apr + + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + amino_dynamicmtx = AllocateDoubleMtx( 0x100, 0x100 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + + +#if 0 + for( i=0; i", wm ); +#endif +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=mi+fpenalty) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } + if( (g=*prept) >= mi ) +// if( (g=*prept) > mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex_i; +// mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=*mjpt + fpenalty) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } + if( (g=*prept) >= *mjpt ) +// if( (g=*prept) > *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + if( j < lgth2 ) // 2018/May/11 + m[j] += fpenalty_ex; +#endif +#if 1 + if( trywarp ) + { + fpenalty_tmp = fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ); +// fprintf( stderr, "fpenalty_shift = %f\n", fpenalty_tmp ); + +// fprintf( stderr, "\n\n\nwarp to %c-%c (%d-%d) from %c-%c (%d-%d) ? prevwmrecords[%d] = %f + %f <- wm = %f\n", seq1[0][prevwarpi[j-1]], seq2[0][prevwarpj[j-1]], prevwarpi[j-1], prevwarpj[j-1], seq1[0][i], seq2[0][j], i, j, j, prevwmrecords[j-1], fpenalty_tmp, wm ); +// if( (g=prevwmrecords[j-1] + fpenalty_shift )> wm ) + if( ( g=*prevwmrecordspt++ + fpenalty_tmp )> wm ) // naka ha osokute kamawanai + { +// fprintf( stderr, "Yes! Warp!! from %d-%d (%c-%c) to %d-%d (%c-%c) fpenalty_tmp = %f! warpn = %d\n", i, j, seq1[0][i], seq2[0][j-1], prevwarpi[j-1], prevwarpj[j-1],seq1[0][prevwarpi[j-1]], seq2[0][prevwarpj[j-1]], fpenalty_tmp, warpn ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + else + { + } + + curm = *curpt + wm; + +// fprintf( stderr, "###### curm = %f at %c-%c, i=%d, j=%d\n", curm, seq1[0][i], seq2[0][j], i, j ); + +// fprintf( stderr, "copy from i, j-1? %f > %f?\n", wmrecords[j-1], curm ); +// if( wmrecords[j-1] > wmrecords[j] ) + if( *wmrecords1pt > *wmrecordspt ) + { +// fprintf( stderr, "yes\n" ); +// wmrecords[j] = wmrecords[j-1]; + *wmrecordspt = *wmrecords1pt; +// warpi[j] = warpi[j-1]; +// warpj[j] = warpj[j-1]; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); +// fprintf( stderr, "warpi[j]=%d, warpj[j]=%d wmrecords[j] = %f\n", warpi[j], warpj[j], wmrecords[j] ); + } +// else +// { +// fprintf( stderr, "no\n" ); +// } + +// fprintf( stderr, " curm = %f at %c-%c\n", curm, seq1[0][i], seq2[0][j] ); +// fprintf( stderr, " wmrecords[%d] = %f\n", j, wmrecords[j] ); +// fprintf( stderr, "replace?\n" ); + +// if( curm > wmrecords[j] ) + if( curm > *wmrecordspt ) + { +// fprintf( stderr, "yes at %d-%d (%c-%c), replaced warp: warpi[j]=%d, warpj[j]=%d warpn=%d, wmrecords[j] = %f -> %f\n", i, j, seq1[0][i], seq2[0][j], i, j, warpn, wmrecords[j], curm ); +// wmrecords[j] = curm; + *wmrecordspt = curm; +// warpi[j] = i; +// warpj[j] = j; + *warpipt = i; + *warpjpt = j; + } +// else +// { +// fprintf( stderr, "No! warpi[j]=%d, warpj[j]=%d wmrecords[j] = %f\n", warpi[j], warpj[j], wmrecords[j] ); +// } +// fprintf( stderr, "%d-%d (%c-%c) curm = %5.0f, wmrecords[j]=%f\n", i, j, seq1[0][i], seq2[0][j], curm, wmrecords[j] ); + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } +#endif + + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + } + lastverticalw[i] = currentw[lgth2-1]; // lgth2==0 no toki error + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + } + + + if( trywarp ) + { +// fprintf( stderr, "\nwm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + + wmo = Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, tailgp, warpis, warpjs, warpbase ); + if( !tailgp ) wm = wmo; + +// reporterr( "wm (after tracking) = %f\n", wm ); + if( warpis ) free( warpis ); + if( warpjs ) free( warpjs ); + + + resultlen = strlen( mseq1[0] ); + if( alloclen < resultlen || resultlen > N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + strcpy( seq1[0], mseq1[0] ); + strcpy( seq2[0], mseq2[0] ); +#if 0 + fprintf( stderr, "\n" ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); + fprintf( stderr, "wm = %f\n", wm ); +#endif + + return( wm ); +} + +double G__align11_noalign( double **n_dynamicmtx, int penal, int penal_ex, char **seq1, char **seq2, int alloclen ) +/* warp mitaiou */ +{ +// int k; + register int i, j; + int lasti; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; +// int resultlen; + double wm; /* int ?????? */ + double g; + double *currentw, *previousw; + double fpenalty = (double)penal; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penal_ex; + double fpenalty_ex_i; +#endif +#if 1 + double *wtmp; + double *mjpt, *prept, *curpt; +// int *mpjpt; +#endif + static TLS double mi, *m; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS int **intwork; + static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double **amino_dynamicmtx; + + if( seq1 == NULL ) + { + if( orlgth1 > 0 && orlgth2 > 0 ) + { + orlgth1 = 0; + orlgth2 = 0; + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + free( m ); + + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + FreeDoubleMtx( amino_dynamicmtx ); + } + return( 0.0 ); + } + + + wm = 0.0; + + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + + +#if 0 + if( lgth1 <= 0 || lgth2 <= 0 ) + { + fprintf( stderr, "WARNING (g11): lgth1=%d, lgth2=%d\n", lgth1, lgth2 ); + } +#endif + + if( lgth1 > orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + + + + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + + FreeDoubleMtx( amino_dynamicmtx ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + + + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + + +// amino_dynamicmtx = AllocateDoubleMtx( 0x80, 0x80 ); + amino_dynamicmtx = AllocateDoubleMtx( 0x100, 0x100 ); // 2017/Nov. constants.c no 'charsize' wo global hensuu nishita houga yoi? +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + for( i=0; i", wm ); +#endif +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=mi+fpenalty) > wm ) + { + wm = g; + } +// if( (g=*prept) >= mi ) + if( (g=*prept) > mi ) // onaji hazu + { + mi = g; + } +#if USE_PENALTY_EX + mi += fpenalty_ex_i; +#endif + +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=*mjpt + fpenalty) > wm ) + { + wm = g; + } +// if( (g=*prept) >= *mjpt ) + if( (g=*prept) > *mjpt ) // onaji hazu + { + *mjpt = g; + } +#if USE_PENALTY_EX + if( j < lgth2 ) // 2018/May/11 + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt++ += wm; + mjpt++; + prept++; + } + lastverticalw[i] = currentw[lgth2-1]; // lgth2==0 no toki error + } + +#if 0 + fprintf( stderr, "\n" ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); + fprintf( stderr, "wm (noalign) = %f\n", wm ); +#endif + + return( wm ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/JTT.c b/mafft/src/mafft-7.487-with-extensions/core/JTT.c new file mode 100644 index 0000000000..bdbd5faa32 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/JTT.c @@ -0,0 +1,244 @@ +#if 0 +#include "mltaln.h" +#endif +#define DEFAULTGOP_J -1530 +#define DEFAULTGEP_J -00 +#define DEFAULTOFS_J -123 /* +10 -- -50 teido ka ? */ +#define DEFAULTPAMN 200 + +void JTTmtx( double **rsr, double *freq, unsigned char locamino[26], char locgrp[26], int isTM ) +{ + int i, j; + double r[20][20]; +// char locamino0[] = "ARNDCQEGHILKMFPSTWYVBZX.-U"; + char locamino0[] = "ARNDCQEGHILKMFPSTWYVBZX.-J"; + char locgrp0[] = + { + 0, 3, 2, 2, 5, 2, 2, 0, 3, 1, 1, 3, 1, 4, 0, 0, 0, 4, 4, 1, 2, 2, + 6, 6, 6, 1, + }; + + double freq0[20] = + { + 0.077, + 0.051, + 0.043, + 0.052, + 0.020, + 0.041, + 0.062, + 0.074, + 0.023, + 0.052, + 0.091, + 0.059, + 0.024, + 0.040, + 0.051, + 0.069, + 0.059, + 0.014, + 0.032, + 0.066, + }; + double freq0_TM[20] = + { + 0.1051, + 0.0157, + 0.0185, + 0.0089, + 0.0219, + 0.0141, + 0.0097, + 0.0758, + 0.0168, + 0.1188, + 0.1635, + 0.0112, + 0.0333, + 0.0777, + 0.0260, + 0.0568, + 0.0523, + 0.0223, + 0.0324, + 0.1195, + }; + + /* Lower triangular is JTT's Accepted point mutations */ + r[ 1][ 0]= 247; + + r[ 2][ 0]= 216; r[ 2][ 1]= 116; + + r[ 3][ 0]= 386; r[ 3][ 1]= 48; r[ 3][ 2]= 1433; + + r[ 4][ 0]= 106; r[ 4][ 1]= 125; r[ 4][ 2]= 32; r[ 4][ 3]= 13; + + r[ 5][ 0]= 208; r[ 5][ 1]= 750; r[ 5][ 2]= 159; r[ 5][ 3]= 130; + r[ 5][ 4]= 9; + + r[ 6][ 0]= 600; r[ 6][ 1]= 119; r[ 6][ 2]= 180; r[ 6][ 3]= 2914; + r[ 6][ 4]= 8; r[ 6][ 5]= 1027; + + r[ 7][ 0]= 1183; r[ 7][ 1]= 614; r[ 7][ 2]= 291; r[ 7][ 3]= 577; + r[ 7][ 4]= 98; r[ 7][ 5]= 84; r[ 7][ 6]= 610; + + r[ 8][ 0]= 46; r[ 8][ 1]= 446; r[ 8][ 2]= 466; r[ 8][ 3]= 144; + r[ 8][ 4]= 40; r[ 8][ 5]= 635; r[ 8][ 6]= 41; r[ 8][ 7]= 41; + + r[ 9][ 0]= 173; r[ 9][ 1]= 76; r[ 9][ 2]= 130; r[ 9][ 3]= 37; + r[ 9][ 4]= 19; r[ 9][ 5]= 20; r[ 9][ 6]= 43; r[ 9][ 7]= 25; + r[ 9][ 8]= 26; + + r[10][ 0]= 257; r[10][ 1]= 205; r[10][ 2]= 63; r[10][ 3]= 34; + r[10][ 4]= 36; r[10][ 5]= 314; r[10][ 6]= 65; r[10][ 7]= 56; + r[10][ 8]= 134; r[10][ 9]= 1324; + + r[11][ 0]= 200; r[11][ 1]= 2348; r[11][ 2]= 758; r[11][ 3]= 102; + r[11][ 4]= 7; r[11][ 5]= 858; r[11][ 6]= 754; r[11][ 7]= 142; + r[11][ 8]= 85; r[11][ 9]= 75; r[11][10]= 94; + + r[12][ 0]= 100; r[12][ 1]= 61; r[12][ 2]= 39; r[12][ 3]= 27; + r[12][ 4]= 23; r[12][ 5]= 52; r[12][ 6]= 30; r[12][ 7]= 27; + r[12][ 8]= 21; r[12][ 9]= 704; r[12][10]= 974; r[12][11]= 103; + + r[13][ 0]= 51; r[13][ 1]= 16; r[13][ 2]= 15; r[13][ 3]= 8; + r[13][ 4]= 66; r[13][ 5]= 9; r[13][ 6]= 13; r[13][ 7]= 18; + r[13][ 8]= 50; r[13][ 9]= 196; r[13][10]= 1093; r[13][11]= 7; + r[13][12]= 49; + + r[14][ 0]= 901; r[14][ 1]= 217; r[14][ 2]= 31; r[14][ 3]= 39; + r[14][ 4]= 15; r[14][ 5]= 395; r[14][ 6]= 71; r[14][ 7]= 93; + r[14][ 8]= 157; r[14][ 9]= 31; r[14][10]= 578; r[14][11]= 77; + r[14][12]= 23; r[14][13]= 36; + + r[15][ 0]= 2413; r[15][ 1]= 413; r[15][ 2]= 1738; r[15][ 3]= 244; + r[15][ 4]= 353; r[15][ 5]= 182; r[15][ 6]= 156; r[15][ 7]= 1131; + r[15][ 8]= 138; r[15][ 9]= 172; r[15][10]= 436; r[15][11]= 228; + r[15][12]= 54; r[15][13]= 309; r[15][14]= 1138; + + r[16][ 0]= 2440; r[16][ 1]= 230; r[16][ 2]= 693; r[16][ 3]= 151; + r[16][ 4]= 66; r[16][ 5]= 149; r[16][ 6]= 142; r[16][ 7]= 164; + r[16][ 8]= 76; r[16][ 9]= 930; r[16][10]= 172; r[16][11]= 398; + r[16][12]= 343; r[16][13]= 39; r[16][14]= 412; r[16][15]= 2258; + + r[17][ 0]= 11; r[17][ 1]= 109; r[17][ 2]= 2; r[17][ 3]= 5; + r[17][ 4]= 38; r[17][ 5]= 12; r[17][ 6]= 12; r[17][ 7]= 69; + r[17][ 8]= 5; r[17][ 9]= 12; r[17][10]= 82; r[17][11]= 9; + r[17][12]= 8; r[17][13]= 37; r[17][14]= 6; r[17][15]= 36; + r[17][16]= 8; + + r[18][ 0]= 41; r[18][ 1]= 46; r[18][ 2]= 114; r[18][ 3]= 89; + r[18][ 4]= 164; r[18][ 5]= 40; r[18][ 6]= 15; r[18][ 7]= 15; + r[18][ 8]= 514; r[18][ 9]= 61; r[18][10]= 84; r[18][11]= 20; + r[18][12]= 17; r[18][13]= 850; r[18][14]= 22; r[18][15]= 164; + r[18][16]= 45; r[18][17]= 41; + + r[19][ 0]= 1766; r[19][ 1]= 69; r[19][ 2]= 55; r[19][ 3]= 127; + r[19][ 4]= 99; r[19][ 5]= 58; r[19][ 6]= 226; r[19][ 7]= 276; + r[19][ 8]= 22; r[19][ 9]= 3938; r[19][10]= 1261; r[19][11]= 58; + r[19][12]= 559; r[19][13]= 189; r[19][14]= 84; r[19][15]= 219; + r[19][16]= 526; r[19][17]= 27; r[19][18]= 42; + + + /* Upper triangular is JTT's Accepted point mutations for transmembrane */ + r[ 0][ 1]= 21; r[ 0][ 2]= 2; r[ 0][ 3]= 7; r[ 0][ 4]= 13; + r[ 0][ 5]= 4; r[ 0][ 6]= 6; r[ 0][ 7]= 160; r[ 0][ 8]= 6; + r[ 0][ 9]= 44; r[ 0][10]= 43; r[ 0][11]= 5; r[ 0][12]= 10; + r[ 0][13]= 21; r[ 0][14]= 34; r[ 0][15]= 198; r[ 0][16]= 202; + r[ 0][17]= 0; r[ 0][18]= 1; r[ 0][19]= 292; + + r[ 1][ 2]= 0; r[ 1][ 3]= 1; r[ 1][ 4]= 2; r[ 1][ 5]= 21; + r[ 1][ 6]= 3; r[ 1][ 7]= 22; r[ 1][ 8]= 21; r[ 1][ 9]= 4; + r[ 1][10]= 8; r[ 1][11]= 53; r[ 1][12]= 19; r[ 1][13]= 0; + r[ 1][14]= 1; r[ 1][15]= 5; r[ 1][16]= 5; r[ 1][17]= 28; + r[ 1][18]= 0; r[ 1][19]= 0; + + r[ 2][ 3]= 14; r[ 2][ 4]= 1; r[ 2][ 5]= 7; r[ 2][ 6]= 0; + r[ 2][ 7]= 0; r[ 2][ 8]= 8; r[ 2][ 9]= 4; r[ 2][10]= 5; + r[ 2][11]= 11; r[ 2][12]= 3; r[ 2][13]= 1; r[ 2][14]= 2; + r[ 2][15]= 32; r[ 2][16]= 19; r[ 2][17]= 1; r[ 2][18]= 1; + r[ 2][19]= 2; + + r[ 3][ 4]= 0; r[ 3][ 5]= 0; r[ 3][ 6]= 12; r[ 3][ 7]= 15; + r[ 3][ 8]= 4; r[ 3][ 9]= 1; r[ 3][10]= 0; r[ 3][11]= 2; + r[ 3][12]= 1; r[ 3][13]= 0; r[ 3][14]= 1; r[ 3][15]= 0; + r[ 3][16]= 6; r[ 3][17]= 0; r[ 3][18]= 1; r[ 3][19]= 4; + + r[ 4][ 5]= 0; r[ 4][ 6]= 0; r[ 4][ 7]= 13; r[ 4][ 8]= 2; + r[ 4][ 9]= 4; r[ 4][10]= 11; r[ 4][11]= 0; r[ 4][12]= 1; + r[ 4][13]= 34; r[ 4][14]= 0; r[ 4][15]= 48; r[ 4][16]= 13; + r[ 4][17]= 8; r[ 4][18]= 23; r[ 4][19]= 47; + + r[ 5][ 6]= 16; r[ 5][ 7]= 1; r[ 5][ 8]= 26; r[ 5][ 9]= 1; + r[ 5][10]= 16; r[ 5][11]= 6; r[ 5][12]= 3; r[ 5][13]= 0; + r[ 5][14]= 5; r[ 5][15]= 7; r[ 5][16]= 2; r[ 5][17]= 0; + r[ 5][18]= 0; r[ 5][19]= 0; + + r[ 6][ 7]= 21; r[ 6][ 8]= 0; r[ 6][ 9]= 0; r[ 6][10]= 0; + r[ 6][11]= 0; r[ 6][12]= 0; r[ 6][13]= 0; r[ 6][14]= 0; + r[ 6][15]= 4; r[ 6][16]= 2; r[ 6][17]= 0; r[ 6][18]= 0; + r[ 6][19]= 7; + + r[ 7][ 8]= 1; r[ 7][ 9]= 10; r[ 7][10]= 0; r[ 7][11]= 0; + r[ 7][12]= 3; r[ 7][13]= 4; r[ 7][14]= 7; r[ 7][15]= 64; + r[ 7][16]= 12; r[ 7][17]= 5; r[ 7][18]= 0; r[ 7][19]= 53; + + r[ 8][ 9]= 3; r[ 8][10]= 2; r[ 8][11]= 0; r[ 8][12]= 1; + r[ 8][13]= 0; r[ 8][14]= 0; r[ 8][15]= 0; r[ 8][16]= 4; + r[ 8][17]= 0; r[ 8][18]= 29; r[ 8][19]= 2; + + r[ 9][10]= 273; r[ 9][11]= 0; r[ 9][12]= 161; r[ 9][13]= 66; + r[ 9][14]= 4; r[ 9][15]= 22; r[ 9][16]= 150; r[ 9][17]= 1; + r[ 9][18]= 4; r[ 9][19]= 883; + + r[10][11]= 1; r[10][12]= 153; r[10][13]= 251; r[10][14]= 37; + r[10][15]= 43; r[10][16]= 26; r[10][17]= 20; r[10][18]= 6; + r[10][19]= 255; + + r[11][12]= 4; r[11][13]= 0; r[11][14]= 0; r[11][15]= 1; + r[11][16]= 2; r[11][17]= 0; r[11][18]= 5; r[11][19]= 1; + + r[12][13]= 8; r[12][14]= 0; r[12][15]= 1; r[12][16]= 32; + r[12][17]= 1; r[12][18]= 5; r[12][19]= 89; + + r[13][14]= 0; r[13][15]= 32; r[13][16]= 9; r[13][17]= 2; + r[13][18]= 54; r[13][19]= 37; + + r[14][15]= 9; r[14][16]= 10; r[14][17]= 0; r[14][18]= 1; + r[14][19]= 1; + + r[15][16]= 134; r[15][17]= 1; r[15][18]= 22; r[15][19]= 13; + + r[16][17]= 1; r[16][18]= 3; r[16][19]= 48; + + r[17][18]= 2; r[17][19]= 18; + + r[18][19]= 2; + + + + for (i = 0; i < 20; i++) r[i][i] = 0.0; + if( isTM ) + { + for (i = 1; i < 20; i++) for (j = 0; j < i; j++) + { + r[j][i] /= 400.0 * freq0_TM[i] * freq0_TM[j]; + r[i][j] = r[j][i]; + } + for( i=0; i<20; i++ ) freq[i] = freq0_TM[i]; + } + else + { + for (i = 1; i < 20; i++) for (j = 0; j < i; j++) + { + r[i][j] /= 400.0 * freq0[i] * freq0[j]; + r[j][i] = r[i][j]; + } + for( i=0; i<20; i++ ) freq[i] = freq0[i]; + } + + for( i=0; i<26; i++ ) locamino[i] = locamino0[i]; + for( i=0; i<26; i++ ) locgrp[(int)locamino[i]] = locgrp0[i]; + for( i=0; i<20; i++ ) for( j=0; j<20; j++ ) rsr[i][j] = r[i][j]; +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/Lalign11.c b/mafft/src/mafft-7.487-with-extensions/core/Lalign11.c new file mode 100644 index 0000000000..a67b30710b --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/Lalign11.c @@ -0,0 +1,1153 @@ +#include "mltaln.h" +#include "dp.h" + +#define DEBUG 0 +#define DEBUG2 0 +#define XXXXXXX 0 +#define USE_PENALTY_EX 1 + + +static TLS int localstop; // 060910 + +#if 1 +static void match_calc_mtx( double **mtx, double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + char *seq2 = s2[0]; + double *doubleptr = mtx[(unsigned char)s1[0][i1]]; + + while( lgth2-- ) + *match++ = doubleptr[(unsigned char)*seq2++]; +} +#else +static void match_calc( double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + int j; + + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } +#else + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } +#endif +} +#endif + +static double Ltracking( double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + int **ijp, int *off1pt, int *off2pt, int endi, int endj, + int *warpis, int *warpjs, int warpbase ) +{ + int i, j, l, iin, jin, lgth1, lgth2, k, limk; + int ifi=0, jfi=0; // by D.Mathog, a guess +// char gap[] = "-"; + char *gap; + gap = newgapstr; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + +#if 0 + for( i=0; i= warpbase ) + { +// fprintf( stderr, "WARP!\n" ); + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + + +#if 1 // sentou de warp? + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--mseq1[0] = seq1[0][l]; + *--mseq2[0] = *gap; + k++; + } + l= jin; + while( --l >= 0 ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][l]; + k++; + } + break; + } + else +#endif + { + l = iin - ifi; + while( --l > 0 ) + { + *--mseq1[0] = seq1[0][ifi+l]; + *--mseq2[0] = *gap; + k++; + } + l= jin - jfi; + while( --l > 0 ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][jfi+l]; + k++; + } + } + + + if( iin <= 0 || jin <= 0 ) break; + *--mseq1[0] = seq1[0][ifi]; + *--mseq2[0] = seq2[0][jfi]; + if( ijp[ifi][jfi] == localstop ) break; + k++; + iin = ifi; jin = jfi; + } + if( ifi == -1 ) *off1pt = 0; else *off1pt = ifi; + if( jfi == -1 ) *off2pt = 0; else *off2pt = jfi; + +// fprintf( stderr, "ifn = %d, jfn = %d\n", ifi, jfi ); +// fprintf( stderr, "\n" ); +// fprintf( stderr, "%s\n", mseq1[0] ); +// fprintf( stderr, "%s\n", mseq2[0] ); + + + return( 0.0 ); +} + + +double L__align11( double **n_dynamicmtx, double scoreoffset, char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ +// int k; + int i, j; + int lasti, lastj; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; +// static TLS int **intwork; +// static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double **amino_dynamicmtx = NULL; // ?? + double maxwm; + int endali = 0, endalj = 0; // by D.Mathog, a guess +// int endali, endalj; + double localthr = -offset + scoreoffset * 600; // 2013/12/13 + double localthr2 = -offset + scoreoffset * 600; // 2013/12/13 +// double localthr = -offset; +// double localthr2 = -offset; + double fpenalty = (double)penalty; + double fpenalty_ex = (double)penalty_ex; + double fpenalty_shift = (double)penalty_shift; + double fpenalty_tmp; // atode kesu + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + + + + if( seq1 == NULL ) + { + if( orlgth1 > 0 && orlgth2 > 0 ) + { + orlgth1 = 0; + orlgth2 = 0; + free( mseq1 ); + free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + + } + return( 0.0 ); + } + + + if( orlgth1 == 0 ) + { + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + } + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + + warpbase = lgth1 + lgth2; + warpis = NULL; + warpjs = NULL; + warpn = 0; + if( trywarp ) + { + wmrecords = AllocateFloatVec( lgth2+1 ); + warpi = AllocateIntVec( lgth2+1 ); + warpj = AllocateIntVec( lgth2+1 ); + prevwmrecords = AllocateFloatVec( lgth2+1 ); + prevwarpi = AllocateIntVec( lgth2+1 ); + prevwarpj = AllocateIntVec( lgth2+1 ); + for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + + +// FreeFloatMtx( doublework ); +// FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + +// doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); +// intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + amino_dynamicmtx = AllocateDoubleMtx( 0x100, 0x100 ); + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + + +#if 0 + for( i=0; i", wm ); +#endif +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=mi+fpenalty) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } + if( *prept > mi ) + { + mi = *prept; + mpi = j-1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=*mjpt+fpenalty) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } + if( *prept > *mjpt ) + { + *mjpt = *prept; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + *mjpt += fpenalty_ex; +#endif + + if( maxwm < wm ) + { + maxwm = wm; + endali = i; + endalj = j; + } +#if 1 + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f, localthr = %f\n", i, j, *curpt, localthr ); + *ijppt = localstop; + wm = localthr2; + } +#endif +#if 0 + fprintf( stderr, "%5.0f ", *curpt ); +#endif +#if 0 + fprintf( stderr, "wm (%d,%d) = %5.0f\n", i, j, wm ); +// fprintf( stderr, "%c-%c *ijppt = %d, localstop = %d\n", seq1[0][i], seq2[0][j], *ijppt, localstop ); +#endif + if( trywarp ) + { + fpenalty_tmp = fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ); +// fprintf( stderr, "fpenalty_shift = %f\n", fpenalty_tmp ); + +// fprintf( stderr, "\n\n\nwarp to %c-%c (%d-%d) from %c-%c (%d-%d) ? prevwmrecords[%d] = %f + %f <- wm = %f\n", seq1[0][prevwarpi[j-1]], seq2[0][prevwarpj[j-1]], prevwarpi[j-1], prevwarpj[j-1], seq1[0][i], seq2[0][j], i, j, j, prevwmrecords[j-1], fpenalty_tmp, wm ); +// if( (g=prevwmrecords[j-1] + fpenalty_shift )> wm ) + if( ( g=*prevwmrecordspt++ + fpenalty_tmp )> wm ) // naka ha osokute kamawanai + { +// fprintf( stderr, "Yes! Warp!! from %d-%d (%c-%c) to %d-%d (%c-%c) fpenalty_tmp = %f! warpn = %d\n", i, j, seq1[0][i], seq2[0][j-1], prevwarpi[j-1], prevwarpj[j-1],seq1[0][prevwarpi[j-1]], seq2[0][prevwarpj[j-1]], fpenalty_tmp, warpn ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + else + { + } + + curm = *curpt + wm; + +// fprintf( stderr, "###### curm = %f at %c-%c, i=%d, j=%d\n", curm, seq1[0][i], seq2[0][j], i, j ); + +// fprintf( stderr, "copy from i, j-1? %f > %f?\n", wmrecords[j-1], curm ); +// if( wmrecords[j-1] > wmrecords[j] ) + if( *wmrecords1pt > *wmrecordspt ) + { +// fprintf( stderr, "yes\n" ); +// wmrecords[j] = wmrecords[j-1]; + *wmrecordspt = *wmrecords1pt; +// warpi[j] = warpi[j-1]; +// warpj[j] = warpj[j-1]; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); +// fprintf( stderr, "warpi[j]=%d, warpj[j]=%d wmrecords[j] = %f\n", warpi[j], warpj[j], wmrecords[j] ); + } +// else +// { +// fprintf( stderr, "no\n" ); +// } + +// fprintf( stderr, " curm = %f at %c-%c\n", curm, seq1[0][i], seq2[0][j] ); +// fprintf( stderr, " wmrecords[%d] = %f\n", j, wmrecords[j] ); +// fprintf( stderr, "replace?\n" ); + +// if( curm > wmrecords[j] ) + if( curm > *wmrecordspt ) + { +// fprintf( stderr, "yes at %d-%d (%c-%c), replaced warp: warpi[j]=%d, warpj[j]=%d warpn=%d, wmrecords[j] = %f -> %f\n", i, j, seq1[0][i], seq2[0][j], i, j, warpn, wmrecords[j], curm ); +// wmrecords[j] = curm; + *wmrecordspt = curm; +// warpi[j] = i; +// warpj[j] = j; + *warpipt = i; + *warpjpt = j; + } +// else +// { +// fprintf( stderr, "No! warpi[j]=%d, warpj[j]=%d wmrecords[j] = %f\n", warpi[j], warpj[j], wmrecords[j] ); +// } +// fprintf( stderr, "%d-%d (%c-%c) curm = %5.0f, wmrecords[j]=%f\n", i, j, seq1[0][i], seq2[0][j], curm, wmrecords[j] ); + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + } +#if DEBUG2 + fprintf( stderr, "\n" ); +#endif + + lastverticalw[i] = currentw[lgth2-1]; + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + + } +// fprintf( stderr, "\nwm = %f\n", wm ); + if( trywarp ) + { +// if( warpn ) fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + +#if 0 + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, "endali = %d\n", endali ); + fprintf( stderr, "endalj = %d\n", endalj ); +#endif + + if( ijp[endali][endalj] == localstop ) + { + strcpy( seq1[0], "" ); + strcpy( seq2[0], "" ); + *off1pt = *off2pt = 0; + fprintf( stderr, "maxwm <- 0.0 \n" ); + return( 0.0 ); + } + + Ltracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, off1pt, off2pt, endali, endalj, warpis, warpjs, warpbase ); + if( warpis ) free( warpis ); + if( warpjs ) free( warpjs ); + + + resultlen = strlen( mseq1[0] ); + if( alloclen < resultlen || resultlen > N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + strcpy( seq1[0], mseq1[0] ); + strcpy( seq2[0], mseq2[0] ); + +#if 0 + fprintf( stderr, "wm=%f\n", wm ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); + + fprintf( stderr, "*off1pt = %d, *off2pt = %d\n", *off1pt, *off2pt ); + + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, " wm = %f\n", wm ); +#endif + + return( maxwm ); +} + + +double L__align11_noalign( double **n_dynamicmtx, char **seq1, char **seq2 ) +// warp mitaiou +{ +// int k; + int i, j; + int lasti, lastj; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; +// int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +#if 1 + double *wtmp; +// int *ijppt; + double *mjpt, *prept, *curpt; +// int *mpjpt; +#endif + static TLS double mi, *m; +// static TLS int **ijp; +// static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ +// static TLS char **mseq1; +// static TLS char **mseq2; +// static TLS char **mseq; +// static TLS int **intwork; +// static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double **amino_dynamicmtx = NULL; // ?? + double maxwm; +// int endali = 0, endalj = 0; // by D.Mathog, a guess +// int endali, endalj; + double localthr = -offset; + double localthr2 = -offset; +// double localthr = 100; +// double localthr2 = 100; + double fpenalty = (double)penalty; + double fpenalty_ex = (double)penalty_ex; + + if( seq1 == NULL ) + { + if( orlgth1 > 0 && orlgth2 > 0 ) + { + orlgth1 = 0; + orlgth2 = 0; +// free( mseq1 ); +// free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); +// FreeIntVec( mp ); + +// FreeCharMtx( mseq ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + + } + return( 0.0 ); + } + + +// if( orlgth1 == 0 ) +// { +// mseq1 = AllocateCharMtx( njob, 0 ); +// mseq2 = AllocateCharMtx( njob, 0 ); +// } + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + if( lgth1 > orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); +// FreeIntVec( mp ); + +// FreeCharMtx( mseq ); + + + +// FreeFloatMtx( doublework ); +// FreeIntMtx( intwork ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); +// mp = AllocateIntVec( ll2+2 ); + +// mseq = AllocateCharMtx( njob, ll1+ll2 ); + + +// doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); +// intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif +// amino_dynamicmtx = AllocateDoubleMtx( 0x80, 0x80 ); + amino_dynamicmtx = AllocateDoubleMtx( 0x100, 0x100 ); // 2017/Nov. constants.c no 'charsize' wo global hensuu nishita houga yoi? + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) +// { +// int ll1, ll2; +// +// if( commonAlloc1 && commonAlloc2 ) +// { +// FreeIntMtx( commonIP ); +// } +// +// ll1 = MAX( orlgth1, commonAlloc1 ); +// ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG +// fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + +// commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG +// fprintf( stderr, "succeeded\n\n" ); +#endif + +// commonAlloc1 = ll1; +// commonAlloc2 = ll2; +// } +// ijp = commonIP; + + +#if 0 + for( i=0; i", wm ); +#endif +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=mi+fpenalty) > wm ) + { + wm = g; +// *ijppt = -( j - mpi ); + } + if( *prept > mi ) + { + mi = *prept; +// mpi = j-1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( (g=*mjpt+fpenalty) > wm ) + { + wm = g; +// *ijppt = +( i - *mpjpt ); + } + if( *prept > *mjpt ) + { + *mjpt = *prept; +// *mpjpt = i-1; + } +#if USE_PENALTY_EX + *mjpt += fpenalty_ex; +#endif + + if( maxwm < wm ) + { + maxwm = wm; +// endali = i; +// endalj = j; + } +#if 1 + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); +// *ijppt = localstop; + wm = localthr2; + } +#endif +#if 0 + fprintf( stderr, "%5.0f ", *curpt ); +#endif +#if DEBUG2 + fprintf( stderr, "%5.0f ", wm ); +// fprintf( stderr, "%c-%c *ijppt = %d, localstop = %d\n", seq1[0][i], seq2[0][j], *ijppt, localstop ); +#endif + + *curpt++ += wm; +// ijppt++; + mjpt++; + prept++; +// mpjpt++; + } +#if DEBUG2 + fprintf( stderr, "\n" ); +#endif + + lastverticalw[i] = currentw[lgth2-1]; + } + + +#if 0 + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, "endali = %d\n", endali ); + fprintf( stderr, "endalj = %d\n", endalj ); +#endif + + +#if 0 // IRUKAMO!!!! + if( ijp[endali][endalj] == localstop ) + { + strcpy( seq1[0], "" ); + strcpy( seq2[0], "" ); + *off1pt = *off2pt = 0; + fprintf( stderr, "maxwm <- 0.0 \n" ); + return( 0.0 ); + } +#else + if( maxwm < localthr ) + { + fprintf( stderr, "maxwm <- 0.0 \n" ); + return( 0.0 ); + } +#endif + +// Ltracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, off1pt, off2pt, endali, endalj ); + + +// resultlen = strlen( mseq1[0] ); +// if( alloclen < resultlen || resultlen > N ) +// { +// fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); +// ErrorExit( "LENGTH OVER!\n" ); +// } + + +// strcpy( seq1[0], mseq1[0] ); +// strcpy( seq2[0], mseq2[0] ); + +#if 0 + fprintf( stderr, "wm=%f\n", wm ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); + + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, " wm = %f\n", wm ); +#endif + + return( maxwm ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/Lalignmm.c b/mafft/src/mafft-7.487-with-extensions/core/Lalignmm.c new file mode 100644 index 0000000000..4346bf1a73 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/Lalignmm.c @@ -0,0 +1,2563 @@ +#include "mltaln.h" +#include "dp.h" + +#define MEMSAVE 1 + +#define DEBUG 0 +#define USE_PENALTY_EX 0 +#define STOREWM 1 + +#define DPTANNI 10 + +#define LOCAL 0 + +static int reccycle = 0; + +static double localthr; + +static void match_ribosum( double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; + double scarr[38]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *matchpt; + double **cpmxpdpt; + int **cpmxpdnpt; + int cpkd; + + if( initialize ) + { + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; + } +#else + matchpt = match; + cpmxpdnpt = cpmxpdn; + cpmxpdpt = cpmxpd; + while( lgth2-- ) + { + *matchpt = 0.0; + for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) + *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; + matchpt++; + cpmxpdnpt++; + cpmxpdpt++; + } +#endif +} + +static void match_calc( double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *matchpt; + double **cpmxpdpt; + int **cpmxpdnpt; + int cpkd; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + + if( initialize ) + { + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; + } +#else + matchpt = match; + cpmxpdnpt = cpmxpdn; + cpmxpdpt = cpmxpd; + while( lgth2-- ) + { + *matchpt = 0.0; + for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) + *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; + matchpt++; + cpmxpdnpt++; + cpmxpdpt++; + } +#endif + free( scarr ); +} + +#if 0 +static void match_add( double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; + double scarr[nalphabets]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *matchpt; + double **cpmxpdpt; + int **cpmxpdnpt; + int cpkd; + + + if( initialize ) + { + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; + } +#else + matchpt = match; + cpmxpdnpt = cpmxpdn; + cpmxpdpt = cpmxpd; + while( lgth2-- ) + { +// *matchpt = 0.0; // add dakara + for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) + *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; + matchpt++; + cpmxpdnpt++; + cpmxpdpt++; + } +#endif +} +#endif + +#if 0 +static double Atracking( + char **seq1, char **seq2, + char **mseq1, char **mseq2, + int **ijp, int icyc, int jcyc, + int ist, int ien, int jst, int jen ) +{ + int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, klim; + char *gaptable1, *gt1bk; + char *gaptable2, *gt2bk; + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + + gt1bk = AllocateCharVec( lgth1+lgth2+1 ); + gt2bk = AllocateCharVec( lgth1+lgth2+1 ); + +#if 0 + for( i=0; i 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + + } + + for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1]; +// g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j]; +// g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1]; +// g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = +( i - *mpjpt ); + } + + + g = *prept + ogcp1[i]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif +#if LOCAL + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + wm = 0; + } +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + + +#if STOREWM + WMMTX[i][j] = *curpt; + WMMTX2[i][j] = *mjpt; +#endif + + if( i == imid ) //muda + { + jumpbackj[j] = *mpjpt; // muda atode matomeru + jumpbacki[j] = mpi; // muda atode matomeru +// fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); +// fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); + midw[j] = *curpt; + midm[j] = *mjpt; + midn[j] = mi; + } + +// fprintf( stderr, "m[%d] = %f\n", j, m[j] ); + mjpt++; + prept++; + mpjpt++; + curpt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + +#if STOREWM + WMMTX2[i][lgth2] = m[lgth2-1]; +#endif + +#if 0 // ue + if( i == imid ) + { + for( j=0; j0; --j ) + { + m[j-1] = currentw[j] + fgcp2[lgth2-2]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } + +// for( j=0; j=imid; i-- ) + firstm = -9999999.9; + firstmp = lgth1-1; + for( i=lgth1-2; i>-1; i-- ) + { + wtmp = previousw; + previousw = currentw; + currentw = wtmp; + previousw[lgth2-1] = initverticalw[i+1]; +// match_calc( currentw, seq1, seq2, i, lgth2 ); + match_ribosum( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); + + currentw[lgth2-1] = initverticalw[i]; + +// m[lgth2] = fgcp1[i]; +// WMMTX2[i][lgth2] += m[lgth2]; +// fprintf( stderr, "m[] = %f\n", m[lgth2] ); + + mi = previousw[lgth2-1] + fgcp2[lgth2-2]; +// mi = previousw[lgth2-1]; + mpi = lgth2 - 1; + + mjpt = m + lgth2 - 2; + prept = previousw + lgth2 - 1; + curpt = currentw + lgth2 - 2; + mpjpt = mp + lgth2 - 2; + + + for( j=lgth2-2; j>-1; j-- ) + { + wm = *prept; + ijpi = i+1; + ijpj = j+1; + + g = mi + ogcp2[j+1]; +// g = mi + fpenalty; + if( g > wm ) + { + wm = g; + ijpj = mpi; + ijpi = i+1; + } + + g = *prept + fgcp2[j]; +// g = *prept; + if( g >= mi ) + { +// fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); + mi = g; + mpi = j + 1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); + g = *mjpt + ogcp1[i+1]; +// g = *mjpt + fpenalty; + if( g > wm ) + { + wm = g; + ijpi = *mpjpt; + ijpj = j+1; + } + +// if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); + g = *prept + fgcp1[i]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i + 1; + } + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + + if( i == jumpi || i == imid - 1 ) + { + jumpforwi[j] = ijpi; //muda + jumpforwj[j] = ijpj; //muda +// fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); +// fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); + } + if( i == imid ) // muda + { + midw[j] += wm; +// midm[j+1] += *mjpt + fpenalty; //?????? + midm[j+1] += *mjpt; //?????? + } + if( i == imid - 1 ) + { +// midn[j] += mi + fpenalty; //???? + midn[j] += mi; //???? + } +#if LOCAL + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + wm = 0; + } +#endif + +#if STOREWM + WMMTX[i][j] += wm; +// WMMTX2[i][j+1] += *mjpt + fpenalty; + WMMTX2[i][j] += *curpt; +#endif + *curpt += wm; + + mjpt--; + prept--; + mpjpt--; + curpt--; + } +// fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); + g = *prept + fgcp1[i]; + if( firstm < g ) + { + firstm = g; + firstmp = i + 1; + } +#if STOREWM +// WMMTX2[i][j+1] += firstm; +#endif + if( i == imid ) midm[j+1] += firstm; + + if( i == imid - 1 ) + { + maxwm = midw[1]; + jmid = 0; +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + for( j=2; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + for( j=0; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + + +// fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); + wm = midw[jmid]; + jumpi = imid-1; + jumpj = jmid-1; + if( jmid > 0 && midn[jmid-1] > wm ) //060413 + { + jumpi = imid-1; + jumpj = jumpbacki[jmid]; + wm = midn[jmid-1]; +// fprintf( stderr, "rejump (n)\n" ); + } + if( midm[jmid] > wm ) + { + jumpi = jumpbackj[jmid]; + jumpj = jmid-1; + wm = midm[jmid]; +// fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); + } + + +// fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); +// fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); +#if 0 + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "midn = \n" ); + for( j=0; j= lgth2 ) + { +// fprintf( stderr, "CHUI1!\n" ); + jumpi=imid-1; jmid=lgth2; + jumpj = lgth2-1; + } +#endif + else + { + imid = jumpforwi[jumpj]; + jmid = jumpforwj[jumpj]; + } +#if 0 + fprintf( stderr, "jumpi -> %d\n", jumpi ); + fprintf( stderr, "jumpj -> %d\n", jumpj ); + fprintf( stderr, "imid -> %d\n", imid ); + fprintf( stderr, "jmid -> %d\n", jmid ); +#endif + +#if STOREWM +// break; +#else + break; +#endif + } + } +#if 0 + jumpi=0; jumpj=0; + imid=lgth1-1; jmid=lgth2-1; + } +#endif + +// fprintf( stderr, "imid = %d, but jumpi = %d\n", imid, jumpi ); +// fprintf( stderr, "jmid = %d, but jumpj = %d\n", jmid, jumpj ); + +// for( j=0; j amino_dis['a']['g'] -1 ) + fprintf( stdout, "%d %d %8.1f", i, j, WMMTX[i][j] ); + if( WMMTX[i][j] == maxwm ) + fprintf( stdout, "selected \n" ); + else + fprintf( stdout, "\n" ); + } + fprintf( stdout, "\n" ); + } +#endif + +#if 0 + + fprintf( stderr, "jumpbacki = \n" ); + for( j=0; j N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } +#endif + + + +#if 0 + fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); + fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); + + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "jmid = %d\n", jmid ); +#endif + + + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + FreeFloatVec( midw ); + FreeFloatVec( midm ); + FreeFloatVec( midn ); + + FreeIntVec( jumpbacki ); + FreeIntVec( jumpbackj ); + FreeIntVec( jumpforwi ); + FreeIntVec( jumpforwj ); + FreeIntVec( jumpdummi ); + FreeIntVec( jumpdummj ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + +#if STOREWM + FreeFloatMtx( WMMTX ); + FreeFloatMtx( WMMTX2 ); +#endif + + return( value ); + +} +static double MSalignmm_rec( int icyc, int jcyc, double *eff1, double *eff2, char **seq1, char **seq2, double **cpmx1, double **cpmx2, int ist, int ien, int jst, int jen, int alloclen, char **mseq1, char **mseq2, int depth, double **gapinfo, double **map ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + double value = 0.0; + register int i, j; + char **aseq1, **aseq2; + int ll1, ll2; + int lasti, lastj, imid, jmid=0; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +#if USE_PENALTY_EX + double fpenalty_ex = (double)RNApenalty_ex; +#endif +// double fpenalty = (double)penalty; + double *wtmp; +// short *ijppt; + int *mpjpt; +// short **ijp; + int *mp; + int mpi; + double *mjpt, *prept, *curpt; + double mi; + double *m; + double *w1, *w2; +// double *match; + double *initverticalw; /* kufuu sureba iranai */ + double *lastverticalw; /* kufuu sureba iranai */ + int **intwork; + double **doublework; +// short **shortmtx; +#if STOREWM + double **WMMTX; + double **WMMTX2; +#endif + double *midw; + double *midm; + double *midn; + int lgth1, lgth2; + double maxwm = 0.0; + int *jumpforwi; + int *jumpforwj; + int *jumpbacki; + int *jumpbackj; + int *jumpdummi; //muda + int *jumpdummj; //muda + int jumpi, jumpj = 0; + char *gaps; + int ijpi, ijpj; + double *ogcp1; + double *fgcp1; + double *ogcp2; + double *fgcp2; + double firstm; + int firstmp; +#if 0 + static char ttt1[50000]; + static char ttt2[50000]; +#endif + + localthr = -offset + 500; // 0? + + ogcp1 = gapinfo[0] + ist; + fgcp1 = gapinfo[1] + ist; + ogcp2 = gapinfo[2] + jst; + fgcp2 = gapinfo[3] + jst; + + depth++; + reccycle++; + + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + +// if( lgth1 < 5 ) +// fprintf( stderr, "\nWARNING: lgth1 = %d\n", lgth1 ); +// if( lgth2 < 5 ) +// fprintf( stderr, "\nWARNING: lgth2 = %d\n", lgth2 ); +// + +#if 0 + fprintf( stderr, "==== MSalign (depth=%d, reccycle=%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, reccycle, ist, ien, jst, jen ); + strncpy( ttt1, seq1[0]+ist, lgth1 ); + strncpy( ttt2, seq2[0]+jst, lgth2 ); + ttt1[lgth1] = 0; + ttt2[lgth2] = 0; + fprintf( stderr, "seq1 = %s\n", ttt1 ); + fprintf( stderr, "seq2 = %s\n", ttt2 ); +#endif + if( lgth2 <= 0 ) // lgth1 <= 0 ha? + { +// fprintf( stderr, "\n\n==== jimei\n\n" ); +// exit( 1 ); + for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1]; +// g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j]; +// g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1]; +// g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = +( i - *mpjpt ); + } + + + g = *prept + ogcp1[i]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif +#if LOCAL + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + wm = 0; + } +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + + +#if STOREWM + WMMTX[i][j] = *curpt; + WMMTX2[i][j] = *mjpt; +#endif + + if( i == imid ) //muda + { + jumpbackj[j] = *mpjpt; // muda atode matomeru + jumpbacki[j] = mpi; // muda atode matomeru +// fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); +// fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); + midw[j] = *curpt; + midm[j] = *mjpt; + midn[j] = mi; + } + +// fprintf( stderr, "m[%d] = %f\n", j, m[j] ); + mjpt++; + prept++; + mpjpt++; + curpt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + +#if STOREWM + WMMTX2[i][lgth2] = m[lgth2-1]; +#endif + +#if 0 // ue + if( i == imid ) + { + for( j=0; j0; --j ) + { + m[j-1] = currentw[j] + fgcp2[lgth2-2]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } + +// for( j=0; j=imid; i-- ) + firstm = -9999999.9; + firstmp = lgth1-1; + for( i=lgth1-2; i>-1; i-- ) + { + wtmp = previousw; + previousw = currentw; + currentw = wtmp; + previousw[lgth2-1] = initverticalw[i+1]; +// match_calc( currentw, seq1, seq2, i, lgth2 ); + match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); + + currentw[lgth2-1] = initverticalw[i]; + +// m[lgth2] = fgcp1[i]; +// WMMTX2[i][lgth2] += m[lgth2]; +// fprintf( stderr, "m[] = %f\n", m[lgth2] ); + + mi = previousw[lgth2-1] + fgcp2[lgth2-2]; +// mi = previousw[lgth2-1]; + mpi = lgth2 - 1; + + mjpt = m + lgth2 - 2; + prept = previousw + lgth2 - 1; + curpt = currentw + lgth2 - 2; + mpjpt = mp + lgth2 - 2; + + + for( j=lgth2-2; j>-1; j-- ) + { + wm = *prept; + ijpi = i+1; + ijpj = j+1; + + g = mi + ogcp2[j+1]; +// g = mi + fpenalty; + if( g > wm ) + { + wm = g; + ijpj = mpi; + ijpi = i+1; + } + + g = *prept + fgcp2[j]; +// g = *prept; + if( g >= mi ) + { +// fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); + mi = g; + mpi = j + 1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); + g = *mjpt + ogcp1[i+1]; +// g = *mjpt + fpenalty; + if( g > wm ) + { + wm = g; + ijpi = *mpjpt; + ijpj = j+1; + } + +// if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); + g = *prept + fgcp1[i]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i + 1; + } + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + + if( i == jumpi || i == imid - 1 ) + { + jumpforwi[j] = ijpi; //muda + jumpforwj[j] = ijpj; //muda +// fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); +// fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); + } + if( i == imid ) // muda + { + midw[j] += wm; +// midm[j+1] += *mjpt + fpenalty; //?????? + midm[j+1] += *mjpt; //?????? + } + if( i == imid - 1 ) + { +// midn[j] += mi + fpenalty; //???? + midn[j] += mi; //???? + } +#if LOCAL + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + wm = 0; + } +#endif + +#if STOREWM + WMMTX[i][j] += wm; +// WMMTX2[i][j+1] += *mjpt + fpenalty; + WMMTX2[i][j] += *curpt; +#endif + *curpt += wm; + + mjpt--; + prept--; + mpjpt--; + curpt--; + } +// fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); + g = *prept + fgcp1[i]; + if( firstm < g ) + { + firstm = g; + firstmp = i + 1; + } +#if STOREWM +// WMMTX2[i][j+1] += firstm; +#endif + if( i == imid ) midm[j+1] += firstm; + + if( i == imid - 1 ) + { + maxwm = midw[1]; + jmid = 0; +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + for( j=2; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + for( j=0; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + + +// fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); + wm = midw[jmid]; + jumpi = imid-1; + jumpj = jmid-1; + if( jmid > 0 && midn[jmid-1] > wm ) //060413 + { + jumpi = imid-1; + jumpj = jumpbacki[jmid]; + wm = midn[jmid-1]; +// fprintf( stderr, "rejump (n)\n" ); + } + if( midm[jmid] > wm ) + { + jumpi = jumpbackj[jmid]; + jumpj = jmid-1; + wm = midm[jmid]; +// fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); + } + + +// fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); +// fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); +#if 0 + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "midn = \n" ); + for( j=0; j= lgth2 ) + { +// fprintf( stderr, "CHUI1!\n" ); + jumpi=imid-1; jmid=lgth2; + jumpj = lgth2-1; + } +#endif + else + { + imid = jumpforwi[jumpj]; + jmid = jumpforwj[jumpj]; + } +#if 0 + fprintf( stderr, "jumpi -> %d\n", jumpi ); + fprintf( stderr, "jumpj -> %d\n", jumpj ); + fprintf( stderr, "imid -> %d\n", imid ); + fprintf( stderr, "jmid -> %d\n", jmid ); +#endif + +#if STOREWM +// break; +#else + break; +#endif + } + } +#if 0 + jumpi=0; jumpj=0; + imid=lgth1-1; jmid=lgth2-1; + } +#endif + +// fprintf( stderr, "imid = %d, but jumpi = %d\n", imid, jumpi ); +// fprintf( stderr, "jmid = %d, but jumpj = %d\n", jmid, jumpj ); + +// for( j=0; j amino_dis['a']['g'] -1 ) + fprintf( stdout, "%d %d %8.1f", i, j, WMMTX[i][j] ); + if( WMMTX[i][j] == maxwm ) + fprintf( stdout, "selected \n" ); + else + fprintf( stdout, "\n" ); + } + fprintf( stdout, "\n" ); + } + exit( 1 ); +#endif + +#if 0 + + fprintf( stderr, "jumpbacki = \n" ); + for( j=0; j N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } +#endif + + + +#if 0 + fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); + fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); + + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "jmid = %d\n", jmid ); +#endif + + + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + FreeFloatVec( midw ); + FreeFloatVec( midm ); + FreeFloatVec( midn ); + + FreeIntVec( jumpbacki ); + FreeIntVec( jumpbackj ); + FreeIntVec( jumpforwi ); + FreeIntVec( jumpforwj ); + FreeIntVec( jumpdummi ); + FreeIntVec( jumpdummj ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + +#if STOREWM + FreeFloatMtx( WMMTX ); + FreeFloatMtx( WMMTX2 ); +#endif + + + free( gaps ); +#if MEMSAVE + free( aseq1 ); + free( aseq2 ); +#else + FreeCharMtx( aseq1 ); + FreeCharMtx( aseq2 ); +#endif + + return( value ); +} + + + +double Lalignmm_hmout( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, char *sgap1, char *sgap2, char *egap1, char *egap2, double **map ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ +// int k; + int i, j; + int ll1, ll2; + int lgth1, lgth2; + double wm = 0.0; /* int ?????? */ + char **mseq1; + char **mseq2; +// char **mseq; + double *ogcp1; + double *ogcp2; + double *fgcp1; + double *fgcp2; + double **cpmx1; + double **cpmx2; + double **gapinfo; +// double fpenalty; + double fpenalty = (double)RNApenalty; + int nglen1, nglen2; + + + + + +#if 0 + fprintf( stderr, "eff in SA+++align\n" ); + for( i=0; i%d of GROUP1\n", i ); + fprintf( stdout, "%s\n", seq1[i] ); + } + for( i=0; i%d of GROUP2\n", i ); + fprintf( stdout, "%s\n", seq2[i] ); + } + fflush( stdout ); +#endif + + wm = MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, 0, lgth1-1, 0, lgth2-1, alloclen, mseq1, mseq2, 0, gapinfo, map ); +#if DEBUG + fprintf( stderr, " seq1[0] = %s\n", seq1[0] ); + fprintf( stderr, " seq2[0] = %s\n", seq2[0] ); + fprintf( stderr, "mseq1[0] = %s\n", mseq1[0] ); + fprintf( stderr, "mseq2[0] = %s\n", mseq2[0] ); +#endif + +// fprintf( stderr, "wm = %f\n", wm ); + +#if 0 + + for( i=0; i%d of GROUP1\n", i ); + fprintf( stdout, "%s\n", seq1[i] ); + } + for( i=0; i%d of GROUP2\n", i ); + fprintf( stdout, "%s\n", seq2[i] ); + } + fflush( stdout ); +#endif + + wm = MSalign2m2m_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, 0, lgth1-1, 0, lgth2-1, alloclen, mseq1, mseq2, 0, gapinfo, map ); +#if DEBUG + fprintf( stderr, " seq1[0] = %s\n", seq1[0] ); + fprintf( stderr, " seq2[0] = %s\n", seq2[0] ); + fprintf( stderr, "mseq1[0] = %s\n", mseq1[0] ); + fprintf( stderr, "mseq2[0] = %s\n", mseq2[0] ); +#endif + +// fprintf( stderr, "wm = %f\n", wm ); + +#if 0 + + for( i=0; i0 ) + { + *--mseq1[0] = seq1[0][i+l--]; + *--mseq2[0] = *gap; + } + l= prevhitj - j - 1; + fprintf( stderr, "l=%d\n", l ); + while( l>0 ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][j+l--]; + } + if( i < 0 || j < 0 ) return; + *--mseq1[0] = seq1[0][i]; + *--mseq2[0] = seq2[0][j]; + fprintf( stderr, "added %c to mseq1, mseq1 = %s \n", seq1[0][i], mseq1[0] ); + fprintf( stderr, "added %c to mseq2, mseq2 = %s \n", seq2[0][j], mseq2[0] ); +} + +static void match_calc( double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + char tmpc = s1[0][i1]; + char *seq2 = s2[0]; + + while( lgth2-- ) + *match++ = amino_dis[(int)tmpc][(int)*seq2++]; +} + +static double Atracking( double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + double **cpmx1, double **cpmx2, + int **ijp ) +{ + int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, limk; +// char gap[] = "-"; + char *gap; + gap = newgapstr; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + +#if 0 + for( i=0; i 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + l = iin - ifi; + while( --l ) + { + *--mseq1[0] = seq1[0][ifi+l]; + *--mseq2[0] = *gap; + k++; + } + l= jin - jfi; + while( --l ) + { + *--mseq1[0] = *gap; + *--mseq2[0] = seq2[0][jfi+l]; + k++; + } + if( iin <= 0 || jin <= 0 ) break; + *--mseq1[0] = seq1[0][ifi]; + *--mseq2[0] = seq2[0][jfi]; + k++; + iin = ifi; jin = jfi; + } + return( 0.0 ); +} + +void backdp( double **WMMTX, double wmmax, double *maxinw, double *maxinh, int lgth1, int lgth2, int alloclen, double *w1, double *w2, double *initverticalw, double *m, int *mp, int iin, int jin, char **seq1, char **seq2, char **mseq1, char **mseq2 ) +{ + register int i, j; + int prevhiti, prevhitj; +// int lasti, lastj; + double g; + double fpenalty = (double)penalty; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; +#endif + double *currentw, *previousw, *wtmp; + double mi; + int mpi; + int *mpjpt; + double *mjpt, *prept, *curpt; + double wm = 0.0; + double forwwm; + + currentw = w1; + previousw = w2; + + match_calc( initverticalw, seq2, seq1, lgth2-1, lgth1 ); + match_calc( currentw, seq1, seq2, lgth1-1, lgth2 ); + + + prevhiti = iin; + prevhitj = jin; + fprintf( stderr, "prevhiti = %d, lgth1 = %d\n", prevhiti, lgth1 ); + fprintf( stderr, "prevhitj = %d, lgth2 = %d\n", prevhitj, lgth2 ); + extendmseq( mseq1, mseq2, seq1, seq2, prevhiti, prevhitj, lgth1, lgth2 ); + + for( i=0; i0; --j ) + { + m[j-1] = currentw[j]; + mp[j] = 0; // iranai + } + + for( j=0; j-1; i-- ) + { + wtmp = previousw; + previousw = currentw; + currentw = wtmp; + + previousw[lgth2-1] = initverticalw[i+1]; + + match_calc( currentw, seq1, seq2, i, lgth2 ); + +#if 0 + fprintf( stderr, "i=%d, currentw = \n", i ); + for( j=0; j-1; j-- ) + { + +// fprintf( stderr, "i,j=%d,%d %c-%c ", i, j, seq1[0][i], seq2[0][j] ); + wm = *prept; + g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + } + g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j+1; //iranai + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + } + g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; //iranai + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "*curpt = %5.0f \n", *curpt ); +#endif + +// forwwm = wm + MIN( maxinw[i], maxinh[j] ); + forwwm = wm + MIN( maxinw[i], maxinh[j] ); + WMMTX[i][j] = forwwm; + if( forwwm == wmmax && i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + FreeFloatVec( maxinw ); + FreeFloatVec( maxinh ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + maxinw = AllocateFloatVec( ll1+2 ); + + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + maxinh = AllocateFloatVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + mseq1[0] = mseq[0]; + mseq2[0] = mseq[1]; + + + if( orlgth1 > commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + FreeFloatMtx( WMMTX ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + WMMTX = AllocateFloatMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + + +#if 0 + for( i=0; i", wm ); +#endif + g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } + g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } + g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + + WMMTX[i][j] = *curpt; + + + if( j wmmax ) + { + wmmax = g; + iin = i; + jin = lgth2-1; + } + } + for( j=0; j wmmax ) + { + wmmax = g; + iin = lgth1-1; + jin = j; + } + } + + for( i=0; iMSres\n%s\n", mseq1[0] ); + fprintf( stderr, ">MSres\n%s\n", mseq2[0] ); +#endif + +#if 0 + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + strcpy( seq1[0], mseq1[0] ); + strcpy( seq2[0], mseq2[0] ); +#if 1 + fprintf( stderr, "\n" ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); +#endif + + + return( wm ); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/MSalignmm.c b/mafft/src/mafft-7.487-with-extensions/core/MSalignmm.c new file mode 100644 index 0000000000..a8a2cb9a2e --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/MSalignmm.c @@ -0,0 +1,4198 @@ +#include "mltaln.h" +#include "dp.h" + +#define MEMSAVE 1 + +#define DEBUG 0 +#define USE_PENALTY_EX 0 +#define FASTMATCHCALC 1 +#define STOREWM 0 + +#define DPTANNI 100 + +#define ATO 1 + +static TLS int reccycle = 0; + + +// [seq][alphabet] +static void match_calc_add( double **scoringmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *matchpt; + double **cpmxpdpt; + int **cpmxpdnpt; + int cpkd; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + if( initialize ) + { + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; + } +#else + matchpt = match; + cpmxpdnpt = cpmxpdn; + cpmxpdpt = cpmxpd; + while( lgth2-- ) + { +// *matchpt = 0.0; // add dakara + for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) + *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; + matchpt++; + cpmxpdnpt++; + cpmxpdpt++; + } +#endif + free( scarr ); +} + +#if 0 +// [seq][alphabet] +static void match_calc( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *matchpt; + double **cpmxpdpt; + int **cpmxpdnpt; + int cpkd; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + if( initialize ) + { + for( j=0; j -1 ) + *fpt2 += scarr[*ipt++] * *fpt++; + fpt2++,iptpt++,fptpt++; + } + } + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; + } +#else + matchpt = match; + cpmxpdnpt = cpmxpdn; + cpmxpdpt = cpmxpd; + while( lgth2-- ) + { + *matchpt = 0.0; + for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) + *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; + matchpt++; + cpmxpdnpt++; + cpmxpdpt++; + } +#endif + free( scarr ); +} +#endif + + +// [alphabet][seq] +static void match_calc_alphabet_seq( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int start2, int lgth2, double **doublework, int **intwork, int initialize ) +{ +#if FASTMATCHCALC +// fprintf( stderr, "\nmatch_calc... %d", i1 ); + int j, l, p; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *matchpt, *cpmxpdpt, **cpmxpdptpt; + int *cpmxpdnpt, **cpmxpdnptpt; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + +// reporterr( "lgth2=%d. j=%d-%d, p=%d-%d\n", lgth2, 0, lgth2, start2, start2+lgth2 ); + if( initialize ) + { + int count = 0; + for( j=0,p=start2; j-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l, p; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0,p=start2; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} + +static void createcpmxresult( double **cpmxresult, double eff1, double eff2, double **cpmx1, double **cpmx2, char *gaptable1, char *gaptable2 ) +{ + int i, j, p; + int alen = strlen( gaptable1 ); + +// reporterr( "eff1 = %f, eff2=%f\n", eff1, eff2 ); + +#if 1 // sukoshi osoi + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } +#if 0 + else if( jen == fulllen2-1 ) + { + fprintf( stderr, "searching lastverticalw\n" ); + wm = lastverticalw[0]; + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + } + else if( ien == fulllen1-1 ) + { + fprintf( stderr, "searching lasthorizontalw\n" ); + wm = lasthorizontalw[0]; + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } +#endif + + for( i=0; i 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + + } + + klim = gt1bk + lgth1+lgth2 - gaptable1; +// reporterr( "klim = %d, strlen=%d\n", klim, strlen( gaptable1 ) ); +// klim = strlen( gaptable1 ); + if( strchr( gaptable1, '-' ) ) + for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; + else headgapfreq1 = headgapfreq1_g; + if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; + else headgapfreq2 = headgapfreq2_g; + +#if STOREWM + char ttt1[10000], ttt2[10000]; +#endif + + + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + + +#if STOREWM + strncpy( ttt1, seq1[0]+ist, lgth1 ); ttt1[lgth1] = 0; + strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt2[lgth2] = 0; + + fprintf( stderr, "in _tanni ist,ien = %d,%d, lgth1=%d\n", ist, ien, lgth1 ); + fprintf( stderr, "in _tanni jst,jen = %d,%d, lgth2=%d\n", jst, jen, lgth2 ); + fprintf( stderr, "ttt1 = %s\n", ttt1 ); + fprintf( stderr, "ttt2 = %s\n", ttt2 ); +#endif + +#if 0 + fprintf( stderr, "in _tanni ist,ien = %d,%d, fulllen1=%d\n", ist, ien, fulllen1 ); + fprintf( stderr, "in _tanni jst,jen = %d,%d, fulllen2=%d\n", jst, jen, fulllen2 ); + fprintf( stderr, "in _tanni seq1[0] = %-*.*s\n", ien-ist+1, ien-ist+1, seq1[0]+ist ); + fprintf( stderr, "in _tanni seq2[0] = %-*.*s\n", jen-jst+1, jen-jst+1, seq2[0]+jst ); +#endif + + + ll1 = ( (int)(lgth1) ) + 100; + ll2 = ( (int)(lgth2) ) + 100; + +// aseq1 = AllocateCharMtx( icyc, 0 ); +// aseq2 = AllocateCharMtx( jcyc, 0 ); +// aseq1bk = AllocateCharMtx( icyc, lgth1+lgth2+100 ); +// aseq2bk = AllocateCharMtx( jcyc, lgth1+lgth2+100 ); +// for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1] * gapfreq1f[i]; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j] * gapfreq1f[i-1]; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } + g = *prept + ogcp1[i] * gapfreq2f[j-1]; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + + + ijppt++; + mjpt++; + prept++; + mpjpt++; + curpt++; + } + lastverticalw[i] = currentw[lgth2-1]; + } + +// fprintf( stderr, "wm = %f\n", wm ); + + gt1 = gt1bk = AllocateCharVec( ien-ist+jen-jst+3 ); + gt2 = gt2bk = AllocateCharVec( ien-ist+jen-jst+3 ); + + Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, icyc, jcyc, ist, ien, jst, jen, fulllen1, fulllen2, tailgp, >1, >2 ); + strcpy( mgt1, gt1 ); + strcpy( mgt2, gt2 ); + + +#if 0 + fprintf( stderr, "res after _tanni = %s\n", mseq1[0] ); + fprintf( stderr, "res after _tanni = %s\n", mseq2[0] ); + fprintf( stderr, "gt1 after _tanni = %s\n", gt1 ); + fprintf( stderr, "gt1 after _tanni = %s\n", gt2 ); +#endif + free( gt1bk ); + free( gt2bk ); + +// for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; + else headgapfreq1 = headgapfreq1_g; + if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; + else headgapfreq2 = headgapfreq2_g; + + depth++; + reccycle++; + + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + +// if( lgth1 < 5 ) +// fprintf( stderr, "\nWARNING: lgth1 = %d\n", lgth1 ); +// if( lgth2 < 5 ) +// fprintf( stderr, "\nWARNING: lgth2 = %d\n", lgth2 ); +// + + +#if STOREWM + fprintf( stderr, "==== MSalign (depth=%d, reccycle=%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, reccycle, ist, ien, jst, jen ); + strncpy( ttt1, seq1[0]+ist, lgth1 ); + strncpy( ttt2, seq2[0]+jst, lgth2 ); + ttt1[lgth1] = 0; + ttt2[lgth2] = 0; + fprintf( stderr, "seq1 = %s\n", ttt1 ); + fprintf( stderr, "seq2 = %s\n", ttt2 ); +#endif + if( lgth2 <= 0 ) // lgth1 <= 0 ha? + { +// fprintf( stderr, "\n\n==== jimei\n\n" ); +// exit( 1 ); + for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1] * gapfreq1f[i]; +// g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j] * gapfreq1f[i-1]; +// g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; +// g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = +( i - *mpjpt ); + } + + + g = *prept + ogcp1[i] * gapfreq2f[j-1]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + +#if STOREWM + WMMTX[i][j] = *curpt; + WMMTX2[i][j] = *mjpt; +#endif + + if( i == imid ) //muda + { + jumpbackj[j] = *mpjpt; // muda atode matomeru + jumpbacki[j] = mpi; // muda atode matomeru +// fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); +// fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); + midw[j] = *curpt; + midm[j] = *mjpt; + midn[j] = mi; + } + +// fprintf( stderr, "m[%d] = %f\n", j, m[j] ); + mjpt++; + prept++; + mpjpt++; + curpt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + +#if STOREWM + WMMTX2[i][lgth2] = m[lgth2-1]; +#endif + +#if 0 // ue + if( i == imid ) + { + for( j=0; j0; --j ) + { + m[j-1] = currentw[j] + fgcp2[lgth2-2]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } +#else + for( j=lgth2-1; j>-1; --j ) + { + m[j] = currentw[j+1] + fgcp1[lgth1-2] * gapfreq2f[j+1]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } +#endif + +// for( j=0; j=imid; i-- ) + firstm = -9999999.9; +// firstmp = lgth1-1; + firstmp = lgth1; + for( i=lgth1-2; i>-1; i-- ) + { +#ifdef enablemultithread +// fprintf( stderr, "chudan = %d, %d\n", *chudanpt, chudanref ); + if( chudanpt && *chudanpt != chudanref ) + { +// fprintf( stderr, "\n\n## CHUUDAN!!! kouhan\n" ); + *chudanres = 1; + freearrays_rec1 + ( + w1, w2, initverticalw, lastverticalw, midw, midm, midn, + jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, + m, mp, + doublework, intwork +#if STOREWM + , WMMTX, WMMTX2 +#endif + ); + freearrays_rec2( gaps, aseq1, aseq2 ); + return( -1.0 ); + } +#endif + wtmp = previousw; + previousw = currentw; + currentw = wtmp; + previousw[lgth2-1] = initverticalw[i+1]; +// match_calc( currentw, seq1, seq2, i, lgth2 ); +// match_calc( n_dynamicmtx, currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); + match_calc_alphabet_seq( n_dynamicmtx, currentw, cpmx1pt, cpmx2pt, ist+i, jst, lgth2, doublework, intwork, 0 ); + + currentw[lgth2-1] = initverticalw[i]; + +// m[lgth2] = fgcp1[i]; +// WMMTX2[i][lgth2] += m[lgth2]; +// fprintf( stderr, "m[] = %f\n", m[lgth2] ); + + mi = previousw[lgth2-1] + fgcp2[lgth2-2] * gapfreq1f[i+1]; +// mi = previousw[lgth2-1]; + mpi = lgth2 - 1; + + mjpt = m + lgth2 - 2; + prept = previousw + lgth2 - 1; + curpt = currentw + lgth2 - 2; + mpjpt = mp + lgth2 - 2; + + + for( j=lgth2-2; j>-1; j-- ) + { + wm = *prept; + ijpi = i+1; + ijpj = j+1; + + g = mi + ogcp2[j+1] * gapfreq1f[i]; +// g = mi + fpenalty; + if( g > wm ) + { + wm = g; + ijpj = mpi; + ijpi = i+1; + } + + g = *prept + fgcp2[j] * gapfreq1f[i+1]; +// g = *prept; + if( g >= mi ) + { +// fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); + mi = g; + mpi = j + 1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); + g = *mjpt + ogcp1[i+1] * gapfreq2f[j]; +// g = *mjpt + fpenalty; + if( g > wm ) + { + wm = g; + ijpi = *mpjpt; + ijpj = j+1; + } + +// if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); + g = *prept + fgcp1[i] * gapfreq2f[j+1]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i + 1; + } + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + + if( i == jumpi || i == imid - 1 ) + { + jumpforwi[j] = ijpi; //muda + jumpforwj[j] = ijpj; //muda +// fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); +// fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); + } + if( i == imid ) // muda + { + midw[j] += wm; +// midm[j+1] += *mjpt + fpenalty; //?????? + midm[j+1] += *mjpt; //?????? + } + if( i == imid - 1 ) + { +// midn[j] += mi + fpenalty; //???? + midn[j] += mi; //???? + } +#if STOREWM + WMMTX[i][j] += wm; +// WMMTX2[i][j+1] += *mjpt + fpenalty; + WMMTX2[i][j+1] += *mjpt; +#endif + *curpt += wm; + + mjpt--; + prept--; + mpjpt--; + curpt--; + } +// fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); + g = *prept + fgcp1[i]; + if( firstm < g ) + { + firstm = g; + firstmp = i + 1; + } +#if STOREWM + WMMTX2[i][j+1] += firstm; +#endif + if( i == imid ) midm[j+1] += firstm; + + + if( i == imid - 1 ) + { + maxwm = midw[1]; + jmid = 0; +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + for( j=2; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + for( j=0; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + + +// fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); + wm = midw[jmid]; + jumpi = imid-1; + jumpj = jmid-1; + if( jmid > 0 && midn[jmid-1] > wm ) //060413 + { + jumpi = imid-1; + jumpj = jumpbacki[jmid]; + wm = midn[jmid-1]; +// fprintf( stderr, "rejump (n)\n" ); + } + if( midm[jmid] > wm ) + { + jumpi = jumpbackj[jmid]; + jumpj = jmid-1; + wm = midm[jmid]; +// fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); + } + + +// fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); +// fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); +#if STOREWM + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "midn = \n" ); + for( j=0; j 100 ) // naze 100 + if( imid < firstmp-1 ) // naze 100 + { + jumpi = firstmp; + imid = firstmp+1; + } +#if 0 + else + { + jumpi = 0; + imid = 1; + } +#endif +#endif + } + +#if 0 + else if( jmid == lgth2 ) + { + fprintf( stderr, "CHUI1!\n" ); + jumpi=0; jumpj=0; + imid=jumpforwi[0]; jmid=lgth2-1; + } +#else // 060414 + else if( jmid >= lgth2 ) + { +// fprintf( stderr, "CHUI1!\n" ); + jumpi=imid-1; jmid=lgth2; + jumpj = lgth2-1; + } +#endif + else + { +// fprintf( stderr, "#### CHUI3!\n" ); + imid = jumpforwi[jumpj]; + jmid = jumpforwj[jumpj]; + if( imid == jumpi ) jumpi = imid-1; + } +#if 0 + fprintf( stderr, "jumpi -> %d\n", jumpi ); + fprintf( stderr, "jumpj -> %d\n", jumpj ); + fprintf( stderr, "imid -> %d\n", imid ); + fprintf( stderr, "jmid -> %d\n", jmid ); +#endif +// fprintf( stderr, "#### FINAL i=%d, jumpi N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } +#endif + + + +#if 0 + fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); + fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); + + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "jmid = %d\n", jmid ); +#endif + + freearrays_rec1 + ( + w1, w2, initverticalw, lastverticalw, midw, midm, midn, + jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, + m, mp, + doublework, intwork +#if STOREWM + , WMMTX, WMMTX2 +#endif + ); + + +// fprintf( stderr, "==== calling myself (first), depth=%d\n", depth ); +#if 0 + fprintf( stderr, "seq1[0] = %.*s\n", lgth1, seq1[0] ); + fprintf( stderr, "seq2[0] = %.*s\n", lgth2, seq2[0] ); +#endif + + value = MSalignmm_rec( n_dynamicmtx, icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1pt, cpmx2pt, ist, ist+jumpi, jst, jst+jumpj, alloclen, fulllen1, fulllen2, aseq1, aseq2, agt1, agt2, depth, gapinfo, NULL, 0, NULL, headgp, tailgp, headgapfreq1_g, headgapfreq2_g ); // chudan mada +#if 0 + reporterr( "length1=%d -> %d? %d?\n", lgth1, strlen(seq1[0]), strlen(aseq1[0]) ); + reporterr( "after first _rec\n" ); + if( strlen( aseq1[0] ) != strlen( agt1 ) ) reporterr( "WARNING\n" ); + fprintf( stderr, "aseq1[0] = %s\n", aseq1[0] ); + fprintf( stderr, "aseq2[0] = %s\n", aseq2[0] ); + fprintf( stderr, "agt1 = %s\n", agt1 ); + fprintf( stderr, "agt2 = %s\n", agt2 ); +#endif +#if MEMSAVE +#else + for( i=0; i 0 ) + { +// for( i=0; i 0 ) + { +// for( i=0; i 1 || maxwm - value > 1 ) + { + fprintf( stderr, "WARNING value = %f, but maxwm = %f\n", value, maxwm ); + for( i=0; i1-%d\n%s\n", i, mseq1[i] ); + fprintf( stderr, "%s\n", aseq1[i] ); + } + for( i=0; i2-%d\n%s\n", i, mseq2[i] ); + fprintf( stderr, "%s\n", aseq2[i] ); + } + +// exit( 1 ); + } + else + { + fprintf( stderr, "value = %.0f, maxwm = %.0f -> ok\n", value, maxwm ); + } +#endif + +#if MEMSAVE +#else + for( i=0; i%d of GROUP1\n", i ); + fprintf( stdout, "%s\n", seq1[i] ); + } + for( i=0; i%d of GROUP2\n", i ); + fprintf( stdout, "%s\n", seq2[i] ); + } + fflush( stdout ); +#endif + + wm = MSalignmm_rec( n_dynamicmtx, icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1pt, cpmx2pt, 0, lgth1-1, 0, lgth2-1, alloclen, lgth1, lgth2, mseq1, mseq2, mgt1, mgt2, 0, gapinfo, chudanpt, chudanref, chudanres, headgp, tailgp, headgapfreq1, headgapfreq2 ); +#ifdef enablemultithread + if( chudanres && *chudanres ) + { +// fprintf( stderr, "\n\n## CHUUDAN!!! relay\n" ); + *chudanres = 1; + freearrays( ogcp1, ogcp2, ogcp1o, ogcp2o, fgcp1, fgcp2, fgcp1o, fgcp2o, cpmx1, cpmx2, gapfreq1f, gapfreq2f, gapinfo, mseq1, mseq2, mgt1, mgt2 ); + return( -1.0 ); + } +#endif + + +#if 1 + if( cpmxresult ) + { + if( icyc + jcyc > 20 ) +// if( 0 ) +// if( 1 ) + { +#if 1 // marume gosa wo teigen suru tame + double totaleff1 = 0.0; + double totaleff2 = 0.0; + for( i=0; i0.001 || fabs(totaleff2-1.0)>0.001 ) + { + reporterr( "Warning: rounding error may be large. totaleff1 = %50.40f\n", totaleff1 ); + reporterr( "Warning: rounding error may be large. totaleff2 = %50.40f\n", totaleff2 ); + exit( 1 ); + } + totaleff1 = totaleff1 * orieff1 / (orieff1 + orieff2); + totaleff2 = totaleff2 * orieff2 / (orieff1 + orieff2); +#else + double totaleff1 = orieff1 / ( orieff1 + orieff2 ); + double totaleff2 = orieff2 / ( orieff1 + orieff2 ); +#endif + + + *cpmxresult = AllocateDoubleMtx( nalphabets+3, strlen( mgt1 )+1 ); // gapcount, opg, fng no bun de +3 + createcpmxresult( *cpmxresult, totaleff1, totaleff2, cpmx1pt, cpmx2pt, mgt1, mgt2 ); +#if ATO + creategapfreqresult( (*cpmxresult)[nalphabets], totaleff1, totaleff2, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); + createogresult( (*cpmxresult)[nalphabets+1], totaleff1, totaleff2, ogcp1o, ogcp2o, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); + createfgresult( (*cpmxresult)[nalphabets+2], totaleff1, totaleff2, fgcp1o, fgcp2o, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); +#endif + +#if 0 + reporterr( "\n" ); + for( j=0; j 0 ) headgapfreq1 = gapfreq1f[-1]; + else headgapfreq1 = headgapfreq1_g; + if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; + else headgapfreq2 = headgapfreq2_g; + +#if STOREWM + char ttt1[10000], ttt2[10000]; +#endif + + + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + +#if STOREWM + strncpy( ttt1, seq1[0]+ist, lgth1 ); ttt1[lgth1] = 0; + strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt2[lgth2] = 0; + + fprintf( stderr, "in _tanni ist,ien = %d,%d, lgth1=%d\n", ist, ien, lgth1 ); + fprintf( stderr, "in _tanni jst,jen = %d,%d, lgth2=%d\n", jst, jen, lgth2 ); + fprintf( stderr, "ttt1 = %s\n", ttt1 ); + fprintf( stderr, "ttt2 = %s\n", ttt2 ); +#endif + +#if 0 + fprintf( stderr, "in _tanni ist,ien = %d,%d, fulllen1=%d\n", ist, ien, fulllen1 ); + fprintf( stderr, "in _tanni jst,jen = %d,%d, fulllen2=%d\n", jst, jen, fulllen2 ); + fprintf( stderr, "in _tanni seq1[0] = %-*.*s\n", ien-ist+1, ien-ist+1, seq1[0]+ist ); + fprintf( stderr, "in _tanni seq2[0] = %-*.*s\n", jen-jst+1, jen-jst+1, seq2[0]+jst ); +#endif + + + ll1 = ( (int)(lgth1) ) + 100; + ll2 = ( (int)(lgth2) ) + 100; + +// aseq1 = AllocateCharMtx( icyc, 0 ); +// aseq2 = AllocateCharMtx( jcyc, 0 ); +// aseq1bk = AllocateCharMtx( icyc, lgth1+lgth2+100 ); +// aseq2bk = AllocateCharMtx( jcyc, lgth1+lgth2+100 ); +// for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1] * gapfreq1f[i]; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j] * gapfreq1f[i-1]; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } + g = *prept + ogcp1[i] * gapfreq2f[j-1]; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + + + ijppt++; + mjpt++; + prept++; + mpjpt++; + curpt++; + } + lastverticalw[i] = currentw[lgth2-1]; + } + +// fprintf( stderr, "wm = %f\n", wm ); + + Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, icyc, jcyc, ist, ien, jst, jen, fulllen1, fulllen2, tailgp, NULL, NULL ); +#if 0 + fprintf( stderr, "res in _tanni mseq1[0] = %s\n", mseq1[0] ); + fprintf( stderr, "res in _tanni mseq2[0] = %s\n", mseq2[0] ); +#endif + +// for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; + else headgapfreq1 = headgapfreq1_g; + if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; + else headgapfreq2 = headgapfreq2_g; + + depth++; + reccycle++; + + lgth1 = ien-ist+1; + lgth2 = jen-jst+1; + +// if( lgth1 < 5 ) +// fprintf( stderr, "\nWARNING: lgth1 = %d\n", lgth1 ); +// if( lgth2 < 5 ) +// fprintf( stderr, "\nWARNING: lgth2 = %d\n", lgth2 ); +// + + +#if STOREWM + fprintf( stderr, "==== MSalign (depth=%d, reccycle=%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, reccycle, ist, ien, jst, jen ); + strncpy( ttt1, seq1[0]+ist, lgth1 ); + strncpy( ttt2, seq2[0]+jst, lgth2 ); + ttt1[lgth1] = 0; + ttt2[lgth2] = 0; + fprintf( stderr, "seq1 = %s\n", ttt1 ); + fprintf( stderr, "seq2 = %s\n", ttt2 ); +#endif + if( lgth2 <= 0 ) // lgth1 <= 0 ha? + { +// fprintf( stderr, "\n\n==== jimei\n\n" ); +// exit( 1 ); + for( i=0; i", wm ); +#endif + g = mi + fgcp2[j-1] * gapfreq1f[i]; +// g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = -( j - mpi ); + } + g = *prept + ogcp2[j] * gapfreq1f[i-1]; +// g = *prept; + if( g >= mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + + g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; +// g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijppt = +( i - *mpjpt ); + } + + + g = *prept + ogcp1[i] * gapfreq2f[j-1]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + +#if STOREWM + WMMTX[i][j] = *curpt; + WMMTX2[i][j] = *mjpt; +#endif + + if( i == imid ) //muda + { + jumpbackj[j] = *mpjpt; // muda atode matomeru + jumpbacki[j] = mpi; // muda atode matomeru +// fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); +// fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); + midw[j] = *curpt; + midm[j] = *mjpt; + midn[j] = mi; + } + +// fprintf( stderr, "m[%d] = %f\n", j, m[j] ); + mjpt++; + prept++; + mpjpt++; + curpt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + +#if STOREWM + WMMTX2[i][lgth2] = m[lgth2-1]; +#endif + +#if 0 // ue + if( i == imid ) + { + for( j=0; j0; --j ) + { + m[j-1] = currentw[j] + fgcp2[lgth2-2]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } +#else + for( j=lgth2-1; j>-1; --j ) + { + m[j] = currentw[j+1] + fgcp1[lgth1-2] * gapfreq2f[j+1]; +// m[j-1] = currentw[j]; + mp[j] = lgth1-1; + } +#endif + +// for( j=0; j=imid; i-- ) + firstm = -9999999.9; +// firstmp = lgth1-1; + firstmp = lgth1; + for( i=lgth1-2; i>-1; i-- ) + { +#ifdef enablemultithread +// fprintf( stderr, "chudan = %d, %d\n", *chudanpt, chudanref ); + if( chudanpt && *chudanpt != chudanref ) + { +// fprintf( stderr, "\n\n## CHUUDAN!!! kouhan\n" ); + *chudanres = 1; + freearrays_rec1_variousdist + ( + w1, w2, initverticalw, lastverticalw, midw, midm, midn, + jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, + m, mp, + doublework, intwork +#if STOREWM + , WMMTX, WMMTX2 +#endif + ); + freearrays_rec2( gaps, aseq1, aseq2 ); + return( -1.0 ); + } +#endif + wtmp = previousw; + previousw = currentw; + currentw = wtmp; + previousw[lgth2-1] = initverticalw[i+1]; +#if 0 + match_calc( n_dynamicmtx, currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); +#else + fillzero( currentw, lgth2 ); + for( c=0; c-1; j-- ) + { + wm = *prept; + ijpi = i+1; + ijpj = j+1; + + g = mi + ogcp2[j+1] * gapfreq1f[i]; +// g = mi + fpenalty; + if( g > wm ) + { + wm = g; + ijpj = mpi; + ijpi = i+1; + } + + g = *prept + fgcp2[j] * gapfreq1f[i+1]; +// g = *prept; + if( g >= mi ) + { +// fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); + mi = g; + mpi = j + 1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); + g = *mjpt + ogcp1[i+1] * gapfreq2f[j]; +// g = *mjpt + fpenalty; + if( g > wm ) + { + wm = g; + ijpi = *mpjpt; + ijpj = j+1; + } + +// if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); + g = *prept + fgcp1[i] * gapfreq2f[j+1]; +// g = *prept; + if( g >= *mjpt ) + { + *mjpt = g; + *mpjpt = i + 1; + } + +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + + if( i == jumpi || i == imid - 1 ) + { + jumpforwi[j] = ijpi; //muda + jumpforwj[j] = ijpj; //muda +// fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); +// fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); + } + if( i == imid ) // muda + { + midw[j] += wm; +// midm[j+1] += *mjpt + fpenalty; //?????? + midm[j+1] += *mjpt; //?????? + } + if( i == imid - 1 ) + { +// midn[j] += mi + fpenalty; //???? + midn[j] += mi; //???? + } +#if STOREWM + WMMTX[i][j] += wm; +// WMMTX2[i][j+1] += *mjpt + fpenalty; + WMMTX2[i][j+1] += *mjpt; +#endif + *curpt += wm; + + mjpt--; + prept--; + mpjpt--; + curpt--; + } +// fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); + g = *prept + fgcp1[i]; + if( firstm < g ) + { + firstm = g; + firstmp = i + 1; + } +#if STOREWM + WMMTX2[i][j+1] += firstm; +#endif + if( i == imid ) midm[j+1] += firstm; + + + if( i == imid - 1 ) + { + maxwm = midw[1]; + jmid = 0; +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + for( j=2; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + for( j=0; j maxwm ) + { + jmid = j; + maxwm = wm; + } +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + } + +// if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); + + +// fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); + wm = midw[jmid]; + jumpi = imid-1; + jumpj = jmid-1; + if( jmid > 0 && midn[jmid-1] > wm ) //060413 + { + jumpi = imid-1; + jumpj = jumpbacki[jmid]; + wm = midn[jmid-1]; +// fprintf( stderr, "rejump (n)\n" ); + } + if( midm[jmid] > wm ) + { + jumpi = jumpbackj[jmid]; + jumpj = jmid-1; + wm = midm[jmid]; +// fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); + } + + +// fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); +// fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); +#if STOREWM + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "midn = \n" ); + for( j=0; j 100 ) // naze 100 + if( imid < firstmp-1 ) // naze 100 + { + jumpi = firstmp; + imid = firstmp+1; + } +#if 0 + else + { + jumpi = 0; + imid = 1; + } +#endif +#endif + } + +#if 0 + else if( jmid == lgth2 ) + { + fprintf( stderr, "CHUI1!\n" ); + jumpi=0; jumpj=0; + imid=jumpforwi[0]; jmid=lgth2-1; + } +#else // 060414 + else if( jmid >= lgth2 ) + { +// fprintf( stderr, "CHUI1!\n" ); + jumpi=imid-1; jmid=lgth2; + jumpj = lgth2-1; + } +#endif + else + { +// fprintf( stderr, "#### CHUI3!\n" ); + imid = jumpforwi[jumpj]; + jmid = jumpforwj[jumpj]; + if( imid == jumpi ) jumpi = imid-1; + } +#if 0 + fprintf( stderr, "jumpi -> %d\n", jumpi ); + fprintf( stderr, "jumpj -> %d\n", jumpj ); + fprintf( stderr, "imid -> %d\n", imid ); + fprintf( stderr, "jmid -> %d\n", jmid ); +#endif +// fprintf( stderr, "#### FINAL i=%d, jumpi N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } +#endif + + + +#if 0 + fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); + fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); + + fprintf( stderr, "imid = %d\n", imid ); + fprintf( stderr, "jmid = %d\n", jmid ); +#endif + + freearrays_rec1_variousdist + ( + w1, w2, initverticalw, lastverticalw, midw, midm, midn, + jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, + m, mp, + doublework, intwork +#if STOREWM + , WMMTX, WMMTX2 +#endif + ); + + +// fprintf( stderr, "==== calling myself (first)\n" ); + + value = MSalignmm_rec_variousdist( matrices, icyc, jcyc, seq1, seq2, cpmx1s, cpmx2s, ist, ist+jumpi, jst, jst+jumpj, alloclen, fulllen1, fulllen2, aseq1, aseq2, depth, gapinfo, NULL, 0, NULL, headgp, tailgp, headgapfreq1_g, headgapfreq2_g ); // chudan mada +#if 0 + fprintf( stderr, "aseq1[0] = %s\n", aseq1[0] ); + fprintf( stderr, "aseq2[0] = %s\n", aseq2[0] ); +#endif +#if MEMSAVE +#else + for( i=0; i 0 ) + { +// for( i=0; i 0 ) + { +// for( i=0; i 1 || maxwm - value > 1 ) + { + fprintf( stderr, "WARNING value = %f, but maxwm = %f\n", value, maxwm ); + for( i=0; i1-%d\n%s\n", i, mseq1[i] ); + fprintf( stderr, "%s\n", aseq1[i] ); + } + for( i=0; i2-%d\n%s\n", i, mseq2[i] ); + fprintf( stderr, "%s\n", aseq2[i] ); + } + +// exit( 1 ); + } + else + { + fprintf( stderr, "value = %.0f, maxwm = %.0f -> ok\n", value, maxwm ); + } +#endif + +#if MEMSAVE +#else + for( i=0; i%d of GROUP1\n", i ); + fprintf( stdout, "%s\n", seq1[i] ); + } + for( i=0; i%d of GROUP2\n", i ); + fprintf( stdout, "%s\n", seq2[i] ); + } + fflush( stdout ); +#endif + + wm = MSalignmm_rec_variousdist( matrices, icyc, jcyc, seq1, seq2, cpmx1s, cpmx2s, 0, lgth1-1, 0, lgth2-1, alloclen, lgth1, lgth2, mseq1, mseq2, 0, gapinfo, chudanpt, chudanref, chudanres, headgp, tailgp, headgapfreq1, headgapfreq2 ); +#ifdef enablemultithread + if( chudanres && *chudanres ) + { +// fprintf( stderr, "\n\n## CHUUDAN!!! relay\n" ); + *chudanres = 1; + freearrays_variousdist( ogcp1, ogcp2, fgcp1, fgcp2, cpmx1s, cpmx2s, gapfreq1f, gapfreq2f, gapinfo, mseq1, mseq2 ); + return( -1.0 ); + } +#endif + +#if 0 + fprintf( stderr, "\n" ); + fprintf( stderr, " seq1[0] = %s\n", seq1[0] ); + fprintf( stderr, " seq2[0] = %s\n", seq2[0] ); + fprintf( stderr, "mseq1[0] = %s\n", mseq1[0] ); + fprintf( stderr, "mseq2[0] = %s\n", mseq2[0] ); + fprintf( stderr, "\n" ); +#endif + +// fprintf( stderr, "wm = %f\n", wm ); + + + for( i=0; i univscript + +mafft: mafft.tmpl mltaln.h + sed "s:_LIBDIR:$(LIBDIR):" mafft.tmpl > mafft + +mafft-homologs.rb: mafft-homologs.tmpl +# cp mafft-homologs.tmpl mafft-homologs.rb + sed "s:_BINDIR:$(BINDIR):" mafft-homologs.tmpl > mafft-homologs.rb + +mafft-sparsecore.rb: mafft-sparsecore.tmpl +# cp mafft-sparsecore.tmpl mafft-sparsecore.rb + sed "s:_BINDIR:$(BINDIR):" mafft-sparsecore.tmpl > mafft-sparsecore.rb + +mltaln.h : functions.h + touch mltaln.h + +version : version.c mltaln.h + $(CC) -o $@ version.c $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +maffttext2hex : maffttext2hex.c + $(CC) -o $@ maffttext2hex.c $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +hex2maffttext : hex2maffttext.c + $(CC) -o $@ hex2maffttext.c $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +tbfast : $(OBJTBFAST) + $(CC) -o $@ $(OBJTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +nodepair : $(OBJNODPAIR) + $(CC) -o $@ $(OBJNODPAIR) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +addsingle : $(OBJADDSINGLE) + $(CC) -o $@ $(OBJADDSINGLE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +disttbfast : $(OBJDISTTBFAST) + $(CC) -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.so : $(OBJDISTTBFAST) + $(CC) -shared -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.dylib : $(OBJDISTTBFAST) + $(CC) -dynamiclib -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.dll : $(OBJDISTTBFAST) + $(CC) -shared -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +makedirectionlist : $(OBJMAKEDIRECTIONLIST) + $(CC) -o $@ $(OBJMAKEDIRECTIONLIST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +splittbfast : $(OBJSPLITTBFAST) + $(CC) -o $@ $(OBJSPLITTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +splitfromaln : $(OBJSPLITFROMALN) + $(CC) -o $@ $(OBJSPLITFROMALN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dummy : $(OBJDUMMY) + $(CC) -o $@ $(OBJDUMMY) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +setcore : $(OBJSETCORE) + $(CC) -o $@ $(OBJSETCORE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +countlen : $(OBJCOUNTLEN) + $(CC) -o $@ $(OBJCOUNTLEN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +seq2regtable : $(OBJSEQ2REGTABLE) + $(CC) -o $@ $(OBJSEQ2REGTABLE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +regtable2seq : $(OBJREGTABLE2SEQ) + $(CC) -o $@ $(OBJREGTABLE2SEQ) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +setdirection : $(OBJSETDIRECTION) + $(CC) -o $@ $(OBJSETDIRECTION) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +replaceu : $(OBJREPLACEU) + $(CC) -o $@ $(OBJREPLACEU) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +filter : $(OBJFILTER) + $(CC) -o $@ $(OBJFILTER) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +restoreu : $(OBJRESTOREU) + $(CC) -o $@ $(OBJRESTOREU) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +f2cl : $(OBJF2CL) + $(CC) -o $@ $(OBJF2CL) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mccaskillwrap : $(OBJMCCASKILLWRAP) + $(CC) -o $@ $(OBJMCCASKILLWRAP) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +contrafoldwrap : $(OBJCONTRAFOLDWRAP) + $(CC) -o $@ $(OBJCONTRAFOLDWRAP) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +pairlocalalign : $(OBJPAIRLOCALALIGN) + $(CC) -o $@ $(OBJPAIRLOCALALIGN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +pairash : $(OBJPAIRASH) + $(CC) -o $@ $(OBJPAIRASH) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +multi2hat3s : $(OBJMULTI2HAT3S) + $(CC) -o $@ $(OBJMULTI2HAT3S) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +getlag : $(OBJGETLAG) + $(CC) -o $@ $(OBJGETLAG) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +tditr : $(OBJTDITR) + $(CC) -o $@ $(OBJTDITR) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dvtditr : $(OBJDVTDITR) + $(CC) -o $@ $(OBJDVTDITR) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafft-profile : $(OBJGALN) + $(CC) -o $@ $(OBJGALN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +gapfill : $(OBJGAPFILL) + $(CC) -o $@ $(OBJGAPFILL) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast4 : $(OBJDNDFAST4) + $(CC) -o $@ $(OBJDNDFAST4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast5 : $(OBJDNDFAST5) + $(CC) -o $@ $(OBJDNDFAST5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast6 : $(OBJDNDFAST6) + $(CC) -o $@ $(OBJDNDFAST6) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast7 : $(OBJDNDFAST7) + $(CC) -o $@ $(OBJDNDFAST7) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndblast : $(OBJDNDBLAST) + $(CC) -o $@ $(OBJDNDBLAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast3 : $(OBJDNDFAST3) + $(CC) -o $@ $(OBJDNDFAST3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet : $(OBJTRIPLET) + $(CC) -o $@ $(OBJTRIPLET) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet3 : $(OBJTRIPLET3) + $(CC) -o $@ $(OBJTRIPLET3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet3 : $(OBJSEXTET3) + $(CC) -o $@ $(OBJSEXTET3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet4 : $(OBJSEXTET4) + $(CC) -o $@ $(OBJSEXTET4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet5 : $(OBJSEXTET5) + $(CC) -o $@ $(OBJSEXTET5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafft-distance : $(OBJDISTANCE) + $(CC) -o $@ $(OBJDISTANCE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet5 : $(OBJTRIPLET5) + $(CC) -o $@ $(OBJTRIPLET5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet6 : $(OBJTRIPLET6) + $(CC) -o $@ $(OBJTRIPLET6) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +octet4 : $(OBJOCTET4) + $(CC) -o $@ $(OBJOCTET4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndpre : $(OBJDNDPRE) + $(CC) -o $@ $(OBJDNDPRE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +score : $(OBJSCORE) + $(CC) -o $@ $(OBJSCORE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +genMtx : $(OBJGENMTX) + $(CC) -o $@ $(OBJGENMTX) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafftash_premafft.pl : mafftash_premafft.tmpl + cp mafftash_premafft.tmpl mafftash_premafft.pl + +seekquencer_premafft.pl : seekquencer_premafft.tmpl + cp seekquencer_premafft.tmpl seekquencer_premafft.pl + +gapfill.o : gapfill.c $(HEADER) + $(CC) $(MYCFLAGS) -c gapfill.c + +mltaln9.o : mltaln9.c $(HEADER) + $(CC) $(MYCFLAGS) -c mltaln9.c + +tddis.o : tddis.c $(HEADER) + $(CC) $(MYCFLAGS) -c tddis.c + +constants.o : constants.c miyata.h miyata5.h blosum.c DNA.h JTT.c $(HEADER) + $(CC) $(MYCFLAGS) -c constants.c + +defs.o : defs.c + $(CC) $(MYCFLAGS) -c defs.c + +#A+++alignmm.o : SA+++alignmm.c $(HEADER) +# $(CC) $(MYCFLAGS) -c SA+++alignmm.c -o A+++alignmm.o + +Salignmm.o : Salignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c Salignmm.c + +Dalignmm.o : Dalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c Dalignmm.c + +MSalignmm.o : MSalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c MSalignmm.c + +partSalignmm.o : partSalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c partSalignmm.c + +Lalign11.o : Lalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c Lalign11.c + +genalign11.o : genalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c genalign11.c + +suboptalign11.o : suboptalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c suboptalign11.c + +Galign11.o : Galign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c Galign11.c + +MSalign11.o : MSalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c MSalign11.c + +SAalignmm.o : SAalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c SAalignmm.c -o SAalignmm.o + +Lalignmm.o : Lalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c Lalignmm.c + +rna.o : rna.c $(HEADER) + $(CC) $(MYCFLAGS) -c rna.c + +disttbfast.o : disttbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c disttbfast.c + +splitfromaln.o : splitfromaln.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splitfromaln.c + +splittbfast.o : splittbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splittbfast.c + +splittbfast2.o : splittbfast2.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splittbfast2.c + +makedirectionlist.o : makedirectionlist.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c makedirectionlist.c + +disttbfast_dummy.o : disttbfast_dummy.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c disttbfast_dummy.c + +dummy.o : dummy.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c dummy.c + +tbfast.o : tbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c tbfast.c + +nodepair.o : nodepair.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c nodepair.c + +addsingle.o : addsingle.c $(HEADER) $(FFTHEADER) +addsingle.o : addsingle.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c addsingle.c + +tbfast2.o : tbfast2.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c tbfast2.c + +setcore.o : setcore.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c setcore.c + +getlag.o : getlag.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c getlag.c + +tditr.o : tditr.c $(HEADER) + $(CC) $(MYCFLAGS) -c tditr.c + +dvtditr.o : dvtditr.c $(HEADER) + $(CC) $(MYCFLAGS) -c dvtditr.c + +tditeration.o : tditeration.c $(HEADER) + $(CC) $(MYCFLAGS) -c tditeration.c + +mafft-profile.o : mafft-profile.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c mafft-profile.c + +dndfast4.o : dndfast4.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast4.c + +dndfast5.o : dndfast5.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast5.c + +dndfast6.o : dndfast6.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast6.c + +dndfast7.o : dndfast7.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast7.c + +dndblast.o : dndblast.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndblast.c + +dndfast3.o : dndfast3.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast3.c + +dndpre.o : dndpre.c $(HEADER) + $(CC) $(MYCFLAGS) -c dndpre.c + +countlen.o : countlen.c $(HEADER) + $(CC) $(MYCFLAGS) -c countlen.c + +seq2regtable.o : seq2regtable.c $(HEADER) + $(CC) $(MYCFLAGS) -c seq2regtable.c + +regtable2seq.o : regtable2seq.c $(HEADER) + $(CC) $(MYCFLAGS) -c regtable2seq.c + +f2cl.o : f2cl.c $(HEADER) + $(CC) $(MYCFLAGS) -c f2cl.c + +setdirection.o : setdirection.c $(HEADER) + $(CC) $(MYCFLAGS) -c setdirection.c + +replaceu.o : replaceu.c $(HEADER) + $(CC) $(MYCFLAGS) -c replaceu.c + +restoreu.o : restoreu.c $(HEADER) + $(CC) $(MYCFLAGS) -c restoreu.c + +mccaskillwrap.o : mccaskillwrap.c $(HEADER) + $(CC) $(MYCFLAGS) -c mccaskillwrap.c + +contrafoldwrap.o : contrafoldwrap.c $(HEADER) + $(CC) $(MYCFLAGS) -c contrafoldwrap.c + +pairlocalalign.o : pairlocalalign.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pairlocalalign.c + +pairlocalalignmain.o : pairlocalalignmain.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pairlocalalignmain.c + +pairash.o : pairash.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pairash.c + +multi2hat3s.o : multi2hat3s.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c multi2hat3s.c + +io.o : io.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c io.c + +nj.o : nj.c $(HEADER) + $(CC) $(MYCFLAGS) -c nj.c + +treeOperation.o : treeOperation.c $(HEADER) + $(CC) $(MYCFLAGS) -c treeOperation.c + +sextet5.o : sextet5.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c sextet5.c + +mafft-distance.o : mafft-distance.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c mafft-distance.c + +maffttext2hex.o : maffttext2hex.c + $(CC) $(MYCFLAGS) -c maffttext2hex.c + +hex2maffttext.o : hex2maffttext.c + $(CC) $(MYCFLAGS) -c hex2maffttext.c + +triplet6.o : triplet6.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c triplet6.c + +fft.o : fft.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c fft.c + +fftFunctions.o : fftFunctions.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c fftFunctions.c + +Falign.o : Falign.c $(HEADER) $(FFTHEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c Falign.c + +Falign_localhom.o : Falign_localhom.c $(HEADER) $(FFTHEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c Falign_localhom.c + +mtxutl.o : mtxutl.c + $(CC) $(MYCFLAGS) -c mtxutl.c + +addfunctions.o : addfunctions.c $(HEADER) + $(CC) $(MYCFLAGS) -c addfunctions.c + +score.o : score.c $(HEADER) + $(CC) $(MYCFLAGS) -c score.c + +clean : + rm -f *.o *.a *.exe *~ $(PERLPROGS) $(PROGS) $(SCRIPTS) $(SOS) $(DYLIBS) $(DLLS) *.gcda *.gcno $(DASH_CLIENT) +# rm -f ../binaries/* ../scripts/* + +install : all + mkdir -p $(DESTDIR)$(LIBDIR) + chmod 755 $(DESTDIR)$(LIBDIR) + mkdir -p $(DESTDIR)$(BINDIR) + chmod 755 $(DESTDIR)$(BINDIR) + chmod 755 $(SCRIPTS) + $(INSTALL) $(SCRIPTS) $(DESTDIR)$(BINDIR) + chmod 755 $(PROGS) ||: # in MinGW, it's ok if this fails +# $(INSTALL) -s $(PROGS) $(DESTDIR)$(LIBDIR) + $(STRIP) $(PROGS) ||: # may fail for dash_client on mac. + $(INSTALL) $(PROGS) $(DESTDIR)$(LIBDIR) + $(INSTALL) $(PERLPROGS) $(DESTDIR)$(LIBDIR) + $(INSTALL) -m 644 $(MANPAGES) $(DESTDIR)$(LIBDIR) + + ( cd $(DESTDIR)$(BINDIR); \ +rm -f linsi ginsi einsi fftns fftnsi nwns nwnsi xinsi qinsi; \ +rm -f mafft-linsi mafft-ginsi mafft-einsi mafft-fftns mafft-fftnsi mafft-nwns mafft-nwnsi mafft-xinsi mafft-qinsi mafft-randomcore.rb ; \ +ln -s mafft linsi; ln -s mafft ginsi; ln -s mafft fftns; \ +ln -s mafft fftnsi; ln -s mafft nwns; ln -s mafft nwnsi; \ +ln -s mafft einsi; \ +ln -s mafft mafft-linsi; ln -s mafft mafft-ginsi; ln -s mafft mafft-fftns; \ +ln -s mafft mafft-fftnsi; ln -s mafft mafft-nwns; ln -s mafft mafft-nwnsi; \ +ln -s mafft mafft-einsi; ln -s mafft mafft-xinsi; ln -s mafft mafft-qinsi;\ +rm -f mafft-profile mafft-profile.exe; ln -s $(LIBDIR)/mafft-profile .; \ +rm -f mafft-distance mafft-distance.exe; ln -s $(LIBDIR)/mafft-distance . ) + + mkdir -p $(DESTDIR)$(MANDIR) + chmod 755 $(DESTDIR)$(MANDIR) + $(INSTALL) -m 644 $(MANPAGES) $(DESTDIR)$(MANDIR) +# remove incorrectly installed manpages by previous versions +# rm -f /usr/local/man/man1/mafft.1 /usr/local/man/man1/mafft-homologs.1 diff --git a/mafft/src/mafft-7.487-with-extensions/core/Makefile.sos b/mafft/src/mafft-7.487-with-extensions/core/Makefile.sos new file mode 100644 index 0000000000..c0ce323f63 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/Makefile.sos @@ -0,0 +1,545 @@ +PREFIX = /usr/local +LIBDIR = $(PREFIX)/libexec/mafft +BINDIR = $(PREFIX)/bin +MANDIR = $(PREFIX)/share/man/man1 + +#MNO_CYGWIN = -mno-cygwin + +ENABLE_MULTITHREAD = -Denablemultithread +# Comment out the above line if your compiler +# does not support TLS (thread-local strage). + +CC = gcc +#CFLAGS = -O3 +#CFLAGS = -O3 -fPIC +# add -fPIC when building .so files + +#CC = icc +#CFLAGS = -fast +# if you have icc, use this. + +#CFLAGS = -O0 -fPIC -pedantic -Wall -std=c99 -g -pg -DMALLOC_CHECK_=3 +CFLAGS = -fPIC -O0 -fPIC -pedantic -Wall -std=c99 -g -DMALLOC_CHECK_=3 # for shark, valgrind + + +MYCFLAGS = $(MNO_CYGWIN) $(ENABLE_MULTITHREAD) $(CFLAGS) + +ifdef ENABLE_MULTITHREAD +LIBS = -lm -lpthread +else +LIBS = -lm +endif + +INSTALL = install + +PROGS = dvtditr dndfast7 dndblast sextet5 mafft-distance pairlocalalign \ + pair2hat3s multi2hat3s pairash addsingle \ + splittbfast disttbfast tbfast mafft-profile f2cl mccaskillwrap contrafoldwrap countlen \ + seq2regtable regtable2seq score getlag dndpre setcore replaceu restoreu setdirection makedirectionlist version +SOS = libdisttbfast.so +DLLS = libdisttbfast.dll +DYLIBS = libdisttbfast.dylib + +PERLPROGS = mafftash_premafft.pl seekquencer_premafft.pl +SCRIPTS = mafft mafft-homologs.rb +OBJSETDIRECTION = mtxutl.o io.o setdirection.o defs.o mltaln9.o +OBJREPLACEU = mtxutl.o io.o replaceu.o defs.o mltaln9.o +OBJRESTOREU = mtxutl.o io.o restoreu.o defs.o mltaln9.o +OBJREGTABLE2SEQ = mtxutl.o io.o regtable2seq.o defs.o mltaln9.o +OBJSEQ2REGTABLE = mtxutl.o io.o seq2regtable.o defs.o +OBJCOUNTLEN = mtxutl.o io.o countlen.o defs.o +OBJF2CL = mtxutl.o io.o f2cl.o constants.o defs.o +OBJMCCASKILLWRAP = mtxutl.o io.o mccaskillwrap.o constants.o defs.o mltaln9.o +OBJCONTRAFOLDWRAP = mtxutl.o io.o contrafoldwrap.o constants.o defs.o mltaln9.o +OBJMULTI2HAT3S = mtxutl.o io.o mltaln9.o tddis.o constants.o \ + multi2hat3s.o defs.o fft.o fftFunctions.o +OBJPAIR2HAT3S = mtxutl.o io.o mltaln9.o tddis.o constants.o \ + pair2hat3s.o defs.o fft.o fftFunctions.o +OBJPAIRASH = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o MSalignmm.o Galign11.o MSalign11.o suboptalign11.o genalign11.o Lalign11.o SAalignmm.o \ + pairash.o defs.o fft.o fftFunctions.o +OBJPAIRLOCALALIGN = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o MSalignmm.o Galign11.o MSalign11.o suboptalign11.o genalign11.o Lalign11.o SAalignmm.o \ + pairlocalalign.o defs.o fft.o fftFunctions.o +OBJDUMMY = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + disttbfast_dummy.o dummy.o defs.o fft.o fftFunctions.o +OBJSPLITFROMALN = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + Lalign11.o splitfromaln.o defs.o fft.o fftFunctions.o +OBJSPLITTBFAST = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + Lalign11.o splittbfast.o defs.o fft.o fftFunctions.o +OBJSPLITTBFAST2 = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + Lalign11.o splittbfast2.o defs.o fft.o fftFunctions.o +OBJSPLITTBFASTP = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + Lalign11.o defs.o fft.o fftFunctions.o +OBJDISTTBFAST = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + disttbfast.o defs.o fft.o fftFunctions.o addfunctions.o +OBJMAKEDIRECTIONLIST = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + Lalign11.o makedirectionlist.o defs.o fft.o fftFunctions.o addfunctions.o +OBJTBFAST = mtxutl.o io.o mltaln9.o tddis.o constants.o MSalignmm.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o \ + tbfast.o defs.o fft.o fftFunctions.o addfunctions.o +OBJADDSINGLE = mtxutl.o io.o mltaln9.o tddis.o constants.o MSalignmm.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o \ + addsingle.o defs.o fft.o fftFunctions.o addfunctions.o +OBJTBFAST2 = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o MSalignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o \ + tbfast2.o defs.o fft.o fftFunctions.o +OBJSETCORE = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + setcore.o defs.o fft.o fftFunctions.o +OBJTDITR = mtxutl.o io.o mltaln9.o tddis.o constants.o nj.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o fftFunctions.o fft.o \ + tditeration.o tditr.o defs.o SAalignmm.o treeOperation.o +OBJDVTDITR = mtxutl.o io.o mltaln9.o tddis.o constants.o nj.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o MSalignmm.o fftFunctions.o fft.o \ + tditeration.o dvtditr.o defs.o SAalignmm.o treeOperation.o addfunctions.o +OBJGETLAG = mtxutl.o io.o mltaln9.o tddis.o constants.o partSalignmm.o Lalignmm.o rna.o Salignmm.o \ + Falign.o Falign_localhom.o Galign11.o SAalignmm.o MSalignmm.o \ + getlag.o defs.o fft.o fftFunctions.o +OBJGAPFILL = mtxutl.o io.o constants.o gapfill.o defs.o +OBJDNDFAST5 = dndfast5.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJDNDBLAST = dndblast.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJDNDFAST7 = dndfast7.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJDNDFAST6 = dndfast6.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJDNDFAST4 = dndfast4.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJDNDFAST6 = dndfast6.o io.o constants.o mtxutl.o mltaln9.o tddis.o defs.o +OBJSEXTET5 = io.o constants.o mtxutl.o mltaln9.o tddis.o sextet5.o defs.o +OBJDISTANCE = io.o constants.o mtxutl.o mltaln9.o tddis.o mafft-distance.o defs.o +OBJTRIPLET6 = io.o constants.o mtxutl.o mltaln9.o tddis.o triplet6.o defs.o +OBJTRIPLET5 = io.o constants.o mtxutl.o mltaln9.o tddis.o triplet5.o defs.o +OBJOCTET4 = io.o constants.o mtxutl.o mltaln9.o tddis.o octet4.o defs.o +OBJDNDPRE = dndpre.o io.o constants.o mtxutl.o mltaln9.o defs.o +OBJGALN = io.o mtxutl.o mltaln9.o tddis.o constants.o partSalignmm.o MSalignmm.o Lalignmm.o rna.o Salignmm.o \ + SAalignmm.o Galign11.o Falign.o Falign_localhom.o fftFunctions.o fft.o mafft-profile.o defs.o +OBJSCORE = io.o mtxutl.o mltaln9.o score.o constants.o defs.o + +HEADER = mltaln.h mtxutl.h mafft.h +FFTHEADER = fft.h + +MANPAGES = mafft.1 mafft-homologs.1 + + + + +all : $(PERLPROGS) $(PROGS) $(SCRIPTS) + cp $(SCRIPTS) ../scripts + chmod 755 ../scripts/* + cp $(PERLPROGS) $(PROGS) ../binaries + chmod 755 ../binaries/* + cp $(MANPAGES) ../binaries + @echo done. + +sos : $(SOS) +dylibs : $(DYLIBS) +dlls : $(DLLS) + +univscript: univscript.tmpl Makefile + sed "s:_PROGS:$(PROGS):" univscript.tmpl > univscript + +mafft: mafft.tmpl mltaln.h + sed "s:_LIBDIR:$(LIBDIR):" mafft.tmpl > mafft + +mafft-homologs.rb: mafft-homologs.tmpl +# cp mafft-homologs.tmpl mafft-homologs.rb + sed "s:_BINDIR:$(BINDIR):" mafft-homologs.tmpl > mafft-homologs.rb + +mltaln.h : functions.h + touch mltaln.h + +version : version.c mltaln.h + $(CC) -o $@ version.c $(MYCFLAGS) $(LDFLAGS) + +tbfast : $(OBJTBFAST) + $(CC) -o $@ $(OBJTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +addsingle : $(OBJADDSINGLE) + $(CC) -o $@ $(OBJADDSINGLE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +tbfast2 : $(OBJTBFAST2) + $(CC) -o $@ $(OBJTBFAST2) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +disttbfast : $(OBJDISTTBFAST) + $(CC) -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.so : $(OBJDISTTBFAST) + $(CC) -shared -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.dylib : $(OBJDISTTBFAST) + $(CC) -dynamiclib -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +libdisttbfast.dll : $(OBJDISTTBFAST) + $(CC) -shared -o $@ $(OBJDISTTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +makedirectionlist : $(OBJMAKEDIRECTIONLIST) + $(CC) -o $@ $(OBJMAKEDIRECTIONLIST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +splittbfast : $(OBJSPLITTBFAST) + $(CC) -o $@ $(OBJSPLITTBFAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +splitfromaln : $(OBJSPLITFROMALN) + $(CC) -o $@ $(OBJSPLITFROMALN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +splittbfast2 : $(OBJSPLITTBFAST2) + $(CC) -o $@ $(OBJSPLITTBFAST2) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dummy : $(OBJDUMMY) + $(CC) -o $@ $(OBJDUMMY) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +setcore : $(OBJSETCORE) + $(CC) -o $@ $(OBJSETCORE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +countlen : $(OBJCOUNTLEN) + $(CC) -o $@ $(OBJCOUNTLEN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +seq2regtable : $(OBJSEQ2REGTABLE) + $(CC) -o $@ $(OBJSEQ2REGTABLE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +regtable2seq : $(OBJREGTABLE2SEQ) + $(CC) -o $@ $(OBJREGTABLE2SEQ) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +setdirection : $(OBJSETDIRECTION) + $(CC) -o $@ $(OBJSETDIRECTION) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +replaceu : $(OBJREPLACEU) + $(CC) -o $@ $(OBJREPLACEU) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +restoreu : $(OBJRESTOREU) + $(CC) -o $@ $(OBJRESTOREU) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +f2cl : $(OBJF2CL) + $(CC) -o $@ $(OBJF2CL) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mccaskillwrap : $(OBJMCCASKILLWRAP) + $(CC) -o $@ $(OBJMCCASKILLWRAP) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +contrafoldwrap : $(OBJCONTRAFOLDWRAP) + $(CC) -o $@ $(OBJCONTRAFOLDWRAP) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +pairlocalalign : $(OBJPAIRLOCALALIGN) + $(CC) -o $@ $(OBJPAIRLOCALALIGN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +pairash : $(OBJPAIRASH) + $(CC) -o $@ $(OBJPAIRASH) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +pair2hat3s : $(OBJPAIR2HAT3S) + $(CC) -o $@ $(OBJPAIR2HAT3S) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +multi2hat3s : $(OBJMULTI2HAT3S) + $(CC) -o $@ $(OBJMULTI2HAT3S) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +getlag : $(OBJGETLAG) + $(CC) -o $@ $(OBJGETLAG) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +tditr : $(OBJTDITR) + $(CC) -o $@ $(OBJTDITR) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dvtditr : $(OBJDVTDITR) + $(CC) -o $@ $(OBJDVTDITR) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafft-profile : $(OBJGALN) + $(CC) -o $@ $(OBJGALN) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +gapfill : $(OBJGAPFILL) + $(CC) -o $@ $(OBJGAPFILL) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast4 : $(OBJDNDFAST4) + $(CC) -o $@ $(OBJDNDFAST4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast5 : $(OBJDNDFAST5) + $(CC) -o $@ $(OBJDNDFAST5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast6 : $(OBJDNDFAST6) + $(CC) -o $@ $(OBJDNDFAST6) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast7 : $(OBJDNDFAST7) + $(CC) -o $@ $(OBJDNDFAST7) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndblast : $(OBJDNDBLAST) + $(CC) -o $@ $(OBJDNDBLAST) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndfast3 : $(OBJDNDFAST3) + $(CC) -o $@ $(OBJDNDFAST3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet : $(OBJTRIPLET) + $(CC) -o $@ $(OBJTRIPLET) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet3 : $(OBJTRIPLET3) + $(CC) -o $@ $(OBJTRIPLET3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet3 : $(OBJSEXTET3) + $(CC) -o $@ $(OBJSEXTET3) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet4 : $(OBJSEXTET4) + $(CC) -o $@ $(OBJSEXTET4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +sextet5 : $(OBJSEXTET5) + $(CC) -o $@ $(OBJSEXTET5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafft-distance : $(OBJDISTANCE) + $(CC) -o $@ $(OBJDISTANCE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet5 : $(OBJTRIPLET5) + $(CC) -o $@ $(OBJTRIPLET5) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +triplet6 : $(OBJTRIPLET6) + $(CC) -o $@ $(OBJTRIPLET6) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +octet4 : $(OBJOCTET4) + $(CC) -o $@ $(OBJOCTET4) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +dndpre : $(OBJDNDPRE) + $(CC) -o $@ $(OBJDNDPRE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +score : $(OBJSCORE) + $(CC) -o $@ $(OBJSCORE) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +genMtx : $(OBJGENMTX) + $(CC) -o $@ $(OBJGENMTX) $(MYCFLAGS) $(LDFLAGS) $(LIBS) + +mafftash_premafft.pl : mafftash_premafft.tmpl + cp mafftash_premafft.tmpl mafftash_premafft.pl + +seekquencer_premafft.pl : seekquencer_premafft.tmpl + cp seekquencer_premafft.tmpl seekquencer_premafft.pl + +gapfill.o : gapfill.c $(HEADER) + $(CC) $(MYCFLAGS) -c gapfill.c + +mltaln9.o : mltaln9.c $(HEADER) + $(CC) $(MYCFLAGS) -c mltaln9.c + +tddis.o : tddis.c $(HEADER) + $(CC) $(MYCFLAGS) -c tddis.c + +constants.o : constants.c miyata.h miyata5.h blosum.c DNA.h JTT.c $(HEADER) + $(CC) $(MYCFLAGS) -c constants.c + +defs.o : defs.c + $(CC) $(MYCFLAGS) -c defs.c + +#A+++alignmm.o : SA+++alignmm.c $(HEADER) +# $(CC) $(MYCFLAGS) -c SA+++alignmm.c -o A+++alignmm.o + +Salignmm.o : Salignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c Salignmm.c + +MSalignmm.o : MSalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c MSalignmm.c + +partSalignmm.o : partSalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c partSalignmm.c + +Lalign11.o : Lalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c Lalign11.c + +genalign11.o : genalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c genalign11.c + +suboptalign11.o : suboptalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c suboptalign11.c + +Galign11.o : Galign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c Galign11.c + +MSalign11.o : MSalign11.c $(HEADER) + $(CC) $(MYCFLAGS) -c MSalign11.c + +SAalignmm.o : SAalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c SAalignmm.c -o SAalignmm.o + +Lalignmm.o : Lalignmm.c $(HEADER) + $(CC) $(MYCFLAGS) -c Lalignmm.c + +rna.o : rna.c $(HEADER) + $(CC) $(MYCFLAGS) -c rna.c + +disttbfast.o : disttbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c disttbfast.c + +splitfromaln.o : splitfromaln.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splitfromaln.c + +splittbfast.o : splittbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splittbfast.c + +splittbfast2.o : splittbfast2.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c splittbfast2.c + +makedirectionlist.o : makedirectionlist.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c makedirectionlist.c + +disttbfast_dummy.o : disttbfast_dummy.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c disttbfast_dummy.c + +dummy.o : dummy.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c dummy.c + +tbfast.o : tbfast.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c tbfast.c + +addsingle.o : addsingle.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c addsingle.c + +tbfast2.o : tbfast2.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c tbfast2.c + +setcore.o : setcore.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c setcore.c + +getlag.o : getlag.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c getlag.c + +tditr.o : tditr.c $(HEADER) + $(CC) $(MYCFLAGS) -c tditr.c + +dvtditr.o : dvtditr.c $(HEADER) + $(CC) $(MYCFLAGS) -c dvtditr.c + +tditeration.o : tditeration.c $(HEADER) + $(CC) $(MYCFLAGS) -c tditeration.c + +mafft-profile.o : mafft-profile.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c mafft-profile.c + +dndfast4.o : dndfast4.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast4.c + +dndfast5.o : dndfast5.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast5.c + +dndfast6.o : dndfast6.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast6.c + +dndfast7.o : dndfast7.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast7.c + +dndblast.o : dndblast.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndblast.c + +dndfast3.o : dndfast3.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c dndfast3.c + +dndpre.o : dndpre.c $(HEADER) + $(CC) $(MYCFLAGS) -c dndpre.c + +countlen.o : countlen.c $(HEADER) + $(CC) $(MYCFLAGS) -c countlen.c + +seq2regtable.o : seq2regtable.c $(HEADER) + $(CC) $(MYCFLAGS) -c seq2regtable.c + +regtable2seq.o : regtable2seq.c $(HEADER) + $(CC) $(MYCFLAGS) -c regtable2seq.c + +f2cl.o : f2cl.c $(HEADER) + $(CC) $(MYCFLAGS) -c f2cl.c + +setdirection.o : setdirection.c $(HEADER) + $(CC) $(MYCFLAGS) -c setdirection.c + +replaceu.o : replaceu.c $(HEADER) + $(CC) $(MYCFLAGS) -c replaceu.c + +restoreu.o : restoreu.c $(HEADER) + $(CC) $(MYCFLAGS) -c restoreu.c + +mccaskillwrap.o : mccaskillwrap.c $(HEADER) + $(CC) $(MYCFLAGS) -c mccaskillwrap.c + +contrafoldwrap.o : contrafoldwrap.c $(HEADER) + $(CC) $(MYCFLAGS) -c contrafoldwrap.c + +pairlocalalign.o : pairlocalalign.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pairlocalalign.c + +pairash.o : pairash.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pairash.c + +multi2hat3s.o : multi2hat3s.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c multi2hat3s.c + +pair2hat3s.o : pair2hat3s.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c pair2hat3s.c + +io.o : io.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c io.c + +nj.o : nj.c $(HEADER) + $(CC) $(MYCFLAGS) -c nj.c + +treeOperation.o : treeOperation.c $(HEADER) + $(CC) $(MYCFLAGS) -c treeOperation.c + +sextet5.o : sextet5.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c sextet5.c + +mafft-distance.o : mafft-distance.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c mafft-distance.c + +triplet5.o : triplet5.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c triplet5.c + +triplet6.o : triplet6.c $(HEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c triplet6.c + +fft.o : fft.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c fft.c + +fftFunctions.o : fftFunctions.c $(HEADER) $(FFTHEADER) + $(CC) $(MYCFLAGS) -c fftFunctions.c + +Falign.o : Falign.c $(HEADER) $(FFTHEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c Falign.c + +Falign_localhom.o : Falign_localhom.c $(HEADER) $(FFTHEADER) $(MTXHEADER) + $(CC) $(MYCFLAGS) -c Falign_localhom.c + +mtxutl.o : mtxutl.c + $(CC) $(MYCFLAGS) -c mtxutl.c + +addfunctions.o : addfunctions.c $(HEADER) + $(CC) $(MYCFLAGS) -c addfunctions.c + +score.o : score.c $(HEADER) + $(CC) $(MYCFLAGS) -c score.c + +clean : + rm -f *.o *.a *.exe *~ $(PERLPROGS) $(PROGS) $(SCRIPTS) $(SOS) $(DYLIBS) $(DLLS) +# rm -f ../binaries/* ../scripts/* + +install : all + mkdir -p $(LIBDIR) + chmod 755 $(LIBDIR) + mkdir -p $(BINDIR) + chmod 755 $(BINDIR) + chmod 755 $(SCRIPTS) + $(INSTALL) $(SCRIPTS) $(BINDIR) + chmod 755 $(PROGS) + $(INSTALL) -s $(PROGS) $(LIBDIR) + $(INSTALL) $(PERLPROGS) $(LIBDIR) + $(INSTALL) -m 644 $(MANPAGES) $(LIBDIR) + + ( cd $(BINDIR); \ +rm -f linsi ginsi einsi fftns fftnsi nwns nwnsi xinsi qinsi; \ +rm -f mafft-linsi mafft-ginsi mafft-einsi mafft-fftns mafft-fftnsi mafft-nwns mafft-nwnsi mafft-xinsi mafft-qinsi; \ +ln -s mafft linsi; ln -s mafft ginsi; ln -s mafft fftns; \ +ln -s mafft fftnsi; ln -s mafft nwns; ln -s mafft nwnsi; \ +ln -s mafft einsi; \ +ln -s mafft mafft-linsi; ln -s mafft mafft-ginsi; ln -s mafft mafft-fftns; \ +ln -s mafft mafft-fftnsi; ln -s mafft mafft-nwns; ln -s mafft mafft-nwnsi; \ +ln -s mafft mafft-einsi; ln -s mafft mafft-xinsi; ln -s mafft mafft-qinsi;\ +rm -f mafft-profile mafft-profile.exe; ln -s $(LIBDIR)/mafft-profile .; \ +rm -f mafft-distance mafft-distance.exe; ln -s $(LIBDIR)/mafft-distance . ) + + mkdir -p $(MANDIR) + chmod 755 $(MANDIR) + $(INSTALL) -m 644 $(MANPAGES) $(MANDIR) +# remove incorrectly installed manpages by previous versions +# rm -f /usr/local/man/man1/mafft.1 /usr/local/man/man1/mafft-homologs.1 diff --git a/mafft/src/mafft-7.487-with-extensions/core/SAalignmm.c b/mafft/src/mafft-7.487-with-extensions/core/SAalignmm.c new file mode 100644 index 0000000000..c7c5c47c07 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/SAalignmm.c @@ -0,0 +1,381 @@ +#include "mltaln.h" +#include "dp.h" + +#define DEBUG 0 + +static void match_calc( double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + int count = 0; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + + if( initialize ) + { + for( j=0; j -1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +} + +static double Atracking( double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + double **cpmx1, double **cpmx2, + int **ijp, int icyc, int jcyc ) +{ + int i, j, k, l, iin, jin, ifi, jfi, lgth1, lgth2; +// char gap[] = "-"; + char *gap; + double wm; + gap = newgapstr; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + +#if DEBUG + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + l = iin - ifi; + while( --l ) + { + for( i=0; i lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double x; + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *currentw; + static TLS double *previousw; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double **cpmx1; + static TLS double **cpmx2; + static TLS int **intwork; + static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + +#if DEBUG + fprintf( stderr, "eff in SA+++align\n" ); + for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( currentw ); + FreeFloatVec( previousw ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.1*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.1*lgth2), orlgth2 ) + 100; + + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); + + currentw = AllocateFloatVec( ll2+2 ); + previousw = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + + fprintf( stderr, "succeeded\n" ); + + orlgth1 = ll1; + orlgth2 = ll2; + } + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + + fprintf( stderr, "succeeded\n\n" ); + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + + cpmx_calc( seq1, cpmx1, eff1, strlen( seq1[0] ), icyc ); + cpmx_calc( seq2, cpmx2, eff2, strlen( seq2[0] ), jcyc ); + + match_calc( initverticalw, cpmx2, cpmx1, 0, lgth1, doublework, intwork, 1 ); + match_calc( currentw, cpmx1, cpmx2, 0, lgth2, doublework, intwork, 1 ); + + if( outgap == 1 ) + { + for( i=1; i wm ) + { + wm = x; + ijp[i][j] = -( j - mpi ); + } + g = penalty * 0.5; + x = previousw[j-1] + g; + if( mi <= x ) + { + mi = x; + mpi = j-1; + } + + g = penalty * 0.5; + x = m[j] + g; + if( x > wm ) + { + wm = x; + ijp[i][j] = +( i - mp[j] ); + } + g = penalty * 0.5; + x = previousw[j-1] + g; + if( m[j] <= x ) + { + m[j] = x; + mp[j] = i-1; + } + currentw[j] += wm; + } + lastverticalw[i] = currentw[lgth2-1]; + } + /* + fprintf( stderr, "\n" ); + for( i=0; i" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + for( i=0; i target -> localhomtable. seedinlh12 -> localhom ni haitteiru. + else + fillimp_file( impmtx, imp, clus1, clus2, lgth1, lgth2, seq1, seq2, eff1, eff2, eff1_kozo, eff2_kozo, localhom, swaplist, forscore, orinum1, orinum2, uselh, seedinlh1, seedinlh2, nodeid, nfiles ); +} + + +static void match_calc_del( int **which, double ***matrices, double *match, int n1, char **seq1, double *eff1, int n2, char **seq2, double *eff2, int i1, int lgth2, int mid, int nmask, int *mask1, int *mask2 ) +{ +// osoi! + int i, j, k, m; + int c1, c2; +// fprintf( stderr, "\nmatch_calc_dynamicmtx... %d", i1 ); +// fprintf( stderr, "\nseq1[0]=%s\n", seq1[0] ); +// fprintf( stderr, "\nseq2[0]=%s\n", seq2[0] ); +// for( i=0; i ", match[k], mid ); + match[k] -= matrices[mid][c1][c2] * eff1[i] * eff2[j]; +// fprintf( stderr, "match[k] = %f (mid=%d)\n", match[k], mid ); + } + } +// fprintf( stderr, "done\n" ); + return; +} + + +#if SLOW +static void match_calc_slow( int **which, double ***matrices, double *match, int n1, char **seq1, double *eff1, int n2, char **seq2, double *eff2, int i1, int lgth2, double **doublework, int **intwork, int initialize, int flip ) +{ +// osoi! + int i, j, k; + int c1, c2; + int mid; +// fprintf( stderr, "\nmatch_calc_dynamicmtx... %d", i1 ); +// fprintf( stderr, "\nseq1[0]=%s\n", seq1[0] ); +// fprintf( stderr, "\nseq2[0]=%s\n", seq2[0] ); +// for( i=0; i-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} +static void match_calc( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ +#if FASTMATCHCALC +// fprintf( stderr, "\nmatch_calc... %d", i1 ); + int j, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *matchpt, *cpmxpdpt, **cpmxpdptpt; + int *cpmxpdnpt, **cpmxpdnptpt; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + if( initialize ) + { + int count = 0; + for( j=0; j-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} + +static void Atracking_localhom( double *impwmpt, double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + int **ijp, int icyc, int jcyc, + int *warpis, int *warpjs, int warpbase, + int *ngap1, int *ngap2, int reuseprofiles, + char **gt1, char **gt2 ) +{ + int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, limk; + double wm; + char *gaptable1, *gt1bk; + char *gaptable2, *gt2bk; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + if( gt1 == NULL ) + { + gt1bk = AllocateCharVec( lgth1+lgth2+1 ); + gt2bk = AllocateCharVec( lgth1+lgth2+1 ); + } + else + { + gt1bk = *gt1; + gt2bk = *gt2; + } + +#if 0 + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + //*ngap2 = 1; // shita de keisan + } + l= jin; + while( --l >= 0 ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + //*ngap1 = 1; + } + break; + } + else + { + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + //*ngap2 = 1; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + //*ngap1 = 1; + } + } + if( iin == lgth1 || jin == lgth2 ) + ; + else + { + *impwmpt += (double)imp_match_out_sc( iin, jin ); + +// fprintf( stderr, "impwm = %f (iin=%d, jin=%d) seq1=%c, seq2=%c\n", *impwmpt, iin, jin, seq1[0][iin], seq2[0][jin] ); + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + } + + +#if 1 // Atracking() to onaji. Wazukani hayai hazu. Test mada. + if( strchr( gaptable1, '-' ) ) *ngap1 = 1; else *ngap1 = 0; + if( strchr( gaptable2, '-' ) ) *ngap2 = 1; else *ngap2 = 0; + + if( *ngap1 == 0 && reuseprofiles ) + ; + else if( *ngap1 == 0 ) + { + limk = gt1bk + lgth1+lgth2 - gaptable1; + for( i=0; i yobidashimoto +// gapf1 = NULL; +// free( gapf2 ); +// gapf1 = NULL; + +#if 0 + reporterr( "gaptable1=%s\n", gaptable1 ); + reporterr( "gaptable2=%s\n", gaptable2 ); + reporterr( "result (gapfreq) = " ); + for( j=0; j=0; j-- ) + { + if( (g=lasthorizontalw[j]+ ( fpenalty * TERMGAPFAC + fpenalty_ex * (lgth2-1-j) * TERMGAPFAC_EX ) ) > wm ) + { + wm = g; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + for( i=lgth1-2; i>=0; i-- ) + { + if( ( g=lastverticalw[i]+ ( fpenalty * TERMGAPFAC + fpenalty_ex * (lgth1-1-i) * TERMGAPFAC_EX ) ) > wm ) + { + wm = g; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + if( lasthorizontalw[lgth2-1] > wm ) // score ga onaji baai erabarenai + { + wm = lasthorizontalw[lgth2-1]; + iin = lgth1-1; jin = lgth2-1; + ijp[lgth1][lgth2] = 0; + } +#else + wm = lastverticalw[0]; + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } +#endif + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin; + while( --l >= 0 ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + break; + } + else + { + l = iin - ifi; + while( --l ) + { + *--gaptable1 = 'o'; + *--gaptable2 = '-'; + k++; + } + l= jin - jfi; + while( --l ) + { + *--gaptable1 = '-'; + *--gaptable2 = 'o'; + k++; + } + } + if( iin <= 0 || jin <= 0 ) break; + *--gaptable1 = 'o'; + *--gaptable2 = 'o'; + k++; + iin = ifi; jin = jfi; + } + +// reporterr( "gaptable1=%s\n", gaptable1 ); +// reporterr( "gaptable2=%s\n", gaptable2 ); + if( strchr( gaptable1, '-' ) ) *ngap1 = 1; else *ngap1 = 0; + if( strchr( gaptable2, '-' ) ) *ngap2 = 1; else *ngap2 = 0; +#if 1 + if( *ngap1 == 0 && reuseprofiles ) + ; + else if( *ngap1 == 0 ) + { + limk = gt1bk + lgth1+lgth2 - gaptable1; + for( i=0; i lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double wmo = 0.0; + double g; + double *currentw, *previousw; +// double fpenalty = (double)penalty; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex_l; +#endif +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + char **mseq1; + char **mseq2; + char **mseq; + static TLS double *ogcp1, *ogcp1o; + static TLS double *ogcp2, *ogcp2o; + static TLS double *fgcp1, *fgcp1o; + static TLS double *fgcp2, *fgcp2o; + double *ogcp1opt, *ogcp2opt, *fgcp1opt, *fgcp2opt; + static TLS double **cpmx1; + double ***cpmx1pt = NULL; + static TLS double **cpmx2; + double ***cpmx2pt = NULL; + static TLS int **intwork; + static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double *gapfreq1; + double *gapfreq1pt; + static TLS double *gapfreq2; + double *gapfreq2pt; + double fpenalty = (double)penalty_l; + double fpenalty_shift = (double)penalty_shift; + double *fgcp2pt; + double *ogcp2pt; + double fgcp1va; + double ogcp1va; + double *gf2pt; + double *gf2ptpre; + double gf1va; + double gf1vapre; + double headgapfreq1; + double headgapfreq2; + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + char *gt1, *gt2, *gt1bk, *gt2bk; + +// for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp1o ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( ogcp2o ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp1o ); + FreeFloatVec( fgcp2 ); + FreeFloatVec( fgcp2o ); + + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + + ogcp1 = AllocateFloatVec( ll1+2 ); + ogcp1o = AllocateFloatVec( ll1+2 ); + ogcp2 = AllocateFloatVec( ll2+2 ); + ogcp2o = AllocateFloatVec( ll2+2 ); + fgcp1 = AllocateFloatVec( ll1+2 ); + fgcp1o = AllocateFloatVec( ll1+2 ); + fgcp2 = AllocateFloatVec( ll2+2 ); + fgcp2o = AllocateFloatVec( ll2+2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + previousfirstlen = -1; + previousicyc = -1; + + gapfreq1 = AllocateFloatVec( ll1+2 ); + gapfreq2 = AllocateFloatVec( ll2+2 ); + +#if FASTMATCHCALC + doublework = AllocateFloatMtx( MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntMtx( MAX( ll1, ll2 )+2, nalphabets+1 ); +#else + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); +#endif + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + +#if 0 + { + double t = 0.0; + for( i=0; i= 0 && firstmem == previousfirstmem && lgth1 == previousfirstlen && nthread == 0 && icyc == previousicyc+1 ) // mouhitotsu jouken ga iru. firstmem >= 0 && firstmem == previousfirstmem && calledbytreebase && prevcalledbytreebase + if( calledbyfulltreebase == 1 && previouscall && firstmem >= 0 && firstmem == previousfirstmem && lgth1 == previousfirstlen && nthread == 0 && icyc == previousicyc+1 ) // mouhitotsu jouken ga iru. firstmem >= 0 && firstmem == previousfirstmem && calledbytreebase && prevcalledbytreebase + reuseprofiles = 1; + else + reuseprofiles = 0; +// Atracking de gapireru() wo skip surutameni reuseprofile flag wo tsukau. + +#if 0 + reporterr( "nthread=%d\n", nthread ); + reporterr( "reuseprofiles=%d\n", reuseprofiles ); + reporterr( "calledbyfulltreebase=%d\n", calledbyfulltreebase ); + reporterr( "previouscall=%d\n", previouscall ); + reporterr( "firstmem=%d, prefiousfirstmem=%d\n", firstmem, previousfirstmem ); + reporterr( "lgth1=%d, previousfirstlen=%d\n", lgth1, previousfirstlen ); + if( reuseprofiles ) exit(1 ); +#endif + + if( n_dis[0][amino_n['-']] != 0 ) + { + reporterr( "Bug probably in versions >7.36. Please report this issue to katoh@ifrec.osaka-u.ac.jp\n" ); + exit( 1 ); + } + + + if( cpmxresult && specificityconsideration == 0.0 ) // n_dynamicmtx ga henka suru toki profile ha sairiyou dekinai. + { + if( sgap1 ) + { + reporterr( "The combination of sgap1 and cpmxhit is not supported. See Salignmm.c\n" ); + exit( 1 ); + } + + + if( cpmxchild0 && *cpmxchild0 ) + { +// reporterr( "\nUse cpmxhist for child 0!\n" ); + cpmx1pt = (cpmxchild0); + gapfreq1pt = (*cpmxchild0)[nalphabets]; + ogcp1opt = (*cpmxchild0)[nalphabets+1]; + fgcp1opt = (*cpmxchild0)[nalphabets+2]; + } + else + { +// reporterr( "\nDo not use cpmxhist for child 0!\n" ); + cpmx1pt = &cpmx1; + cpmx_calc_new( seq1, *cpmx1pt, eff1, lgth1, icyc ); + + gapfreq1pt = gapfreq1; + gapcountf( gapfreq1pt, seq1, icyc, eff1, lgth1 ); + for( i=0; i tbfast.c // impossible + if( localhom ) + imp_match_calc( n_dynamicmtx, currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + if( headgp == 1 ) + { + for( i=1; i", wm ); + fprintf( stderr, "%5.0f? (penal=%5.2f)", g=mi+*fgcp2pt*(1.0-gapfreq1pt[i]), *fgcp2pt*(1.0-gapfreq1pt[i]) ); +#endif + if( (g=mi+*fgcp2pt*gf1va) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); +// fprintf( stderr, "Jump to %d (%c)!", mpi, seq2[0][mpi] ); + } + if( (g=*prept+*ogcp2pt*gf1vapre) >= mi ) +// if( (g=*prept+*ogcp2pt*gf1vapre) > mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f->", wm ); + fprintf( stderr, "%5.0f? (penal=%5.2f)", g=*mjpt+fgcp1va*(1.0-gapfreq2pt[j]), fgcp1va*(1.0-gapfreq2pt[j]) ); +#endif + if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); +// fprintf( stderr, "Jump to %d (%c)!", *mpjpt, seq1[0][*mpjpt] ); + } + if( (g=*prept+ ogcp1va* *gf2ptpre) >= *mjpt ) +// if( (g=*prept+ ogcp1va* *gf2ptpre) > *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + + + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { +// fprintf( stderr, "WARP!!\n" ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + curm = *curpt + wm; + + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + fgcp2pt++; + ogcp2pt++; + gf2ptpre++; + gf2pt++; + } + lastverticalw[i] = currentw[lgth2-1]; + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + } + + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i 20 ) +// if( 0 ) +// if( 1 ) + { + int limk = gt1bk + lgth1+lgth2 - gt1; + limk = (int)(( (limk+1000) / 1000 ) * 1000); // kiriage + //reporterr( "limk=%d\n", limk ); + +#if 1 // marume gosa wo teigenn suru tame + double totaleff1 = 0.0; + double totaleff2 = 0.0; + for( i=0; i0.001 || fabs(totaleff2-1.0)>0.001 ) + { + reporterr( "totaleff1 = %50.40f\n", totaleff1 ); + reporterr( "totaleff2 = %50.40f\n", totaleff2 ); + exit( 1 ); + } + totaleff1 = totaleff1 * orieff1 / (orieff1 + orieff2); + totaleff2 = totaleff2 * orieff2 / (orieff1 + orieff2); +#else + +// reporterr( "totaleff1 (rescaled ) = %20.10f\n", totaleff1 ); +// reporterr( "totaleff2 (rescaled ) = %20.10f\n", totaleff2 ); +// double bk1 = totaleff1; +// double bk2 = totaleff2; + + double totaleff1 = orieff1 / (orieff1 + orieff2); + double totaleff2 = orieff2 / (orieff1 + orieff2); + +// reporterr( "totaleff1 (not rescaled) = %20.10f\n", totaleff1 ); +// reporterr( "totaleff2 (not rescaled) = %20.10f\n", totaleff2 ); + +// reporterr( "ratio1 = %30.25f\n", totaleff1/bk1 ); +// reporterr( "ratio2 = %30.25f\n", totaleff2/bk2 ); +#endif + + *cpmxresult = AllocateDoubleMtx( nalphabets+3, 0 ); // gapcount, opg, fng no bun + createcpmxresult( *cpmxresult, limk, totaleff1, totaleff2, cpmx1pt, cpmx2pt, gt1, gt2, (cpmx1!=*cpmx1pt), (cpmx2!=*cpmx2pt) ); // naka de free + creategapfreqresult( *cpmxresult+nalphabets, limk, totaleff1, totaleff2, gapfreq1pt, gapfreq2pt, gt1, gt2 ); // naka deha free shinai + // gapfreq1, gapfreq2 ha mada tsukau + createogresult( *cpmxresult+nalphabets+1, limk, totaleff1, totaleff2, ogcp1opt, ogcp2opt, gapfreq1pt, gapfreq2pt, gt1, gt2 ); // naka deha free shinai + if( cpmx1!=*cpmx1pt ) free( ogcp1opt ); + if( cpmx2!=*cpmx2pt ) free( ogcp2opt ); + createfgresult( *cpmxresult+nalphabets+2, limk, totaleff1, totaleff2, fgcp1opt, fgcp2opt, gapfreq1pt, gapfreq2pt, gt1, gt2 ); // naka deha free shinai + if( cpmx1!=*cpmx1pt ) free( fgcp1opt ); + if( cpmx2!=*cpmx2pt ) free( fgcp2opt ); + + if( cpmx1!=*cpmx1pt ) free( gapfreq1pt ); + if( cpmx2!=*cpmx2pt ) free( gapfreq2pt ); +#if 0 + reporterr( "\n" ); + for( j=0; j N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + if( ngap1 || !reuseprofiles ) + for( i=0; i %d\n", strlen( seq1[0] ) ); + previousfirstlen = lgth1; + previousfirstmem = firstmem; + previousicyc = icyc; + previouscall = calledbyfulltreebase; + + free( mseq1 ); + free( mseq2 ); + FreeCharMtx( mseq ); + + return( wm ); +} + +double A__align_gapmap( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int *gapmap1, int *gapmap2 ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + fprintf( stderr, "Unexpected error. Please contact katoh@ifrec.osaka-u.ac.jp\n" ); + exit( 1 ); +} + + +double A__align_variousdist( int **which, double ***matrices, double **n_dynamicmtx, int penalty_l, int penalty_ex_l, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ) +/* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */ +{ + + +// int k; + register int i, j, c; + int ngap1, ngap2; + int lasti, lastj; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double wmo = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +// double fpenalty = (double)penalty; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex_l; +#endif +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double *ogcp1; + static TLS double *ogcp2; + static TLS double *fgcp1; + static TLS double *fgcp2; + static TLS double ***cpmx1s; + static TLS double ***cpmx2s; + static TLS int ***intwork; + static TLS double ***doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + static TLS double *gapfreq1; + static TLS double *gapfreq2; + double fpenalty = (double)penalty_l; + double fpenalty_shift = (double)penalty_shift; + double *fgcp2pt; + double *ogcp2pt; + double fgcp1va; + double ogcp1va; + double *gf2pt; + double *gf2ptpre; + double gf1va; + double gf1vapre; + double headgapfreq1; + double headgapfreq2; + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + int *nmask, **masklist1, **masklist2; + + + if( seq1 == NULL ) + { + if( orlgth1 ) + { +// fprintf( stderr, "## Freeing local arrays in A__align\n" ); + orlgth1 = 0; + orlgth2 = 0; + + imp_match_init_strict( NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 ); + + free( mseq1 ); + free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatCub( cpmx1s ); + FreeFloatCub( cpmx2s ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatCub( doublework ); + FreeIntCub( intwork ); + + } + else + { +// fprintf( stderr, "## Not allocated\n" ); + } + return( 0.0 ); + } + + +#if SLOW + nmask = calloc( maxdistclass, sizeof( int ) ); +#else + masklist1 = AllocateIntMtx( maxdistclass, 0 ); + masklist2 = AllocateIntMtx( maxdistclass, 0 ); + nmask = calloc( maxdistclass, sizeof( int ) ); + + for( c=0; c orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatCub( cpmx1s ); + FreeFloatCub( cpmx2s ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatCub( doublework ); + FreeIntCub( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + ogcp1 = AllocateFloatVec( ll1+2 ); + ogcp2 = AllocateFloatVec( ll2+2 ); + fgcp1 = AllocateFloatVec( ll1+2 ); + fgcp2 = AllocateFloatVec( ll2+2 ); + + cpmx1s = AllocateFloatCub( maxdistclass, nalphabets, ll1+2 ); + cpmx2s = AllocateFloatCub( maxdistclass, nalphabets, ll2+2 ); + + gapfreq1 = AllocateFloatVec( ll1+2 ); + gapfreq2 = AllocateFloatVec( ll2+2 ); + + doublework = AllocateFloatCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets+1 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + +#if 0 + { + double t = 0.0; + for( i=0; i tbfast.c // impossible + if( localhom ) + imp_match_calc( n_dynamicmtx, currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + + if( headgp == 1 ) + { + for( i=1; i", wm ); + fprintf( stderr, "%5.0f? (penal=%5.2f)", g=mi+*fgcp2pt*(1.0-gapfreq1[i]), *fgcp2pt*(1.0-gapfreq1[i]) ); +#endif + if( (g=mi+*fgcp2pt*gf1va) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); +// fprintf( stderr, "Jump to %d (%c)!", mpi, seq2[0][mpi] ); + } + if( (g=*prept+*ogcp2pt*gf1vapre) >= mi ) +// if( (g=*prept+*ogcp2pt*gf1vapre) > mi ) + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f->", wm ); + fprintf( stderr, "%5.0f? (penal=%5.2f)", g=*mjpt+fgcp1va*(1.0-gapfreq2[j]), fgcp1va*(1.0-gapfreq2[j]) ); +#endif + if( (g=*mjpt+ fgcp1va* *gf2pt) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); +// fprintf( stderr, "Jump to %d (%c)!", *mpjpt, seq1[0][*mpjpt] ); + } + if( (g=*prept+ ogcp1va* *gf2ptpre) >= *mjpt ) +// if( (g=*prept+ ogcp1va* *gf2ptpre) > *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + curm = *curpt + wm; + + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt++ += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + fgcp2pt++; + ogcp2pt++; + gf2ptpre++; + gf2pt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + } + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + for( i=0; ialn0[%d] = \n%s\n", i, aln0[i] ); + for( i=0; ialn1[%d] = \n%s\n", i, aln1[i] ); + for( i=0; ialn2[%d] = \n%s\n", i, aln2[i] ); +#endif + + free( effarr0 ); + free( effarr2 ); + free( allgap0 ); + free( allgap2 ); +} + +static void profilealignment( int n0, int n1, int n2, char **aln0, char **aln1, char **aln2, int alloclen, char alg ) // n1 ha allgap +{ + int i, j, newlen; + double *effarr0 = NULL, *effarr2 = NULL; + int *allgap0 = NULL, *allgap2 = NULL; + double dumdb; + int alcount0, alcount2; + char *cptr; + +// effarr0 = AllocateDoubleVec( n0 ); +// effarr2 = AllocateDoubleVec( n2 ); +// allgap0 = AllocateIntVec( n0 ); +// allgap2 = AllocateIntVec( n2 ); +// + if( aln0[0][1] == 0 && aln2[0][1] == 0 ) return; // --allowshift no tokiha... + +// reporterr( "In profilealignment(), strlen( aln0[0] ) %d\n", strlen( aln0[0] ) ); +// reporterr( "In profilealignment(), strlen( aln2[0] ) %d\n", strlen( aln2[0] ) ); + + commongappick( n0, aln0 ); + commongappick( n2, aln2 ); + +// reporterr( "after commongappick, strlen( aln0[0] ) %d\n", strlen( aln0[0] ) ); +// reporterr( "after commongappick, strlen( aln2[0] ) %d\n", strlen( aln2[0] ) ); + +// reporterr( "\n\n\n" ); + + if( aln2[0][0] == 0 ) + { + newlen = j = strlen( aln0[0] ); + cptr = aln2[0]; + while( j-- ) *cptr++ = '-'; + *cptr = 0; + + cptr = aln2[0]; + for( i=1; ialn0[%d] = %s\n", i, aln0[i] ); + for( i=0; ialn1[%d] = %s\n", i, aln1[i] ); + for( i=0; ialn2[%d] = %s\n", i, aln2[i] ); +#endif + +#if 0 + fprintf( stderr, "in profilealignment, after commongappick\n" ); + for( i=0; ialn0[%d] = %s\n", i, aln0[i] ); + for( i=0; ialn1[%d] = %s\n", i, aln1[i] ); + for( i=0; ialn2[%d] = %s\n", i, aln2[i] ); +#endif + + + free( effarr0 ); + free( effarr2 ); + free( allgap0 ); + free( allgap2 ); +} + +void eq2dashmatomete( char **s, int n ) +{ + int i, j; + char sj; + + for( j=0; (sj=s[0][j]); j++ ) + { + if( sj == '=' ) + { + for( i=0; i0; i-- ) // break ari no baai, migihajiha saigo + { + if( ref[i-1] == '+' && ( ref[i] != '+' && ref[i] != '=' ) && ref[i+1] == '=' ) + { +// reporterr( "hit! i=%d, len=%d\n", i, len ); + hit = realloc( hit, (nhit+1) * sizeof( int ) ); + hit[nhit] = i; + nhit += 1; +// break; + } + } + if( nhit == 0 ) return( 0 ); + + + for( k=0; k 1 ) exit( 1 ); + return( val ); +} + +static int smoothing1leftmulti( int len, char *ref ) // osoi! +{ + int i, j, k; + int shiftfrom = -1; + int shiftto = -1; + int *hit; + int val = 0, nhit = 0; + + hit = NULL; + +// reporterr( "ref (1leftmulti) = %s\n", ref ); + + for( i=1, nhit=0; i0; i-- ) // break ari no baai, migihajiha saigo + { + if( ref[i-1] == '=' && ( ref[i] != '+' && ref[i] != '=' ) && ref[i+1] == '+' ) + { +// reporterr( "hit! i=%d, len=%d\n", i, len ); + hit = realloc( hit, (nhit+1) * sizeof( int ) ); + hit[nhit] = i; + nhit += 1; +// break; + } + } + if( nhit == 0 ) return( 0 ); + + for( k=0; k-1; j-- ) + { + if( ref[j] != '=' ) + { + shiftto = j+1; + break; + } + } + if( j == -1 && ref[0] == '=' ) + { + reporterr( "hit[i].end = %d, j = -1, skip!\n" ); + continue; + } + + if( shiftto > 0 && ref[shiftto-1] == '+' ) continue; // muda dakara + + val += 1; + shiftfrom = hit[k]; + if( ref[shiftto] != '=' ) // atode sakujo + { + reporterr( "Error in smoothing1left!\n" ); + exit( 1 ); + } + ref[shiftto] = ref[shiftfrom]; + ref[shiftfrom] = '='; + + } + free( hit ); + +// reporterr( "ref (1leftmulti) = %s\n", ref ); + reporterr( " %d out of %d have been smoothed (left).\n", val, nhit ); + + +// if( nhit > 1 ) exit( 1 ); + return( val ); +} + +void restorecommongapssmoothly( int njob, int n0, char **seq, int *ex1, int *ex2, int *gapmap, int alloclen, char gapchar ) +{ + int *mem; + char *tmpseq; + char *cptr; + int *iptr; + int *tmpgapmap; + int i, j, k, len, rep1, rep2, len1, klim, leninserted; + int totalres; + + if( n0 == 0 ) return; + + + mem = calloc( njob+1, sizeof( int ) ); // +1 ha iranai. + intcpy( mem, ex1 ); + intcat( mem, ex2 ); +// tmpseq = calloc( alloclen+2, sizeof( char ) ); +// tmpgapmap = calloc( alloclen+2, sizeof( int ) ); + +#if 0 // iranai + for( i=0; (k=mem[i])!=-1; i++ ) // iranai + reporterr( "mem[%d] = %d\n", i, k ); // iranai + if( i == njob ) // iranai + { + fprintf( stderr, "Error in restorecommongaps()\n" ); + free( mem ); + exit( 1 ); + } +#endif + rep1 = ex1[0]; + rep2 = ex2[0]; + len = strlen( seq[rep1] ); + len1 = len+1; + + tmpseq = calloc( alloclen, sizeof( char ) ); + tmpgapmap = calloc( alloclen, sizeof( int ) ); + +#if 0 + reporterr( "\n" ); + reporterr( "seq[rep1] = %s\n", seq[rep1] ); + reporterr( "seq[rep2] = %s\n", seq[rep2] ); +#endif + + for( k=0; (i=mem[k])!=-1; k++ ) + { + cptr = tmpseq; + for( j=0; j\n" ); + reporterr( "seq[rep1] = \n%s\n", seq[rep1] ); + reporterr( "seq[rep2] = \n%s\n", seq[rep2] ); +#endif + + leninserted = strlen( seq[rep1] ); +#if 0 + reporterr( "gapmap =\n" ); + for(j=0; j0; i-- ) reporterr( "-" ); + } + reporterr( "\n" ); +#endif + +#if 0 + resprev = 10000; // tekitou + while( 1 ) + { + res = 0; +// reporterr( "\nsmoothing1right..\n" ); + res = (0= resprev ) break; +// if( res == 0 ) break; + resprev = res; + } +#else + totalres = 0; + totalres += smoothing1rightmulti( leninserted, seq[rep1] ); + totalres += smoothing1leftmulti( leninserted, seq[rep1] ); + if( totalres ) reflectsmoothing( seq[rep1], ex1, seq, leninserted ); + + totalres = 0; + totalres += smoothing1rightmulti( leninserted, seq[rep2] ); + totalres += smoothing1leftmulti( leninserted, seq[rep2] ); + if( totalres ) reflectsmoothing( seq[rep2], ex2, seq, leninserted ); +#endif + + for( k=0; (i=mem[k])!=-1; k++ ) plus2gapchar( seq[i], gapchar ); + +#if 0 + reporterr( "->\n" ); + reporterr( "seq[rep1] = \n%s\n", seq[rep1] ); + reporterr( "seq[rep2] = \n%s\n", seq[rep2] ); + reporterr( "gapmap =\n" ); + for(j=0; j0; i-- ) reporterr( "-" ); + } + reporterr( "\n" ); +#endif + + iptr = tmpgapmap; + for( j=0; j _ no tame + + fprintf( fp, ">%s\n", nameptr ); + fprintf( fp, "# letter, position in the original sequence, position in the reference alignment\n" ); + +// reporterr( "addbk[%d] = %s\n", i, addbk[i] ); + for( j=0; (p=deletelist[i][j])!=-1; j++ ) + { +// reporterr( "deleting %d, %c\n", p, addbk[i][p] ); + gapped[p] = '-'; + } + +// reporterr( "addbk = %s\n", addbk[i] ); +// reporterr( "gapped = %s\n", gapped ); + + for( j=0,p=0; j 2bai +static int allowlongadds; +static int keeplength; +static int ndeleted; +static int mapout; +static int smoothing; +static double hitout; + +static int tuplesize; + +#define PLENFACA 0.01 +#define PLENFACB 10000 +#define PLENFACC 10000 +#define PLENFACD 0.1 +#define D6LENFACA 0.01 +#define D6LENFACB 2500 +#define D6LENFACC 2500 +#define D6LENFACD 0.1 +#define D10LENFACA 0.01 +#define D10LENFACB 1000000 +#define D10LENFACC 1000000 +#define D10LENFACD 0.0 + +typedef struct _thread_arg +{ + int njob; + int nadd; + int *nlen; + int *follows; + char **name; + char **seq; + LocalHom **localhomtable; + double **iscore; + double **nscore; + int *istherenewgap; + int **newgaplist; + RNApair ***singlerna; + double *eff_kozo_mapped; + int alloclen; + Treedep *dep; + int ***topol; + double **len; + Addtree *addtree; + int **deletelist; +#ifdef enablemultithread + int *iaddshare; + int thread_no; + pthread_mutex_t *mutex_counter; +#endif +} thread_arg_t; + + +#ifdef enablemultithread +typedef struct _gaplist2alnxthread_arg +{ +// int thread_no; + int ncycle; + int *jobpospt; + int tmpseqlen; + int lenfull; + char **seq; + int *newgaplist; + int *posmap; + pthread_mutex_t *mutex; +} gaplist2alnxthread_arg_t; + +typedef struct _distancematrixthread_arg +{ + int thread_no; + int njob; + int norg; + int *jobpospt; + int **pointt; + int *nogaplen; + double **imtx; + double **nmtx; + double *selfscore; + pthread_mutex_t *mutex; +} distancematrixthread_arg_t; + +typedef struct _jobtable2d +{ + int i; + int j; +} Jobtable2d; + +typedef struct _dndprethread_arg +{ + int njob; + int thread_no; + double *selfscore; + double **mtx; + char **seq; + Jobtable2d *jobpospt; + pthread_mutex_t *mutex; +} dndprethread_arg_t; + +#endif + +typedef struct _blocktorealign +{ + int start; + int end; + int nnewres; +} Blocktorealign; + +static void cnctintvec( int *res, int *o1, int *o2 ) +{ + while( *o1 != -1 ) *res++ = *o1++; + while( *o2 != -1 ) *res++ = *o2++; + *res = -1; +} + +static void countnewres( int len, Blocktorealign *realign, int *posmap, int *gaplist ) +{ + int i, regstart, regend, len1; + regstart = 0; + len1 = len+1; + for( i=0; i lenb ) return -1; + else if( lena < lenb ) return 1; + else return( 0 ); +} + +static int dorealignment_tree( Blocktorealign *block, char **fullseq, int *fullseqlenpt, int norg, int ***topol, int *follows ) +{ + int i, j, k, posinold, newlen, *nmem; + int n0, n1, localloclen, nhit, hit1, hit2; + int *pickhistory; + int nprof1, nprof2, pos, zure; + char **prof1, **prof2; + int *iinf0, *iinf1; + int *group, *nearest, *g2n, ngroup; + char ***mem; + static char **tmpaln0 = NULL; + static char **tmpaln1 = NULL; + static char **tmpseq; + int ***topolpick; + int *tmpint; + int *intptr, *intptrx; + char *tmpseq0, *cptr, **cptrptr; + + + localloclen = 4 * ( block->end - block->start + 1 ); // ookisugi? + tmpaln0 = AllocateCharMtx( njob, localloclen ); + tmpaln1 = AllocateCharMtx( njob, localloclen ); + tmpseq = AllocateCharMtx( 1, *fullseqlenpt * 4 ); + iinf0 = AllocateIntVec( njob ); + iinf1 = AllocateIntVec( njob ); + nearest = AllocateIntVec( njob ); // oosugi + + posinold = block->start; + + n0 = 0; + n1 = 0; + for( i=0; istart, block->end - block->start + 1 ); + tmpseq[0][block->end - block->start + 1] = 0; + commongappick( 1, tmpseq ); + if( tmpseq[0][0] != 0 ) + { + if( i < norg ) + { + fprintf( stderr, "BUG!!!!\n" ); + exit( 1 ); + } + strcpy( tmpaln0[n0], tmpseq[0] ); + iinf0[n0] = i; + nearest[n0] = follows[i-norg]; + n0++; + } + else + { + strcpy( tmpaln1[n0], "" ); + iinf1[n1] = i; + n1++; + } + } + mem = AllocateCharCub( n0, n0+1, 0 ); // oosugi + nmem = AllocateIntVec( n0 ); // oosugi + g2n = AllocateIntVec( n0 ); // oosugi + group = AllocateIntVec( n0 ); // oosugi + for( i=0; i %d -> group%d\n", i, nearest[i], group[i] ); +// fprintf( stderr, "mem[%d][%d] = %s\n", group[i], j, mem[group[i]][j] ); + } + + for( i=0; i newlen ) newlen = j; + for( j=0; j<=i; j++ ) + { + for( k=0; mem[j][k]; k++ ) + fillgap( mem[j][k], newlen ); + } +#endif + + } +#if 0 + fprintf( stderr, "After ingroupalignment (original order):\n" ); + for( i=0; i-1; intptr++ ) + { + for( intptrx=g2n,k=0; k %d\n", k, topol[i][0][j] ); + + for( intptr=topol[i][1]; *intptr>-1; intptr++ ) + { + for( intptrx=g2n,k=0; k %d\n", k, topol[i][1][j] ); + +#if 0 + fprintf( stderr, "\nHIT!!! \n" ); + fprintf( stderr, "\nSTEP %d\n", i ); + for( j=0; topol[i][0][j]>-1; j++ ) fprintf( stderr, "%3d ", topol[i][0][j] ); + fprintf( stderr, "\n" ); + for( j=0; topol[i][1][j]>-1; j++ ) fprintf( stderr, "%3d ", topol[i][1][j] ); + fprintf( stderr, "\n" ); +#endif + } + + for( i=0; i-1; j++ ) fprintf( stderr, "%3d ", topolpick[i][0][j] ); + fprintf( stderr, "\n" ); + for( j=0; topolpick[i][1][j]>-1; j++ ) fprintf( stderr, "%3d ", topolpick[i][1][j] ); + fprintf( stderr, "\n" ); +#endif + + pos = 0; +// for( j=0; topolpick[i][0][j]>-1; j++ ) for( k=0; (cptr=mem[topolpick[i][0][j]][k]); k++ ) prof1[pos++] = cptr; + for( intptr=topolpick[i][0]; *intptr>-1; intptr++ ) + for( cptrptr=mem[*intptr]; (cptr=*cptrptr); cptrptr++ ) + prof1[pos++] = cptr; + nprof1 = pos; + pos = 0; +// for( j=0; topolpick[i][1][j]>-1; j++ ) for( k=0; (cptr=mem[topolpick[i][1][j]][k]); k++ ) prof2[pos++] = cptr; + for( intptr=topolpick[i][1]; *intptr>-1; intptr++ ) + for( cptrptr=mem[*intptr]; (cptr=*cptrptr); cptrptr++ ) + prof2[pos++] = cptr; + nprof2 = pos; + + + profilealignment2( nprof1, nprof2, prof1, prof2, localloclen, alg ); +#if 0 + for( j=0; jend - block->start + 1 - newlen ); +// fprintf( stderr, "zure = %d, localloclen=%d, newlen=%d\n", zure, localloclen, newlen ); + + + if( *fullseqlenpt < strlen( fullseq[0] ) - (block->end-block->start+1) + newlen + 1 ) + { + *fullseqlenpt = strlen( fullseq[0] ) * 2; + fprintf( stderr, "reallocating..." ); + for( i=0; iend+1; + for( i=0; istart, tmpseq0 ); + } + for( i=0; istart, tmpseq0 ); + } + FreeCharMtx( tmpaln0 ); + FreeCharMtx( tmpaln1 ); + FreeCharMtx( tmpseq ); + for( i=0; istart; + + + n0 = 0; + n1 = 0; + for( i=0; istart, block->end - block->start + 1 ); + tmpseq[0][block->end - block->start + 1] = 0; + commongappick( 1, tmpseq ); +// if( strlen( tmpseq[0] ) > 0 ) + if( tmpseq[0][0] != 0 ) + { + if( i < norg ) + { + fprintf( stderr, "BUG!!!!\n" ); + exit( 1 ); + } + strcpy( tmpaln0[n0], tmpseq[0] ); + iinf0[n0] = i; + n0++; + } + else + { + strcpy( tmpaln1[n0], "" ); + iinf1[n1] = i; + n1++; + } + } + + + for( i=1; istart, tmpaln0[i], newlen ); + for( i=0; istart, tmpaln1[i], newlen ); + } + + posinold = block->end+1; + posinnew = block->start + newlen; + + + zure = ( block->end - block->start + 1 - strlen( tmpaln0[0] ) ); + + for( i=0; i 0 && l[i] > 0 ) + { + if( pg < l[i] ) + { + c[i] = l[i] - pg; + } + else + { + c[i] = 0; + } + } + else + { + c[i] = l[i]; + } + prep = p[i]; + } +} + + +void gaplist2alnx( int len, char *a, char *s, int *l, int *p, int lenlimit ) +{ + int gaplen; + int pos, pi, posl; + int prevp = -1; + int reslen = 0; + char *sp; +// char *abk = a; + +#if 0 + int i; + char *abk = a; + fprintf( stderr, "s = %s\n", s ); + fprintf( stderr, "posmap = " ); + for( i=0; i lenlimit ) + { + fprintf( stderr, "Length over. Please recompile!\n" ); + exit( 1 ); + } + while( gaplen-- ) *a++ = '-'; + + pos = prevp + 1; + sp = s + pos; + if( ( posl = pi - pos ) ) + { + if( ( reslen += posl ) > lenlimit ) + { + fprintf( stderr, "Length over. Please recompile\n" ); + exit( 1 ); + } + while( posl-- ) *a++ = *sp++; + } + + if( reslen++ > lenlimit ) + { + fprintf( stderr, "Length over. Please recompile\n" ); + exit( 1 ); + } + *a++ = *sp; + prevp = pi; + } + + gaplen = *l; + pi = *p; + if( (reslen+=gaplen) > lenlimit ) + { + fprintf( stderr, "Length over. Please recompile\n" ); + exit( 1 ); + } + while( gaplen-- ) *a++ = '-'; + + pos = prevp + 1; + sp = s + pos; + if( ( posl = pi - pos ) ) + { + if( ( reslen += posl ) > lenlimit ) + { + fprintf( stderr, "Length over. Please recompile\n" ); + exit( 1 ); + } + while( posl-- ) *a++ = *sp++; + } + *a = 0; +// fprintf( stderr, "reslen = %d, strlen(a) = %d\n", reslen, strlen( abk ) ); +// fprintf( stderr, "a = %s\n", abk ); +} + +static void makenewgaplist( int *l, char *a ) +{ + while( 1 ) + { + while( *a == '=' ) + { + a++; + (*l)++; +// fprintf( stderr, "a[] (i) = %s, *l=%d\n", a, *(l) ); + } + *++l = 0; + if( *a == 0 ) break; + a++; + } + *l = -1; +} + + +void arguments( int argc, char *argv[] ) +{ + int c; + + nthread = 1; + outnumber = 0; + scoreout = 0; + treein = 0; + topin = 0; + rnaprediction = 'm'; + rnakozo = 0; + nevermemsave = 0; + inputfile = NULL; + addfile = NULL; + addprofile = 1; + fftkeika = 0; + constraint = 0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; // chuui + force_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'X'; + sueff_global = 0.1; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; + dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + penalty_shift_factor = 1000.0; + ppenalty_ex = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + RNAppenalty = NOTSPECIFIED; + RNAppenalty_ex = NOTSPECIFIED; + RNApthr = NOTSPECIFIED; + TMorJTT = JTT; + consweight_multi = 1.0; + consweight_rna = 0.0; + nadd = 0; + multidist = 0; + tuplesize = -1; + legacygapcost = 0; + allowlongadds = 0; + keeplength = 0; + mapout = 0; + smoothing = 0; + distout = 0; + hitout = 0.0; + nwildcard = 0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); + fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'e': + RNApthr = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'o': + RNAppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; + fprintf( stderr, "blosum %d / kimura 200\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt/kimura %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "tm %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + fastathreshold = atof( *++argv ); + constraint = 2; + --argc; + goto nextoption; + case 'r': + consweight_rna = atof( *++argv ); + rnakozo = 1; + --argc; + goto nextoption; + case 'c': + consweight_multi = atof( *++argv ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; +#if 0 + case 'R': + rnaprediction = 'r'; + break; + case 's': + RNAscoremtx = 'r'; + break; +#endif +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'K': + addprofile = 0; + break; + case 'y': + distout = 1; + break; + case '^': + hitout = atof( *++argv ); + --argc; + goto nextoption; + case 't': + treeout = 1; + break; + case 'T': + noalign = 1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 1 + case 'O': + outgap = 0; + break; +#else + case 'O': + fftNoAnchStop = 1; + break; +#endif + case 'S': + scoreout = 1; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'r': + fmodel = -1; + break; + case 'R': + fftRepeatStop = 1; + break; + case 's': + treemethod = 's'; + break; +#endif + case 'X': + treemethod = 'X'; + sueff_global = atof( *++argv ); + fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; + case 'E': + treemethod = 'E'; + break; + case 'q': + treemethod = 'q'; + break; + case 'n' : + outnumber = 1; + break; +#if 0 + case 'a': + alg = 'a'; + break; + case 'Q': + alg = 'Q'; + break; +#endif + case 'H': + alg = 'H'; + break; + case 'A': + alg = 'A'; + break; + case 'M': + alg = 'M'; + break; + case 'N': + nevermemsave = 1; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; + case 'F': + use_fft = 1; + break; + case 'G': + force_fft = 1; + use_fft = 1; + break; + case 'U': + treein = 1; + break; + case 'V': + allowlongadds = 1; + break; + case 'p': + smoothing = 1; + break; +#if 0 + case 'V': + topin = 1; + break; +#endif + case 'u': + tbrweight = 0; + weight = 0; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + multidist = 1; + break; + case 'W': + tuplesize = myatoi( *++argv ); + --argc; + goto nextoption; +#if 0 + case 'd': + disp = 1; + break; +#endif +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; +#if 0 + case 'Z': + checkC = 1; + break; +#endif + case 'L': + legacygapcost = 1; + break; + case 'Y': + keeplength = 1; + break; + case 'Z': + mapout = 1; + break; + case ':': + nwildcard = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + + +static double treebase( int nseq, int *nlen, char **aseq, int nadd, char *mergeoralign, char **mseq1, char **mseq2, int ***topol, double *effarr, int *alloclen, LocalHom **localhomtable, RNApair ***singlerna, double *effarr_kozo ) +{ + + int i, l, m; + int len1nocommongap, len2nocommongap; + int len1, len2; + int clus1, clus2; + double pscore, tscore; + char *indication1, *indication2; + double *effarr1 = NULL; + double *effarr2 = NULL; + double *effarr1_kozo = NULL; + double *effarr2_kozo = NULL; + LocalHom ***localhomshrink = NULL; + int *fftlog; + int m1, m2; + int *gaplen; + int *gapmap; + int *alreadyaligned; +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + RNApair ***grouprna1, ***grouprna2; + + if( rnakozo && rnaprediction == 'm' ) + { + grouprna1 = (RNApair ***)calloc( nseq, sizeof( RNApair ** ) ); + grouprna2 = (RNApair ***)calloc( nseq, sizeof( RNApair ** ) ); + } + else + { + grouprna1 = grouprna2 = NULL; + } + + fftlog = AllocateIntVec( nseq ); + effarr1 = AllocateDoubleVec( nseq ); + effarr2 = AllocateDoubleVec( nseq ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + alreadyaligned = AllocateIntVec( nseq ); + if( constraint ) + { + localhomshrink = (LocalHom ***)calloc( nseq, sizeof( LocalHom ** ) ); +#if SMALLMEMORY + if( multidist ) + { + for( i=0; i 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); +#endif + + + +// for( i=0; i 50000 || len2 > 50000 ) ) ) + { + fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; // 2013/Jul17 + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + + if( alg == 'M' ) // hoka no thread ga M ni shitakamo shirenainode + { + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000 ); + if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); + else ffttry = 0; +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000 ); // v6.708 +// fprintf( stderr, "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); +// fprintf( stderr, "f=%d, clus1=%d, fftlog[m1]=%d, clus2=%d, fftlog[m2]=%d\n", ffttry, clus1, fftlog[m1], clus2, fftlog[m2] ); + + if( constraint == 2 ) + { + if( alg == 'M' ) + { + fprintf( stderr, "\n\nMemory saving mode is not supported.\n\n" ); + exit( 1 ); + } + fprintf( stderr, "c" ); + if( alg == 'A' ) + { + imp_match_init_strict( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, NULL, 1, topol[l][0], topol[l][1], NULL, NULL, NULL, -1, 0 ); + if( rnakozo ) imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); + pscore = A__align( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxchild0 tsukaeru?? + } + else if( alg == 'Q' ) + { + fprintf( stderr, "Q has been disabled.\n" ); + exit( 1 ); + } + } + else if( force_fft || ( use_fft && ffttry ) ) + { + fprintf( stderr, "f" ); + if( alg == 'M' ) + { + fprintf( stderr, "m" ); + pscore = Falign_udpari_long( NULL, NULL, n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + pscore = Falign( NULL, NULL, n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); + } + else + { + fprintf( stderr, "d" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + fprintf( stderr, "m" ); + pscore = MSalignmm( n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, NULL, NULL, NULL, 0.0, 0.0 ); + break; + case( 'A' ): + pscore = A__align( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxchild0 tsukaeru?? + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + + + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + +// fprintf( stderr, "aseq[last] = %s\n", aseq[nseq-1] ); + +#if SCOREOUT + fprintf( stderr, "score = %10.2f\n", pscore ); +#endif + tscore += pscore; +#if 0 // New gaps = '=' + fprintf( stderr, "Original msa\n" ); + for( i=0; i-1; i++ ) alreadyaligned[m] = 1; + } + if( mergeoralign[l] == '2' ) + { +// if( deleteadditionalinsertions ) ndeleted += deletenewinsertions( clus1, clus2, mseq1, mseq2, deleterecord ); + adjustgapmap( strlen( mseq1[0] )-len1nocommongap+len1, gapmap, mseq1[0] ); + restorecommongaps( nseq, nseq-(clus1+clus2), aseq, topol[l][0], topol[l][1], gapmap, *alloclen, '-' ); + findnewgaps( clus1, 0, mseq1, gaplen ); + insertnewgaps( nseq, alreadyaligned, aseq, topol[l][0], topol[l][1], gaplen, gapmap, *alloclen, alg, '-' ); +// for( i=0; i-1; i++ ) alreadyaligned[m] = 1; + } + +#if 0 + free( topol[l][0] ); + free( topol[l][1] ); + free( topol[l] ); +#endif + } + +//for( i=0; ithread_no; + int *iaddshare = targ->iaddshare; +#endif + int njob = targ->njob; + int *follows = targ->follows; + int nadd = targ->nadd; + int *nlen = targ->nlen; + char **name = targ->name; + char **seq = targ->seq; + LocalHom **localhomtable = targ->localhomtable; + double **iscore = targ->iscore; + double **nscore = targ->nscore; + int *istherenewgap = targ->istherenewgap; + int **newgaplist = targ->newgaplist; + RNApair ***singlerna = targ->singlerna; + double *eff_kozo_mapped = targ->eff_kozo_mapped; + int alloclen = targ->alloclen; + Treedep *dep = targ->dep; + int ***topol = targ->topol; + double **len = targ->len; + Addtree *addtree = targ->addtree; + int **deletelist = targ->deletelist; + double pscore; + int *alnleninnode = NULL; + char *targetseq; + + + +// fprintf( stderr, "\nPreparing thread %d\n", thread_no ); + norg = njob - nadd; + njobc = norg+1; + +#if 0 + alnleninnode = AllocateIntVec( norg ); + addmem = AllocateIntVec( nadd+1 ); + depc = (Treedep *)calloc( njobc, sizeof( Treedep ) ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + bseq = AllocateCharMtx( njobc, alloclen ); + namec = AllocateCharMtx( njob, 0 ); + nlenc = AllocateIntVec( njob ); + mergeoralign = AllocateCharVec( njob ); + nogaplenjusttodecideaddhereornot = AllocateIntVec( njobc ); + tmpseq = calloc( alloclen, sizeof( char ) ); +#else + alnleninnode = AllocateIntVec( norg ); + addmem = AllocateIntVec( nadd+1 ); + depc = (Treedep *)calloc( njobc, sizeof( Treedep ) ); + mseq1 = AllocateCharMtx( njobc, 0 ); + mseq2 = AllocateCharMtx( njobc, 0 ); + bseq = AllocateCharMtx( njobc, alloclen ); + namec = AllocateCharMtx( njobc, 0 ); + nlenc = AllocateIntVec( njobc ); + mergeoralign = AllocateCharVec( njobc ); + nogaplenjusttodecideaddhereornot = AllocateIntVec( njobc ); + tmpseq = calloc( alloclen, sizeof( char ) ); +#endif + + if( allowlongadds ) // hontou ha iranai. + { + for( i=0; i=0; i-- ) +// for( i=norg-2; i; i-- ) // BUG!!!! + { +// reporterr( "\nstep %d\n", i ); + k = 0; + for( j=0; (m=topol[i][0][j])!=-1; j++ ) + { + mseq1[k++] = bseq[m]; +// reporterr( "%d ", m ); + } + for( j=0; (m=topol[i][1][j])!=-1; j++ ) + { + mseq1[k++] = bseq[m]; +// reporterr( "%d ", m ); + } +// reporterr( "\n" ); + commongappick( k, mseq1 ); + alnleninnode[i] = strlen( mseq1[0] ); +// fprintf( stderr, "alnleninnode[%d] = %d\n", i, alnleninnode[i] ); + } + } +// for( i=0; imutex_counter ); + iadd = *iaddshare; + if( iadd == nadd ) + { + pthread_mutex_unlock( targ->mutex_counter ); + break; + } + if( iadd < 500 ) + fprintf( stderr, "\rSTEP %d / %d (thread %d) \r", iadd, nadd, thread_no ); + else if( iadd % 100 == 0 ) + fprintf( stderr, "\nSTEP %d / %d (thread %d) \n", iadd, nadd, thread_no ); + ++(*iaddshare); + targetseq = seq[norg+iadd]; + pthread_mutex_unlock( targ->mutex_counter ); + } + else +#endif + { + iadd++; + if( iadd == nadd ) break; + targetseq = seq[norg+iadd]; + if( iadd < 500 ) + fprintf( stderr, "\rSTEP %d / %d \r", iadd, nadd ); + else if( iadd % 100 == 0 ) + fprintf( stderr, "\nSTEP %d / %d \n", iadd, nadd ); + } + + for( i=0; i 0 ) + { + for( i=0; imutex_counter ); + fprintf( stdout, "\nmergeoralign (iadd=%d) = ", iadd ); + for( i=0; imutex_counter ); +#endif + + singlerna = NULL; + pscore = treebase( njobc, nlenc, bseq, 1, mergeoralign, mseq1, mseq2, topolc, effc, &alloclen, localhomtablec, singlerna, eff_kozo_mapped ); +#if 0 + pthread_mutex_lock( targ->mutex_counter ); +// fprintf( stdout, "res (iadd=%d) = %s, pscore=%f\n", iadd, bseq[norg], pscore ); +// fprintf( stdout, "effc (iadd=%d) = ", iadd ); +// for( i=0; imutex_counter ); +#endif + + +#if 0 + fprintf( trap_g, "done.\n" ); + fclose( trap_g ); +#endif +// fprintf( stdout, "\n>seq[%d, iadd=%d] = \n%s\n", norg+iadd, iadd, seq[norg+iadd] ); +// fprintf( stdout, "\n>bseq[%d, iadd=%d] = \n%s\n", norg, iadd, bseq[norg] ); + +// strcpy( seq[norg+iadd], bseq[norg] ); + + + if( keeplength ) + { +// reporterr( "deletelist = %p\n", deletelist ); +// reporterr( "deletelist+iadd = %p\n", deletelist+iadd ); + ndeleted += deletenewinsertions_whole_eq( norg, 1, bseq, bseq+norg, deletelist+iadd ); +// for( i=0; i\n%s\n", bseq[i] ); + strcpy( targetseq, bseq[norg] ); + i = norg; // no new gap!! + } + else + { + strcpy( targetseq, bseq[norg] ); + rep = -1; + for( i=0; i maxl ) maxl = nogaplen[i]; + if( dorp == 'd' ) /* nuc */ + { + seq_grp_nuc( grpseq, tmpseq ); +// makepointtable_nuc( pointt[i], grpseq ); +// makepointtable_nuc_octet( pointt[i], grpseq ); + if( tuplesize == 10 ) + makepointtable_nuc_dectet( pointt[i], grpseq ); + else if( tuplesize == 6 ) + makepointtable_nuc( pointt[i], grpseq ); + else + { + fprintf( stderr, "tuplesize=%d: not supported\n", tuplesize ); + exit( 1 ); + } + } + else /* amino */ + { + seq_grp( grpseq, tmpseq ); + makepointtable( pointt[i], grpseq ); + } + + } + if( nunknown ) fprintf( stderr, "\nThere are %d ambiguous characters\n", nunknown ); + + for( i=0; i 0 ) + { + distancematrixthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos = 0; + targ = calloc( nthread, sizeof( distancematrixthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i nogaplen[j] ) + { + longer=(double)nogaplen[i]; + shorter=(double)nogaplen[j]; + } + else + { + longer=(double)nogaplen[j]; + shorter=(double)nogaplen[i]; + } + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); + bunbo = MIN( selfscore[i], selfscore[j] ); + + if( j < norg ) + { + if( bunbo == 0.0 ) + imtx[i][j-i] = maxdist; + else + imtx[i][j-i] = maxdist * ( 1.0 - mtxv / bunbo ) * lenfac; + } + else + { + if( bunbo == 0.0 ) + nmtx[i][j-norg] = maxdist; + else + nmtx[i][j-norg] = maxdist * ( 1.0 - mtxv / bunbo ) * lenfac; + } + } + free( table1 ); + } + } + + fprintf( stderr, "\ndone.\n\n" ); + fflush( stderr ); + + free( grpseq ); + free( tmpseq ); + FreeIntMtx( pointt ); + free( nogaplen ); + free( selfscore ); + + + if( hitout<0.0 ) + { + fprintf( stdout, "Threshold=%f\n\n", -hitout ); + for( i=0; i0.0 ) + { + fprintf( stdout, "Threshold=%f\n\n", hitout ); + for( i=norg; i 0 ) + { + dndprethread_arg_t *targ; + Jobtable2d jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos.i = 0; + jobpos.j = 0; + + targ = calloc( nthread, sizeof( dndprethread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i 9.9 ) + { + fprintf( stderr, "WARNING: distance %d-%d is strange, %f.\n", i, j, mtxv ); + mtxv = 9.9; +// exit( 1 ); // 2016/Aug/3 + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j-i] = mtxv; + } + } + } + +#if TEST + for( i=0; i %d\n", postoshiftfrom, postoshiftto ); + for( j=0; j %d\n", postoshiftfrom, postoshiftto ); + for( j=0; j 1000 || nadd > 1000 ) use_fft = 0; +// if( norg > 1000 ) use_fft = 0; + + + fullseqlen = alloclen = nlenmax*4+1; //chuui! + seq = AllocateCharMtx( njob, alloclen ); + + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + + ndeleted = 0; + + + if( multidist || tuplesize > 0 ) + { + iscore = AllocateFloatHalfMtx( norg ); + nscore = AllocateFloatMtx( norg, nadd ); + } + else + { + iscore = AllocateFloatHalfMtx( njob ); + nscore = NULL; + } + + kozoarivec = AllocateCharVec( njob ); + + + ordertable = AllocateIntVec( norg+1 ); + + + if( constraint ) + { +#if SMALLMEMORY + if( multidist ) + { + localhomtable = (LocalHom **)calloc( norg, sizeof( LocalHom *) ); + for( i=0; i 0 ) // if mtx is internally computed + { + if( multidist == 1 ) + { + ktupledistancematrix( njob, norg, nlenmax, seq, name, iscore, nscore ); // iscore ha muda. + +// hat2p = fopen( "hat2-1", "w" ); +// WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, iscore ); +// fclose( hat2p ); + + dndpre( norg, seq, iscore ); +// fprintf( stderr, "Loading 'hat2i' (aligned sequences) ... " ); +// prep = fopen( "hat2i", "r" ); +// if( prep == NULL ) ErrorExit( "Make hat2i." ); +// readhat2_doublehalf_pointer( prep, njob-nadd, name, iscore ); +// fclose( prep ); +// fprintf( stderr, "done.\n" ); + +// hat2p = fopen( "hat2-2", "w" ); +// WriteFloatHat2_pointer_halfmtx( hat2p, norg, name, iscore ); +// fclose( hat2p ); + } + else + { + ktupledistancematrix( njob, norg, nlenmax, seq, name, iscore, nscore ); + } + } + else + { + if( multidist == 1 ) + { + fprintf( stderr, "Loading 'hat2n' (aligned sequences - new sequences) ... " ); + prep = fopen( "hat2n", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2n." ); + readhat2_doublehalf_part_pointer( prep, njob, nadd, name, nscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + + fprintf( stderr, "Loading 'hat2i' (aligned sequences) ... " ); + prep = fopen( "hat2i", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2i." ); + readhat2_doublehalf_pointer( prep, njob-nadd, name, iscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + } + else + { + fprintf( stderr, "Loading 'hat2' ... " ); + prep = fopen( "hat2", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2." ); + readhat2_doublehalf_pointer( prep, njob, name, iscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + } + } + +#if 1 + if( distout ) + { + fprintf( stderr, "Writing distances between new sequences and existing msa.\n" ); + hat2p = fopen( "hat2", "w" ); + if( multidist || tuplesize > 0 ) + { + for( iadd=0; iadd 0.03 ) + { + fprintf( stderr, "################################################################################\n" ); + fprintf( stderr, "# \n" ); + fprintf( stderr, "# The reference MSA has >3%% ambiguous columns.\n" ); + fprintf( stderr, "# Please prepare a better reference.\n" ); + fprintf( stderr, "# \n" ); + fprintf( stderr, "################################################################################\n" ); + exit( 1 ); + } + + if( keeplength && mapout ) + { + addbk = (char **)calloc( nadd+1, sizeof( char * ) ); + for( i=0; i 1 ) + cnctintvec( ordertable, topol[norg-2][0], topol[norg-2][1] ); + else + { + ordertable[0] = 0; ordertable[1] = -1; + } + FreeFloatHalfMtx( iscoreo, norg ); + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex_counter; + thread_arg_t *targ; + int *iaddsharept; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex_counter, NULL ); + iaddsharept = calloc( 1, sizeof(int) ); + *iaddsharept = 0; + + for( i=0; i 0 ) + { + FreeFloatHalfMtx( iscore, norg ); + FreeFloatMtx( nscore ); + } + else + { + FreeFloatHalfMtx( iscore, njob ); + } + + +// for( i=0; i%s (%d) \n%s\n", name[norg+i], norg+i, seq[norg+i] ); + + if( treeout ) + { + fp = fopen( "infile.tree", "a" ); + if( fp == 0 ) + { + fprintf( stderr, "File error!\n" ); + exit( 1 ); + } + for( i=0; i %d\n", follower[i][j]+norg, i ); + } + fclose( orderfp ); + + posmap = AllocateIntVec( lenfull+2 ); + realign = calloc( lenfull+2, sizeof( Blocktorealign ) ); + for( i=0; i= fullseqlen ) + { + fullseqlen = tmplen * 2+1; +// fprintf( stderr, "Length over!\n" ); +// fprintf( stderr, "strlen(tmpseq1)=%d\n", (int)strlen( tmpseq1 ) ); + fprintf( stderr, "reallocating..." ); +// fprintf( stderr, "alloclen=%d\n", alloclen ); +// fprintf( stderr, "Please recompile!\n" ); +// exit( 1 ); + for( i=0; i 0 && ien > 500 ) + { + gaplist2alnxthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + fprintf( stderr, "%d / %d (threads %d-%d)\r", iadd, nadd, 0, nthread ); + + targ = calloc( nthread, sizeof( gaplist2alnxthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + jobpos = 1; + for( i=0; i%s (iadd=%d)\n%s\n", name[i], iadd, tmpseq1 ); + strcpy( seq[i], tmpseq1 ); + } + } + } + tmpseq1 = tmpseq[0]; +// insertgapsbyotherfragments_simple( lenfull, tmpseq1, seq[norg+iadd], newgaplist_o[iadd], posmap ); + insertgapsbyotherfragments_compact( lenfull, tmpseq1, seq[norg+iadd], newgaplist_o[iadd], posmap ); +// fprintf( stderr, "%d = %s\n", iadd, tmpseq1 ); + eq2dash( tmpseq1 ); + strcpy( seq[norg+iadd], tmpseq1 ); + +// adjustposmap( lenfull, posmap, newgaplist_o[iadd] ); + adjustposmap( lenfull, posmap, newgaplist_compact ); + countnewres( lenfull, realign, posmap, newgaplist_o[iadd] ); // muda? +// countnewres( lenfull, realign, posmap, newgaplist_compact ); // muda? + + } + fprintf( stderr, "\r done. \n\n" ); + +#if 0 + for( i=0; i%s\n", name[i] ); + fprintf( stderr, "%s\n", seq[i] ); + } +#endif + +#if 0 + fprintf( stderr, "realign[].nnewres = " ); + for( i=0; i 1 ) + { +// fprintf( stderr, "i=%d: %d-%d\n", i, realign[i].start, realign[i].end ); + fprintf( stderr, "\rRealigning %d/%d \r", i, lenfull ); +// zure = dorealignment_compact( realign+i, seq, &fullseqlen, norg ); +// zure = dorealignment_order( realign+i, seq, &fullseqlen, norg, ordertable, follows ); + zure = dorealignment_tree( realign+i, seq, &fullseqlen, norg, topol, follows ); +#if 0 + gappick0( check1, seq[0] ); + fprintf( stderr, "check1 = %s\n", check1 ); + if( strcmp( check1, check2 ) ) + { + fprintf( stderr, "CHANGED!!!!!\n" ); + exit( 1 ); + } +#endif + for( j=i+1; j 0 ) + { + reporterr( "\nTo keep the alignment length, %d letters were DELETED.\n", ndeleted ); + if( mapout ) + reporterr( "The deleted letters are shown in the (filename).map file.\n" ); + else + reporterr( "To know the positions of deleted letters, rerun the same command with the --mapout option.\n" ); + } + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/blosum.c b/mafft/src/mafft-7.487-with-extensions/core/blosum.c new file mode 100644 index 0000000000..41e959a6b7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/blosum.c @@ -0,0 +1,444 @@ +#define DEFAULTGOP_B -1530 +#define DEFAULTGEP_B -00 +#define DEFAULTOFS_B -123 /* +10 -- -50 teido ka ? */ + + +void BLOSUMmtx( int n, double **matrix, double *freq, unsigned char *amino, char *amino_grp, int *rescalept ) +{ + /* + char locaminod[26] = "GASTPLIMVDNEQFYWKRHCXXX.-U"; + */ +// char locaminod[] = "ARNDCQEGHILKMFPSTWYVBZX.-U"; + char locaminod[] = "ARNDCQEGHILKMFPSTWYVBZX.-J"; + char locgrpd[] = + { + 0, 3, 2, 2, 5, 2, 2, 0, 3, 1, 1, 3, 1, 4, 0, 0, 0, 4, 4, 1, 2, 2, + 6, 6, 6, 1, + }; + double freqd[20] = + { + 0.077, + 0.051, + 0.043, + 0.052, + 0.020, + 0.041, + 0.062, + 0.074, + 0.023, + 0.052, + 0.091, + 0.059, + 0.024, + 0.040, + 0.051, + 0.069, + 0.059, + 0.014, + 0.032, + 0.066, + }; + + double tmpmtx30[] = + { + 4, + -1, 8, + 0, -2, 8, + 0, -1, 1, 9, + -3, -2, -1, -3, 17, + 1, 3, -1, -1, -2, 8, + 0, -1, -1, 1, 1, 2, 6, + 0, -2, 0, -1, -4, -2, -2, 8, + -2, -1, -1, -2, -5, 0, 0, -3, 14, + 0, -3, 0, -4, -2, -2, -3, -1, -2, 6, + -1, -2, -2, -1, 0, -2, -1, -2, -1, 2, 4, + 0, 1, 0, 0, -3, 0, 2, -1, -2, -2, -2, 4, + 1, 0, 0, -3, -2, -1, -1, -2, 2, 1, 2, 2, 6, + -2, -1, -1, -5, -3, -3, -4, -3, -3, 0, 2, -1, -2, 10, + -1, -1, -3, -1, -3, 0, 1, -1, 1, -3, -3, 1, -4, -4, 11, + 1, -1, 0, 0, -2, -1, 0, 0, -1, -1, -2, 0, -2, -1, -1, 4, + 1, -3, 1, -1, -2, 0, -2, -2, -2, 0, 0, -1, 0, -2, 0, 2, 5, + -5, 0, -7, -4, -2, -1, -1, 1, -5, -3, -2, -2, -3, 1, -3, -3, -5, 20, + -4, 0, -4, -1, -6, -1, -2, -3, 0, -1, 3, -1, -1, 3, -2, -2, -1, 5, 9, + 1, -1, -2, -2, -2, -3, -3, -3, -3, 4, 1, -2, 0, 1, -4, -1, 1, -3, 1, 5, + 0, -2, 4, 5, -2, -1, 0, 0, -2, -2, -1, 0, -2, -3, -2, 0, 0, -5, -3, -2, 5, + 0, 0, -1, 0, 0, 4, 5, -2, 0, -3, -1, 1, -1, -4, 0, -1, -1, -1, -2, -3, 0, 4, + 0, -1, 0, -1, -2, 0, -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, -2, -1, 0, -1, 0, -1, + }; + + double tmpmtx45[] = + { + 5, + -2, 7, + -1, 0, 6, + -2, -1, 2, 7, + -1, -3, -2, -3, 12, + -1, 1, 0, 0, -3, 6, + -1, 0, 0, 2, -3, 2, 6, + 0, -2, 0, -1, -3, -2, -2, 7, + -2, 0, 1, 0, -3, 1, 0, -2, 10, + -1, -3, -2, -4, -3, -2, -3, -4, -3, 5, + -1, -2, -3, -3, -2, -2, -2, -3, -2, 2, 5, + -1, 3, 0, 0, -3, 1, 1, -2, -1, -3, -3, 5, + -1, -1, -2, -3, -2, 0, -2, -2, 0, 2, 2, -1, 6, + -2, -2, -2, -4, -2, -4, -3, -3, -2, 0, 1, -3, 0, 8, + -1, -2, -2, -1, -4, -1, 0, -2, -2, -2, -3, -1, -2, -3, 9, + 1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -3, -1, -2, -2, -1, 4, + 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1, 2, 5, + -2, -2, -4, -4, -5, -2, -3, -2, -3, -2, -2, -2, -2, 1, -3, -4, -3, 15, + -2, -1, -2, -2, -3, -1, -2, -3, 2, 0, 0, -1, 0, 3, -3, -2, -1, 3, 8, + 0, -2, -3, -3, -1, -3, -3, -3, -3, 3, 1, -2, 1, 0, -3, -1, 0, -3, -1, 5, + }; + double tmpmtx50[] = + { + 5, + -2, 7, + -1, -1, 7, + -2, -2, 2, 8, + -1, -4, -2, -4, 13, + -1, 1, 0, 0, -3, 7, + -1, 0, 0, 2, -3, 2, 6, + 0, -3, 0, -1, -3, -2, -3, 8, + -2, 0, 1, -1, -3, 1, 0, -2, 10, + -1, -4, -3, -4, -2, -3, -4, -4, -4, 5, + -2, -3, -4, -4, -2, -2, -3, -4, -3, 2, 5, + -1, 3, 0, -1, -3, 2, 1, -2, 0, -3, -3, 6, + -1, -2, -2, -4, -2, 0, -2, -3, -1, 2, 3, -2, 7, + -3, -3, -4, -5, -2, -4, -3, -4, -1, 0, 1, -4, 0, 8, + -1, -3, -2, -1, -4, -1, -1, -2, -2, -3, -4, -1, -3, -4, 10, + 1, -1, 1, 0, -1, 0, -1, 0, -1, -3, -3, 0, -2, -3, -1, 5, + 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 2, 5, + -3, -3, -4, -5, -5, -1, -3, -3, -3, -3, -2, -3, -1, 1, -4, -4, -3, 15, + -2, -1, -2, -3, -3, -1, -2, -3, 2, -1, -1, -2, 0, 4, -3, -2, -2, 2, 8, + 0, -3, -3, -4, -1, -3, -3, -4, -4, 4, 1, -3, 1, -1, -3, -2, 0, -3, -1, 5, + }; +#if 0 + double tmpmtx62[] = + { + 6, + -2, 8, + -2, -1, 8, + -3, -2, 2, 9, + -1, -5, -4, -5, 13, + -1, 1, 0, 0, -4, 8, + -1, 0, 0, 2, -5, 3, 7, + 0, -3, -1, -2, -4, -3, -3, 8, + -2, 0, 1, -2, -4, 1, 0, -3, 11, + -2, -4, -5, -5, -2, -4, -5, -6, -5, 6, + -2, -3, -5, -5, -2, -3, -4, -5, -4, 2, 6, + -1, 3, 0, -1, -5, 2, 1, -2, -1, -4, -4, 7, + -1, -2, -3, -5, -2, -1, -3, -4, -2, 2, 3, -2, 8, + -3, -4, -4, -5, -4, -5, -5, -5, -2, 0, 1, -5, 0, 9, + -1, -3, -3, -2, -4, -2, -2, -3, -3, -4, -4, -2, -4, -5, 11, + 2, -1, 1, 0, -1, 0, 0, 0, -1, -4, -4, 0, -2, -4, -1, 6, + 0, -2, 0, -2, -1, -1, -1, -2, -3, -1, -2, -1, -1, -3, -2, 2, 7, + -4, -4, -6, -6, -3, -3, -4, -4, -4, -4, -2, -4, -2, 1, -5, -4, -4, 16, + -3, -3, -3, -5, -4, -2, -3, -5, 3, -2, -2, -3, -1, 4, -4, -3, -2, 3, 10, + 0, -4, -4, -5, -1, -3, -4, -5, -5, 4, 1, -3, 1, -1, -4, -2, 0, -4, -2, 6, + }; +#else + double tmpmtx62[] = + { 5.893685, + -2.120252, 8.210189, + -2.296072, -0.659672, 8.479856, + -2.630151, -2.408668, 1.907550, 8.661363, + -0.612761, -5.083814, -3.989626, -5.189966, 12.873172, + -1.206025, 1.474162, 0.002529, -0.470069, -4.352838, 7.927704, + -1.295821, -0.173087, -0.402015, 2.265459, -5.418729, 2.781955, 7.354247, + 0.239392, -3.456163, -0.634136, -1.970281, -3.750621, -2.677743, -3.165266, 8.344902, + -2.437724, -0.374792, 0.867735, -1.678363, -4.481724, 0.672051, -0.176497, -3.061315, 11.266586, + -1.982718, -4.485360, -4.825558, -4.681732, -1.841495, -4.154454, -4.791538, -5.587336, -4.847345, 5.997760, + -2.196882, -3.231860, -5.068375, -5.408471, -1.916207, -3.200863, -4.269723, -5.440437, -4.180099, 2.282412, 5.774148, + -1.101017, 3.163105, -0.268534, -1.052724, -4.554510, 1.908859, 1.163010, -2.291924, -1.081539, -4.005209, -3.670219, 6.756827, + -1.402897, -2.050705, -3.226290, -4.587785, -2.129758, -0.631437, -2.997038, -4.014898, -2.326896, 1.690191, 2.987638, -2.032119, 8.088951, + -3.315080, -4.179521, -4.491005, -5.225795, -3.563219, -4.746598, -4.788639, -4.661029, -1.851231, -0.241317, 0.622170, -4.618016, 0.018880, 9.069126, + -1.221394, -3.162863, -3.000581, -2.220163, -4.192770, -1.922917, -1.674258, -3.200320, -3.241363, -4.135001, -4.290107, -1.520445, -3.714633, -5.395930, 11.046892, + 1.673639, -1.147170, 0.901353, -0.391548, -1.312485, -0.151708, -0.220375, -0.438748, -1.322366, -3.522266, -3.663923, -0.305170, -2.221304, -3.553533, -1.213470, 5.826527, + -0.068042, -1.683495, -0.069138, -1.576054, -1.299983, -1.012997, -1.294878, -2.363065, -2.528844, -1.076382, -1.796229, -1.004336, -0.999449, -3.161436, -1.612919, 2.071710, 6.817956, + -3.790328, -4.019108, -5.543911, -6.321502, -3.456164, -2.919725, -4.253197, -3.737232, -3.513238, -3.870811, -2.447829, -4.434676, -2.137255, 1.376341, -5.481260, -4.127804, -3.643382, 15.756041, + -2.646022, -2.540799, -3.122641, -4.597428, -3.610671, -2.131601, -3.030688, -4.559647, 2.538948, -1.997058, -1.593097, -2.730047, -1.492308, 4.408690, -4.379667, -2.528713, -2.408996, 3.231335, 9.892544, + -0.284140, -3.753871, -4.314525, -4.713963, -1.211518, -3.297575, -3.663425, -4.708118, -4.676220, 3.820569, 1.182672, -3.393535, 1.030861, -1.273542, -3.523054, -2.469318, -0.083276, -4.251392, -1.811267, 5.653391, + }; +#endif + double tmpmtx80[] = + { + 7, + -3, 9, + -3, -1, 9, + -3, -3, 2, 10, + -1, -6, -5, -7, 13, + -2, 1, 0, -1, -5, 9, + -2, -1, -1, 2, -7, 3, 8, + 0, -4, -1, -3, -6, -4, -4, 9, + -3, 0, 1, -2, -7, 1, 0, -4, 12, + -3, -5, -6, -7, -2, -5, -6, -7, -6, 7, + -3, -4, -6, -7, -3, -4, -6, -7, -5, 2, 6, + -1, 3, 0, -2, -6, 2, 1, -3, -1, -5, -4, 8, + -2, -3, -4, -6, -3, -1, -4, -5, -4, 2, 3, -3, 9, + -4, -5, -6, -6, -4, -5, -6, -6, -2, -1, 0, -5, 0, 10, + -1, -3, -4, -3, -6, -3, -2, -5, -4, -5, -5, -2, -4, -6, 12, + 2, -2, 1, -1, -2, -1, -1, -1, -2, -4, -4, -1, -3, -4, -2, 7, + 0, -2, 0, -2, -2, -1, -2, -3, -3, -2, -3, -1, -1, -4, -3, 2, 8, + -5, -5, -7, -8, -5, -4, -6, -6, -4, -5, -4, -6, -3, 0, -7, -6, -5, 16, + -4, -4, -4, -6, -5, -3, -5, -6, 3, -3, -2, -4, -3, 4, -6, -3, -3, 3, 11, + -1, -4, -5, -6, -2, -4, -4, -6, -5, 4, 1, -4, 1, -2, -4, -3, 0, -5, -3, 7, + }; + double tmpmtx90[] = + { + 5, +-2, 6, +-2, -1, 7, +-3, -3, 1, 7, +-1, -5, -4, -5, 9, +-1, 1, 0, -1, -4, 7, +-1, -1, -1, 1, -6, 2, 6, + 0, -3, -1, -2, -4, -3, -3, 6, +-2, 0, 0, -2, -5, 1, -1, -3, 8, +-2, -4, -4, -5, -2, -4, -4, -5, -4, 5, +-2, -3, -4, -5, -2, -3, -4, -5, -4, 1, 5, +-1, 2, 0, -1, -4, 1, 0, -2, -1, -4, -3, 6, +-2, -2, -3, -4, -2, 0, -3, -4, -3, 1, 2, -2, 7, +-3, -4, -4, -5, -3, -4, -5, -5, -2, -1, 0, -4, -1, 7, +-1, -3, -3, -3, -4, -2, -2, -3, -3, -4, -4, -2, -3, -4, 8, + 1, -1, 0, -1, -2, -1, -1, -1, -2, -3, -3, -1, -2, -3, -2, 5, + 0, -2, 0, -2, -2, -1, -1, -3, -2, -1, -2, -1, -1, -3, -2, 1, 6, +-4, -4, -5, -6, -4, -3, -5, -4, -3, -4, -3, -5, -2, 0, -5, -4, -4, 11, +-3, -3, -3, -4, -4, -3, -4, -5, 1, -2, -2, -3, -2, 3, -4, -3, -2, 2, 8, +-1, -3, -4, -5, -2, -3, -3, -5, -4, 3, 0, -3, 0, -2, -3, -2, -1, -3, -3, 5, + }; + double tmpmtx100[] = + { + 8, +-3,10, +-4,-2,11, +-5,-5, 1,10, +-2,-8,-5,-8,14, +-2, 0,-1,-2,-7,11, +-3,-2,-2, 2,-9, 2,10, +-1,-6,-2,-4,-7,-5,-6, 9, +-4,-1, 0,-3,-8, 1,-2,-6,13, +-4,-7,-7,-8,-3,-6,-7,-9,-7, 8, +-4,-6,-7,-8,-5,-5,-7,-8,-6, 2, 8, +-2, 3,-1,-3,-8, 2, 0,-5,-3,-6,-6,10, +-3,-4,-5,-8,-4,-2,-5,-7,-5, 1, 3,-4,12, +-5,-6,-7,-8,-4,-6,-8,-8,-4,-2, 0,-6,-1,11, +-2,-5,-5,-5,-8,-4,-4,-6,-5,-7,-7,-3,-5,-7,12, + 1,-3, 0,-2,-3,-2,-2,-2,-3,-5,-6,-2,-4,-5,-3, 9, +-1,-3,-1,-4,-3,-3,-3,-5,-4,-3,-4,-3,-2,-5,-4, 2, 9, +-6,-7,-8,-10,-7,-5,-8,-7,-5,-6,-5,-8,-4, 0,-8,-7,-7,17, +-5,-5,-5,-7,-6,-4,-7,-8, 1,-4,-4,-5,-5, 4,-7,-5,-5, 2,12, +-2,-6,-7,-8,-3,-5,-5,-8,-7, 4, 0,-5, 0,-3,-6,-4,-1,-5,-5, 8, + }; + double tmpmtx0[] = + { + 2.4, + -0.6, 4.7, + -0.3, 0.3, 3.8, + -0.3, -0.3, 2.2, 4.7, + 0.5, -2.2, -1.8, -3.2, 11.5, + -0.2, 1.5, 0.7, 0.9, -2.4, 2.7, + 0.0, 0.4, 0.9, 2.7, -3.0, 1.7, 3.6, + 0.5, -1.0, 0.4, 0.1, -2.0, -1.0, -0.8, 6.6, + -0.8, 0.6, 1.2, 0.4, -1.3, 1.2, 0.4, -1.4, 6.0, + -0.8, -2.4, -2.8, -3.8, -1.1, -1.9, -2.7, -4.5, -2.2, 4.0, + -1.2, -2.2, -3.0, -4.0, -1.5, -1.6, -2.8, -4.4, -1.9, 2.8, 4.0, + -0.4, 2.7, 0.8, 0.5, -2.8, 1.5, 1.2, -1.1, 0.6, -2.1, -2.1, 3.2, + -0.7, -1.7, -2.2, -3.0, -0.9, -1.0, -2.0, -3.5, -1.3, 2.5, 2.8, -1.4, 4.3, + -2.3, -3.2, -3.1, -4.5, -0.8, -2.6, -3.9, -5.2, -0.1, 1.0, 2.0, -3.3, 1.6, 7.0, + 0.3, -0.9, -0.9, -0.7, -3.1, -0.2, -0.5, -1.6, -1.1, -2.6, -2.3, -0.6, -2.4, -3.8, 7.6, + 1.1, -0.2, 0.9, 0.5, 0.1, 0.2, 0.2, 0.4, -0.2, -1.8, -2.1, 0.1, -1.4, -2.8, 0.4, 2.2, + 0.6, -0.2, 0.5, 0.0, -0.5, 0.0, -0.1, -1.1, -0.3, -0.6, -1.3, 0.1, -0.6, -2.2, 0.1, 1.5, 2.5, + -3.6, -1.6, -3.6, -5.2, -1.0, -2.7, -4.3, -4.0, -0.8, -1.8, -0.7, -3.5, -1.0, 3.6, -5.0, -3.3, -3.5, 14.2, + -2.2, -1.8, -1.4, -2.8, -0.5, -1.7, -2.7, -4.0, 2.2, -0.7, 0.0, -2.1, -0.2, 5.1, -3.1, -1.9, -1.9, 4.1, 7.8, + 0.1, -2.0, -2.2, -2.9, 0.0, -1.5, -1.9, -3.3, -2.0, 3.1, 1.8, -1.7, 1.6, 0.1, -1.8, -1.0, 0.0, -2.6, -1.1, 3.4, + }; + + int i, j, count; + double av; + double *tmpmtx; + + if( n == 30 ) tmpmtx = tmpmtx30; + else if( n == 45 ) tmpmtx = tmpmtx45; + else if( n == 50 ) tmpmtx = tmpmtx50; + else if( n == 62 ) tmpmtx = tmpmtx62; + else if( n == 80 ) tmpmtx = tmpmtx80; + else if( n == 90 ) tmpmtx = tmpmtx90; + else if( n == 100 ) tmpmtx = tmpmtx100; + else if( n == 0 ) tmpmtx = tmpmtx0; + else if( n == -1 ) tmpmtx = loadaamtx( rescalept ); + else + { + fprintf( stderr, "blosum %d ?\n", n ); + exit( 1 ); + } + + count = 0; + for( i=0; i<20; i++ ) + { + for( j=0; j<=i; j++ ) + { + matrix[i][j] = matrix[j][i] = (double)tmpmtx[count++]; + } + } + if( n == -1 && tmpmtx[400] != -1.0 ) + { + for( i=0; i<20; i++ ) freq[i] = tmpmtx[400+i]; + av = 0.0; + for( i=0; i<20; i++ ) av += freq[i]; + for( i=0; i<20; i++ ) freq[i] /= av; + } + else + for( i=0; i<20; i++ ) freq[i] = freqd[i]; + + if( n == -1 ) free( tmpmtx ); +#if 0 + av = 0.0; + for( i=0; i<20; i++ ) + av += matrix[i][i]; + av /= 20; + fprintf( stdout, "av = %f\n", av ); + + for( i=0; i<20; i++ ) for( j=0; j<20; j++ ) + matrix[i][j] /= av; + + av = wav = 0; + count = 0; + wcount = 0.0; + tmptmp = 0.0; + for( i=0; i<20; i++ ) + { + fprintf( stdout, "freq[%d] = %f\n", i, freq[i] ); + tmptmp += freq[i]; + for( j=0; j<20; j++ ) + { + av += matrix[i][j]; + wav += freq[i] * freq[j] * matrix[i][j]; + count++; + wcount += freq[i] * freq[j]; + } + } + + av /= count; + wav /= wcount; + fprintf( stdout, "av = %f\n", av ); + fprintf( stdout, "wav = %f\n", wav ); + fprintf( stdout, "wcount = %f\n", wcount ); + fprintf( stdout, "tmptmp = %f\n", tmptmp ); + + for( i=0; i<20; i++ ) + { + for( j=0; j<=i; j++ ) + { + fprintf( stderr, "## %d-%d, %f\n", i, j, matrix[i][j] ); + } + } + + exit( 1 ); +#endif + + for( i=0; i<26; i++ ) amino[i] = locaminod[i]; + for( i=0; i<26; i++ ) amino_grp[(int)amino[i]] = locgrpd[i]; +} + +static int checkchar( int i ) +{ + if( i > 0xff || i <= 0x00 || i == 0x3E || i == 0x3D || i == 0x3C || i == 0x2D || i == 0x20 || i == 0x0d || i == 0x0a ) + return( 1 ); + return( 0 ); +} + +static void overridematrix( double **matrix ) +{ + char buf[500]; + FILE *fp; + unsigned int i1, i2; + double v; + char *bpt; + int nread; + + fp = fopen( "_aamtx", "r" ); + if( fp == NULL ) + { + fprintf( stderr, "warning: cannot open scorematrix. Use the default one.\n" ); +// f2cl.c de tomaranai youni +// exit( 1 ); + return; + } + + while( 1 ) + { + fgets( buf, 499, fp ); + if( feof( fp ) ) break; + + if( ( bpt = strchr( buf, '#' ) ) ) *bpt = 0; + + i1 = i2 = 0; + nread = sscanf( buf, "%x %x %lf", &i1, &i2, &v ); + if( nread == EOF ) continue; + if( nread != 3 ) + { + reporterr( "Format error in this line?\n" ); + reporterr( "%s\n", buf ); +// reporterr( "To set a score, 100, for a match of 0x41 and 0x42, \n" ); +// reporterr( "0x41 0x42 100 \n" ); + exit( 1 ); + } + if( checkchar( i1 ) ) + { + reporterr( "%c=0x%x cannot be used (1)\n", i1, i1 ); + exit( 1 ); + } + if( checkchar( i2 ) ) + { + reporterr( "%c=0x%x cannot be used (2)\n", i2, i2 ); + exit( 1 ); + } + reporterr( "Score(%c=0x%x,%c=0x%x)=%f\n", i1, i1, i2, i2, v ); + matrix[i1][i2] = v; + matrix[i2][i1] = v; // 2018/May/11 + } + fclose( fp ); +} + +void extendedmtx( double **matrix, double *freq, unsigned char *amino, char *amino_grp ) +{ + int i; + int j; + + for( i=0; i 0.0 ) out = ( (int)( in + 0.5 ) ); + else if( in == 0.0 ) out = ( 0 ); + else if( in < 0.0 ) out = ( (int)( in - 0.5 ) ); + else out = 0; + return( out ); +} + +static void nscore( int *amino_n, int **n_dis ) +{ + int i; + for( i=0; i<26; i++ ) + { +// reporterr( "i=%d (%c), n_dis[%d][%d] = %d\n", i, amino[i], i, amino_n['n'], n_dis[i][amino_n['n']] ); + n_dis[i][amino_n['n']] = shishagonyuu( (double)0.25 * n_dis[i][i] ); +// reporterr( "-> i=%d, n_dis[%d][%d] = %d\n", i, i, amino_n['n'], n_dis[i][amino_n['n']] ); + n_dis[amino_n['n']][i] = n_dis[i][amino_n['n']]; + } +// n_dis[amino_n['n']][amino_n['n']] = shishagonyuu( (double)0.25 * 0.25 * ( n_dis[0][0] + n_dis[1][1] + n_dis[2][2] + n_dis[3][3] ) ); + n_dis[amino_n['n']][amino_n['n']] = shishagonyuu( (double)0.25 * ( n_dis[0][0] + n_dis[1][1] + n_dis[2][2] + n_dis[3][3] ) ); // 2017/Jan/2 + +#if 0 // Ato de kakunin + for( i=0; i<26; i++ ) + { + n_dis[i][amino_n['-']] = shishagonyuu( (double)0.25 * n_dis[i][i] ); + n_dis[amino_n['-']][i] = n_dis[i][amino_n['-']]; + } +// n_dis[amino_n['-']][amino_n['-']] = shishagonyuu( (double)0.25 * 0.25 * ( n_dis[0][0] + n_dis[1][1] + n_dis[2][2] + n_dis[3][3] ) ); // DAME! +#endif +} + + +static void ambiguousscore( int *amino_n, int **n_dis ) +{ + int i; + for( i=0; i<26; i++ ) + { + n_dis[i][amino_n['r']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['g']][i] ) ); + n_dis[i][amino_n['y']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['c']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['k']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['g']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['m']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['c']][i] ) ); + n_dis[i][amino_n['s']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['g']][i] + n_dis[amino_n['c']][i] ) ); + n_dis[i][amino_n['w']] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['b']] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['c']][i] + n_dis[amino_n['g']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['d']] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['g']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['h']] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['c']][i] + n_dis[amino_n['t']][i] ) ); + n_dis[i][amino_n['v']] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][i] + n_dis[amino_n['c']][i] + n_dis[amino_n['g']][i] ) ); + + n_dis[amino_n['r']][i] = n_dis[i][amino_n['r']]; + n_dis[amino_n['y']][i] = n_dis[i][amino_n['y']]; + n_dis[amino_n['k']][i] = n_dis[i][amino_n['k']]; + n_dis[amino_n['m']][i] = n_dis[i][amino_n['m']]; + n_dis[amino_n['s']][i] = n_dis[i][amino_n['s']]; + n_dis[amino_n['w']][i] = n_dis[i][amino_n['w']]; + n_dis[amino_n['b']][i] = n_dis[i][amino_n['b']]; + n_dis[amino_n['d']][i] = n_dis[i][amino_n['d']]; + n_dis[amino_n['h']][i] = n_dis[i][amino_n['h']]; + n_dis[amino_n['v']][i] = n_dis[i][amino_n['v']]; + } + + i = amino_n['r']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['g']][amino_n['g']] ) ); + i = amino_n['y']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['c']][amino_n['c']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['k']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['g']][amino_n['g']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['m']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['c']][amino_n['c']] ) ); + i = amino_n['s']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['g']][amino_n['g']] + n_dis[amino_n['c']][amino_n['c']] ) ); + i = amino_n['w']; n_dis[i][i] = shishagonyuu( (double)1/2 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['b']; n_dis[i][i] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['c']][amino_n['c']] + n_dis[amino_n['g']][amino_n['g']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['d']; n_dis[i][i] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['g']][amino_n['g']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['h']; n_dis[i][i] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['c']][amino_n['c']] + n_dis[amino_n['t']][amino_n['t']] ) ); + i = amino_n['v']; n_dis[i][i] = shishagonyuu( (double)1/3 * ( n_dis[amino_n['a']][amino_n['a']] + n_dis[amino_n['c']][amino_n['c']] + n_dis[amino_n['g']][amino_n['g']] ) ); +} + + +static void calcfreq_nuc( int nseq, char **seq, double *datafreq ) +{ + int i, j, l; + int aan; + double total; + for( i=0; i<4; i++ ) + datafreq[i] = 0.0; + total = 0.0; + for( i=0; i= 0 && aan < 4 ) + { + datafreq[aan] += 1.0; + total += 1.0; + } + } + } + total = 0.0; for( i=0; i<4; i++ ) total += datafreq[i]; + for( i=0; i<4; i++ ) datafreq[i] /= (double)total; + for( i=0; i<4; i++ ) if( datafreq[i] < 0.0001 ) datafreq[i] = 0.0001; + + + total = 0.0; for( i=0; i<4; i++ ) total += datafreq[i]; +// reporterr( "total = %f\n", total ); + for( i=0; i<4; i++ ) datafreq[i] /= (double)total; + +#if 0 + reporterr( "\ndatafreq = " ); + for( i=0; i<4; i++ ) + reporterr( "%10.5f ", datafreq[i] ); + reporterr( "\n" ); + exit( 1 ); +#endif +} + +static void calcfreq( int nseq, char **seq, double *datafreq ) +{ + int i, j, l; + int aan; + double total; + for( i=0; i= 0 && aan < nscoredalphabets && seq[i][j] != '-' ) + { + datafreq[aan] += 1.0; + total += 1.0; + } + } + } + total = 0.0; for( i=0; i= 0 && aan < nscoredalphabets && seq[i][j] != '-' ) + { + datafreq[aan] += 1.0; + total += 1.0; + } + } + } + total = 0.0; for( i=0; i= 10 ) trywarp = 0; + else trywarp = 1; + + if( dorp == 'd' ) /* DNA */ + { + int k, m; + double average; + double **pamx = AllocateDoubleMtx( 11,11 ); + double **pam1 = AllocateDoubleMtx( 4, 4 ); + double *freq = AllocateDoubleVec( 4 ); + + nalphabets = 26; + nscoredalphabets = 10; + charsize = 0x80; + + n_dis = AllocateIntMtx( nalphabets, nalphabets ); + n_disLN = AllocateDoubleMtx( nalphabets, nalphabets ); + + scoremtx = -1; + if( RNAppenalty == NOTSPECIFIED ) RNAppenalty = DEFAULTRNAGOP_N; + if( RNAppenalty_ex == NOTSPECIFIED ) RNAppenalty_ex = DEFAULTRNAGEP_N; + if( ppenalty == NOTSPECIFIED ) ppenalty = DEFAULTGOP_N; + if( ppenalty_dist == NOTSPECIFIED ) ppenalty_dist = ppenalty; + if( ppenalty_OP == NOTSPECIFIED ) ppenalty_OP = DEFAULTGOP_N; + if( ppenalty_ex == NOTSPECIFIED ) ppenalty_ex = DEFAULTGEP_N; + if( ppenalty_EX == NOTSPECIFIED ) ppenalty_EX = DEFAULTGEP_N; + if( poffset == NOTSPECIFIED ) poffset = DEFAULTOFS_N; + if( RNApthr == NOTSPECIFIED ) RNApthr = DEFAULTRNATHR_N; + if( pamN == NOTSPECIFIED ) pamN = DEFAULTPAMN; + if( kimuraR == NOTSPECIFIED ) kimuraR = 2; + + RNApenalty = (int)( 3 * 600.0 / 1000.0 * RNAppenalty + 0.5 ); + RNApenalty_ex = (int)( 3 * 600.0 / 1000.0 * RNAppenalty_ex + 0.5 ); +// reporterr( "DEFAULTRNAGOP_N = %d\n", DEFAULTRNAGOP_N ); +// reporterr( "RNAppenalty = %d\n", RNAppenalty ); +// reporterr( "RNApenalty = %d\n", RNApenalty ); + + + RNAthr = (int)( 3 * 600.0 / 1000.0 * RNApthr + 0.5 ); + penalty = (int)( 3 * 600.0 / 1000.0 * ppenalty + 0.5); + penalty_dist = (int)( 3 * 600.0 / 1000.0 * ppenalty_dist + 0.5); + penalty_shift = (int)( penalty_shift_factor * penalty ); + penalty_OP = (int)( 3 * 600.0 / 1000.0 * ppenalty_OP + 0.5); + penalty_ex = (int)( 3 * 600.0 / 1000.0 * ppenalty_ex + 0.5); + penalty_EX = (int)( 3 * 600.0 / 1000.0 * ppenalty_EX + 0.5); + offset = (int)( 1 * 600.0 / 1000.0 * poffset + 0.5); + offsetFFT = (int)( 1 * 600.0 / 1000.0 * (-0) + 0.5); + offsetLN = (int)( 1 * 600.0 / 1000.0 * 100 + 0.5); + penaltyLN = (int)( 3 * 600.0 / 1000.0 * -2000 + 0.5); + penalty_exLN = (int)( 3 * 600.0 / 1000.0 * -100 + 0.5); + + if( trywarp ) sprintf( shiftmodel, "%4.2f (%4.2f)", -(double)penalty_shift/1800, -(double)penalty_shift/600 ); + else sprintf( shiftmodel, "noshift" ); + + sprintf( modelname, "%s%d (%d), %4.2f (%4.2f), %4.2f (%4.2f), %s", rnakozo?"RNA":"DNA", pamN, kimuraR, -(double)ppenalty*0.001, -(double)ppenalty*0.003, -(double)poffset*0.001, -(double)poffset*0.003, shiftmodel ); + + for( i=0; i<26; i++ ) amino[i] = locaminon[i]; + for( i=0; i<0x80; i++ ) amino_n[i] = -1; + for( i=0; i<26; i++ ) amino_n[(int)amino[i]] = i; + if( fmodel == 1 ) + { + calcfreq_nuc( nseq, seq, freq ); + reporterr( "a, freq[0] = %f\n", freq[0] ); + reporterr( "g, freq[1] = %f\n", freq[1] ); + reporterr( "c, freq[2] = %f\n", freq[2] ); + reporterr( "t, freq[3] = %f\n", freq[3] ); + } + else + { + freq[0] = 0.25; + freq[1] = 0.25; + freq[2] = 0.25; + freq[3] = 0.25; + } + + + if( kimuraR == 9999 ) + { + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] = (double)locn_disn[i][j]; +#if NORMALIZE1 + average = 0.0; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + average += pamx[i][j]; + average /= 16.0; + + if( disp ) + reporterr( "average = %f\n", average ); + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] -= average; + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] *= 600.0 / average; + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] -= offset; +#endif + } + else + { +#if 0 + double f = 0.99; + double s = (double)kimuraR / ( 2 + kimuraR ) * 0.01; + double v = (double)1 / ( 2 + kimuraR ) * 0.01; + pam1[0][0] = f; pam1[0][1] = s; pam1[0][2] = v; pam1[0][3] = v; + pam1[1][0] = s; pam1[1][1] = f; pam1[1][2] = v; pam1[1][3] = v; + pam1[2][0] = v; pam1[2][1] = v; pam1[2][2] = f; pam1[2][3] = s; + pam1[3][0] = v; pam1[3][1] = v; pam1[3][2] = s; pam1[3][3] = f; +#else + generatenuc1pam( pam1, kimuraR, freq ); +#endif + + reporterr( "generating a scoring matrix for nucleotide (dist=%d) ... ", pamN ); + + if( disp ) + { + reporterr( " TPM \n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", pam1[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } + + + MtxuntDouble( pamx, 4 ); + for( x=0; x < pamN; x++ ) MtxmltDouble( pamx, pam1, 4 ); + + if( disp ) + { + reporterr( " TPM \n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", pamx[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] /= freq[j]; +// pamx[i][j] /= 0.25; + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + { + if( pamx[i][j] == 0.0 ) + { + reporterr( "WARNING: pamx[i][j] = 0.0 ?\n" ); + pamx[i][j] = 0.00001; /* by J. Thompson */ + } + pamx[i][j] = log10( pamx[i][j] ) * 1000.0; + } + + if( disp ) + { + reporterr( " after log\n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+10.6f ", pamx[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } + + +// ????? + + average = 0.0; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + average += pamx[i][j] * freq[i] * freq[j]; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] -= average; + + average = 0.0; + for( i=0; i<4; i++ ) + average += pamx[i][i] * 1.0 / 4.0; + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] *= 600.0 / average; + + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] -= offset; + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + pamx[i][j] = shishagonyuu( pamx[i][j] ); + + if( disp ) + { + reporterr( " after shishagonyuu\n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", pamx[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } + reporterr( "done\n" ); + } + + for( i=0; i<5; i++ ) + { + pamx[4][i] = pamx[3][i]; + pamx[i][4] = pamx[i][3]; + } + + for( i=5; i<10; i++ ) for( j=5; j<10; j++ ) + { + pamx[i][j] = pamx[i-5][j-5]; + } + + if( disp ) + { + reporterr( " before dis\n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", pamx[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } + + if( disp ) + { + reporterr( " score matrix \n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", pamx[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + exit( 1 ); + } + + for( i=0; i<26; i++ ) amino[i] = locaminon[i]; + for( i=0; i<26; i++ ) amino_grp[(int)amino[i]] = locgrpn[i]; + for( i=0; i<26; i++ ) for( j=0; j<26; j++ ) n_dis[i][j] = 0; + for( i=0; i<10; i++ ) for( j=0; j<10; j++ ) n_dis[i][j] = shishagonyuu( pamx[i][j] ); + + ambiguousscore( amino_n, n_dis ); + if( nwildcard ) nscore( amino_n, n_dis ); + + if( disp ) + { + reporterr( " score matrix \n" ); + for( i=0; i<26; i++ ) + { + for( j=0; j<26; j++ ) + reporterr( "%+6d", n_dis[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + reporterr( "penalty = %d, penalty_ex = %d\n", penalty, penalty_ex ); +//exit( 1 ); + } + +// RIBOSUM +#if 1 + average = 0.0; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + average += ribosum4[i][j] * freq[i] * freq[j]; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + ribosum4[i][j] -= average; + + average = 0.0; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) for( k=0; k<4; k++ ) for( m=0; m<4; m++ ) + { +// if( i%4==0&&j%4==3 || i%4==3&&j%4==0 || i%4==1&&j%4==2 || i%4==2&&j%4==1 || i%4==1&&j%4==3 || i%4==3&&j%4==1 ) +// if( k%4==0&&m%4==3 || k%4==3&&m%4==0 || k%4==1&&m%4==2 || k%4==2&&m%4==1 || k%4==1&&m%4==3 || k%4==3&&m%4==1 ) + average += ribosum16[i*4+j][k*4+m] * freq[i] * freq[j] * freq[k] * freq[m]; + } + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) + ribosum16[i][j] -= average; + + average = 0.0; + for( i=0; i<4; i++ ) + average += ribosum4[i][i] * freq[i]; + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + ribosum4[i][j] *= 600.0 / average; + + average = 0.0; + average += ribosum16[0*4+3][0*4+3] * freq[0] * freq[3]; // AU + average += ribosum16[3*4+0][3*4+0] * freq[3] * freq[0]; // UA + average += ribosum16[1*4+2][1*4+2] * freq[1] * freq[2]; // CG + average += ribosum16[2*4+1][2*4+1] * freq[2] * freq[1]; // GC + average += ribosum16[1*4+3][1*4+3] * freq[1] * freq[3]; // GU + average += ribosum16[3*4+1][3*4+1] * freq[3] * freq[1]; // UG + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) + ribosum16[i][j] *= 600.0 / average; + + +#if 1 + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + ribosum4[i][j] -= offset; /* extending gap cost ?????*/ + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) + ribosum16[i][j] -= offset; /* extending gap cost ?????*/ +#endif + + for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) + ribosum4[i][j] = shishagonyuu( ribosum4[i][j] ); + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) + ribosum16[i][j] = shishagonyuu( ribosum16[i][j] ); + + if( disp ) + { + reporterr( "ribosum after shishagonyuu\n" ); + for( i=0; i<4; i++ ) + { + for( j=0; j<4; j++ ) + reporterr( "%+#6.10f", ribosum4[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + reporterr( "ribosum16 after shishagonyuu\n" ); + for( i=0; i<16; i++ ) + { + for( j=0; j<16; j++ ) + reporterr( "%+#7.0f", ribosum16[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } +// reporterr( "done\n" ); + +#if 1 + for( i=0; i<37; i++ ) for( j=0; j<37; j++ ) ribosumdis[i][j] = 0.0; //iru + for( m=0; m<9; m++ ) for( i=0; i<4; i++ ) // loop + for( k=0; k<9; k++ ) for( j=0; j<4; j++ ) ribosumdis[m*4+i][k*4+j] = ribosum4[i][j]; // loop-loop +// for( k=0; k<9; k++ ) for( j=0; j<4; j++ ) ribosumdis[m*4+i][k*4+j] = n_dis[i][j]; // loop-loop + + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) ribosumdis[i+4][j+4] = ribosum16[i][j]; // stem5-stem5 + for( i=0; i<16; i++ ) for( j=0; j<16; j++ ) ribosumdis[i+20][j+20] = ribosum16[i][j]; // stem5-stem5 +#else // do not use ribosum + for( i=0; i<37; i++ ) for( j=0; j<37; j++ ) ribosumdis[i][j] = 0.0; //iru + for( m=0; m<9; m++ ) for( i=0; i<4; i++ ) // loop + for( k=0; k<9; k++ ) for( j=0; j<4; j++ ) ribosumdis[m*4+i][k*4+j] = n_dis[i][j]; // loop-loop +#endif + + if( disp ) + { + reporterr( "ribosumdis\n" ); + for( i=0; i<37; i++ ) + { + for( j=0; j<37; j++ ) + reporterr( "%+5d", ribosumdis[i][j] ); + reporterr( "\n" ); + } + reporterr( "\n" ); + } +// reporterr( "done\n" ); +#endif + + FreeDoubleMtx( pam1 ); + FreeDoubleMtx( pamx ); + free( freq ); + + } + else if( dorp == 'p' && scoremtx == 1 && nblosum == -2 ) /* extended */ + { + double *freq; + double *freq1; + double *datafreq; + double average; +// double tmp; + double **n_distmp; + + nalphabets = 0x100; + nscoredalphabets = 0x100; + charsize = 0x100; + + reporterr( "nalphabets = %d\n", nalphabets ); + + n_dis = AllocateIntMtx( nalphabets, nalphabets ); + n_disLN = AllocateDoubleMtx( nalphabets, nalphabets ); + n_distmp = AllocateDoubleMtx( nalphabets, nalphabets ); + datafreq = AllocateDoubleVec( nalphabets ); + freq = AllocateDoubleVec( nalphabets ); + + if( ppenalty == NOTSPECIFIED ) ppenalty = DEFAULTGOP_B; + if( ppenalty_dist == NOTSPECIFIED ) ppenalty_dist = ppenalty; + if( ppenalty_OP == NOTSPECIFIED ) ppenalty_OP = DEFAULTGOP_B; + if( ppenalty_ex == NOTSPECIFIED ) ppenalty_ex = DEFAULTGEP_B; + if( ppenalty_EX == NOTSPECIFIED ) ppenalty_EX = DEFAULTGEP_B; + if( poffset == NOTSPECIFIED ) poffset = DEFAULTOFS_B; + if( pamN == NOTSPECIFIED ) pamN = 0; + if( kimuraR == NOTSPECIFIED ) kimuraR = 1; + penalty = (int)( 600.0 / 1000.0 * ppenalty + 0.5 ); + penalty_dist = (int)( 600.0 / 1000.0 * ppenalty_dist + 0.5 ); + penalty_shift = (int)( penalty_shift_factor * penalty ); + penalty_OP = (int)( 600.0 / 1000.0 * ppenalty_OP + 0.5 ); + penalty_ex = (int)( 600.0 / 1000.0 * ppenalty_ex + 0.5 ); + penalty_EX = (int)( 600.0 / 1000.0 * ppenalty_EX + 0.5 ); + offset = (int)( 600.0 / 1000.0 * poffset + 0.5 ); + offsetFFT = (int)( 600.0 / 1000.0 * (-0) + 0.5); + offsetLN = (int)( 600.0 / 1000.0 * 100 + 0.5); + penaltyLN = (int)( 600.0 / 1000.0 * -2000 + 0.5); + penalty_exLN = (int)( 600.0 / 1000.0 * -100 + 0.5); + + extendedmtx( n_distmp, freq, amino, amino_grp ); + + if( trywarp ) sprintf( shiftmodel, "%4.2f", -(double)penalty_shift/600 ); + else sprintf( shiftmodel, "noshift" ); + + sprintf( modelname, "Extended, %4.2f, %+4.2f, %+4.2f, %s", -(double)ppenalty/1000, -(double)poffset/1000, -(double)ppenalty_ex/1000, shiftmodel ); +#if 0 + for( i=0; i<26; i++ ) amino[i] = locaminod[i]; + for( i=0; i<26; i++ ) amino_grp[(int)amino[i]] = locgrpd[i]; + for( i=0; i<0x80; i++ ) amino_n[i] = 0; + for( i=0; i<26; i++ ) amino_n[(int)amino[i]] = i; +#endif + for( i=0; i<0x100; i++ )amino_n[i] = -1; + for( i=0; ibestpos!=-1; pt++ ) + { + if( pt->bestpos > i ) + fprintf( fp, "%d %d %f\n", i, pt->bestpos, pt->bestscore ); + } +} + +#if 1 +static void readcontrafold( FILE *fp, RNApair **pairprob, int length ) +{ + char gett[10000]; + int *pairnum; + char *pt; + int i; + int left, right; + double prob; + + pairnum = (int *)calloc( length, sizeof( int ) ); + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'd': + whereiscontrafold = *++argv; + fprintf( stderr, "whereiscontrafold = %s\n", whereiscontrafold ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + +int main( int argc, char *argv[] ) +{ + static char com[10000]; + static int *nlen; + int left, right; + int res; + static char **name, **seq, **nogap; + static int **gapmap; + static int *order; + int i, j; + FILE *infp; + RNApair ***pairprob; + RNApair **alnpairprob; + RNApair *pairprobpt; + RNApair *pt; + int *alnpairnum; + double prob; + int adpos; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( !whereiscontrafold ) + whereiscontrafold = ""; + + getnumlen( infp ); + rewind( infp ); + + if( dorp != 'd' ) + { + fprintf( stderr, "nuc only\n" ); + exit( 1 ); + } + + seq = AllocateCharMtx( njob, nlenmax*2+1 ); + nogap = AllocateCharMtx( njob, nlenmax*2+1 ); + gapmap = AllocateIntMtx( njob, nlenmax*2+1 ); + order = AllocateIntVec( njob ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + pairprob = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + alnpairprob = (RNApair **)calloc( nlenmax, sizeof( RNApair * ) ); + alnpairnum = AllocateIntVec( nlenmax ); + + for( i=0; iin\n%s\n", nogap[i] ); + fclose( infp ); +#if 0 // contrafold v1 + sprintf( com, "env PATH=%s contrafold predict _contrafoldin --posteriors 0.01 > _contrafoldout", whereiscontrafold ); +#else // contrafold v2 + sprintf( com, "env PATH=%s contrafold predict _contrafoldin --posteriors 0.01 _contrafoldout", whereiscontrafold ); +#endif + res = system( com ); + if( res ) + { + fprintf( stderr, "error in contrafold\n" ); + fprintf( stderr, "=================================================================\n" ); + fprintf( stderr, "=================================================================\n" ); + fprintf( stderr, "==\n" ); + fprintf( stderr, "== This version of MAFFT supports CONTRAfold v2.02.\n" ); + fprintf( stderr, "== If you have a lower version of CONTRAfold installed in the\n" ); + fprintf( stderr, "== %s directory,\n", whereiscontrafold ); + fprintf( stderr, "== please update it!\n" ); + fprintf( stderr, "==\n" ); + fprintf( stderr, "=================================================================\n" ); + fprintf( stderr, "=================================================================\n" ); + exit( 1 ); + } + + + infp = fopen( "_contrafoldout", "r" ); + readcontrafold( infp, pairprob[i], nlenmax ); + fclose( infp ); + fprintf( stdout, ">%d\n", i ); + outcontrafold( stdout, pairprob[i], nlenmax ); + } + + for( i=0; ibestpos!=-1; pairprobpt++ ) + { + left = gapmap[i][j]; + right = gapmap[i][pairprobpt->bestpos]; + prob = pairprobpt->bestscore; + + for( pt=alnpairprob[left]; pt->bestpos!=-1; pt++ ) + if( pt->bestpos == right ) break; + + if( pt->bestpos == -1 ) + { + alnpairprob[left] = (RNApair *)realloc( alnpairprob[left], (alnpairnum[left]+2) * sizeof( RNApair ) ); + adpos = alnpairnum[left]; + alnpairnum[left]++; + alnpairprob[left][adpos].bestscore = 0.0; + alnpairprob[left][adpos].bestpos = right; + alnpairprob[left][adpos+1].bestscore = -1.0; + alnpairprob[left][adpos+1].bestpos = -1; + pt = alnpairprob[left]+adpos; + } + else + adpos = pt-alnpairprob[left]; + + pt->bestscore += prob; + if( pt->bestpos != right ) + { + fprintf( stderr, "okashii!\n" ); + exit( 1 ); + } +// fprintf( stderr, "adding %d-%d, %f\n", left, right, prob ); + } + } + return( 0 ); + +#if 0 + fprintf( stdout, "result=\n" ); + + for( i=0; ibestpos!=-1; pairprobpt++ ) + { + pairprobpt->bestscore /= (double)njob; + left = i; + right = pairprobpt->bestpos; + prob = pairprobpt->bestscore; + fprintf( stdout, "%d-%d, %f\n", left, right, prob ); + } + + return( 0 ); +#endif +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/countlen.c b/mafft/src/mafft-7.487-with-extensions/core/countlen.c new file mode 100644 index 0000000000..fd5268604d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/countlen.c @@ -0,0 +1,64 @@ +#include "mltaln.h" + +#define DEBUG 0 + +void arguments( int argc, char *argv[] ) +{ + int c; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + int nlenmin; + double nfreq; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + dorp = NOTSPECIFIED; + getnumlen_nogap_countn( infp, &nlenmin, &nfreq ); + + fprintf( stdout, "%d x %d - %d %c nfreq=%f\n", njob, nlenmax, nlenmin, dorp, nfreq ); + + fclose( infp ); + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/dash_client.go b/mafft/src/mafft-7.487-with-extensions/core/dash_client.go new file mode 100644 index 0000000000..9fbdedb1ea --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/dash_client.go @@ -0,0 +1,1366 @@ +package main + +import( + "bufio" + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "strings" + "strconv" + "sort" + "time" +) + +var VersionNumber = 1.1 +var Debug = false +var NumberOfQueryTries = 12 +var HTTPClient = &http.Client{} +var SequenceLimit = 3000 +var AlignmentLimit = 10000 + +//URL's +func DASHDomainAlignmentURL(dash_url string) string { + return dash_url + "domain_alignments?format=JSON" +} +func DASHChainDomainsURL(dash_url string) string { + return dash_url + "domains?format=JSON&filter=pdbid=%s" +} +func DASHChainURL(dash_url string) string { + return dash_url + "chains?format=JSON&filter=pdbid=%s" +} +func DASHChainSearchURL(dash_url string) string { + return dash_url + "chain_search_sequence?limit=5" +} + +//Data types +type Sequence struct { + Label string + Sequence string +} +type DASHInput struct { + PDBID string + FullID string + Hat3Index int + Start int + End int + Sequence string + Domains []RESTDomain +} +type RESTChain struct { + StatusCode int + StatusMessage string + PDBID string + DepositionDate string + Sequence string + Length int +} +type RESTDomain struct { + StatusCode int + StatusMessage string + DomainID string + PDBID string + Length int + Sequence string + Segments string + ResidueNumbers string + Start int + End int + SliceStart int + SliceEnd int + ResidueNumberInts []int +} +type RESTAlignment struct { + StatusCode int + StatusMessage string + SCORE int + ID1 string + ID2 string + PRIMS1 string + SECOS1 string + PRIMS2 string + SECOS2 string + EQUIVALENCE string + LOWSIMILARITY bool +} +type RESTSearch struct { + StatusCode int + StatusMessage string + ID string + Start int + End int +} +func(alignment *RESTAlignment) Reverse() { + new_alignment := *alignment + new_alignment.ID1 = alignment.ID2 + new_alignment.ID2 = alignment.ID1 + new_alignment.PRIMS1 = alignment.PRIMS2 + new_alignment.PRIMS2 = alignment.PRIMS1 + new_alignment.SECOS1 = alignment.SECOS2 + new_alignment.SECOS2 = alignment.SECOS1 + *alignment = new_alignment +} + +//Utility Functions +func fatal(object interface{}) { + if Debug { + panic(fmt.Sprint(object)) + } else { + fmt.Fprintln(os.Stderr, "----") + non_fatal(object) + os.Exit(1) + } +} + +func non_fatal(object interface{}) { + fmt.Fprintln(os.Stderr, fmt.Sprint(object)) +} + +func check(err error) { + if err != nil { + fatal(err.Error()) + } +} + +func http_query(method string, url string, body io.Reader) *http.Response { + //A simple request will follow redirects by default! + retry_count := NumberOfQueryTries + var response *http.Response + status_code := 404 + for status_code != 200 { + if retry_count != NumberOfQueryTries { + fmt.Println("Retrying DASH request...") + time.Sleep(10*time.Second) + } + if retry_count == 0 { + break + } + request, err := http.NewRequest(method, url, body) + check(err) + response, err = HTTPClient.Do(request) + if err != nil { + status_code = 404 + retry_count += -1 + continue + } + status_code = response.StatusCode + } + + if status_code != 200 { + error_message := fmt.Sprintf( + "Client was unable to connect to DASH server after %d retries.", NumberOfQueryTries) + error_message += + "\nPlease check https://sysimm.org for information about possible maintenance." + error_message += + "\nIf there is no scheduled maintenance occuring right now you may submit a bug report by contacting us at https://sysimm.org" + fatal(error_message) + } + + return response +} + +func parse_residue_numbers(residue_numbers_string string) []int { + starts_and_ends := strings.Split(residue_numbers_string, "; ") + residue_numbers := make([]int, 0, 3000) + for _, start_and_end := range(starts_and_ends) { + start_and_end_split := strings.Split(start_and_end, "-") + start, err := strconv.Atoi(start_and_end_split[0]) + check(err) + end, err := strconv.Atoi(start_and_end_split[1]) + check(err) + for residue_number := start; residue_number <= end; residue_number++ { + residue_numbers = append(residue_numbers, residue_number) + } + } + return residue_numbers +} + +//BLOSUM62 Matrix +var BLOSUM62Max = 11.0 +type BLOSUMRow map[byte]float64 +type BLOSUMMatrix map[byte]BLOSUMRow +var BLOSUM62 = BLOSUMMatrix{ + 'A':BLOSUMRow{ + 'A':4, 'R':-1, 'N':-2, 'D':-2, 'C':0, 'Q':-1, 'E':-1, 'G':0, 'H':-2, 'I':-1, + 'L':-1, 'K':-1, 'M':-1, 'F':-2, 'P':-1, 'S':1, 'T':0, 'W':-3, 'Y':-2, 'V':0, + 'B':-2, 'Z':-1, }, + 'R':BLOSUMRow{ + 'A':-1, 'R':5, 'N':0, 'D':-2, 'C':-3, 'Q':1, 'E':0, 'G':-2, 'H':0, 'I':-3, + 'L':-2, 'K':2, 'M':-1, 'F':-3, 'P':-2, 'S':-1, 'T':-1, 'W':-3, 'Y':-2, 'V':-3, + 'B':-1, 'Z':0, }, + 'N':BLOSUMRow{ + 'A':-2, 'R':0, 'N':6, 'D':1, 'C':-3, 'Q':0, 'E':0, 'G':0, 'H':1, 'I':-3, + 'L':-3, 'K':0, 'M':-2, 'F':-3, 'P':-2, 'S':1, 'T':0, 'W':-4, 'Y':-2, 'V':-3, + 'B':3, 'Z':0, }, + 'D':BLOSUMRow{ + 'A':-2, 'R':-2, 'N':1, 'D':6, 'C':-3, 'Q':0, 'E':2, 'G':-1, 'H':-1, 'I':-3, + 'L':-4, 'K':-1, 'M':-3, 'F':-3, 'P':-1, 'S':0, 'T':-1, 'W':-4, 'Y':-3, 'V':-3, + 'B':4, 'Z':1, }, + 'C':BLOSUMRow{ + 'A':0, 'R':-3, 'N':-3, 'D':-3, 'C':9, 'Q':-3, 'E':-4, 'G':-3, 'H':-3, 'I':-1, + 'L':-1, 'K':-3, 'M':-1, 'F':-2, 'P':-3, 'S':-1, 'T':-1, 'W':-2, 'Y':-2, 'V':-1, + 'B':-3, 'Z':-3, }, + 'Q':BLOSUMRow{ + 'A':-1, 'R':1, 'N':0, 'D':0, 'C':-3, 'Q':5, 'E':2, 'G':-2, 'H':0, 'I':-3, + 'L':-2, 'K':1, 'M':0, 'F':-3, 'P':-1, 'S':0, 'T':-1, 'W':-2, 'Y':-1, 'V':-2, + 'B':0, 'Z':3, }, + 'E':BLOSUMRow{ + 'A':-1, 'R':0, 'N':0, 'D':2, 'C':-4, 'Q':2, 'E':5, 'G':-2, 'H':0, 'I':-3, + 'L':-3, 'K':1, 'M':-2, 'F':-3, 'P':-1, 'S':0, 'T':-1, 'W':-3, 'Y':-2, 'V':-2, + 'B':1, 'Z':4, }, + 'G':BLOSUMRow{ + 'A':0, 'R':-2, 'N':0, 'D':-1, 'C':-3, 'Q':-2, 'E':-2, 'G':6, 'H':-2, 'I':-4, + 'L':-4, 'K':-2, 'M':-3, 'F':-3, 'P':-2, 'S':0, 'T':-2, 'W':-2, 'Y':-3, 'V':-3, + 'B':-1, 'Z':-2, }, + 'H':BLOSUMRow{ + 'A':-2, 'R':0, 'N':1, 'D':-1, 'C':-3, 'Q':0, 'E':0, 'G':-2, 'H':8, 'I':-3, + 'L':-3, 'K':-1, 'M':-2, 'F':-1, 'P':-2, 'S':-1, 'T':-2, 'W':-2, 'Y':2, 'V':-3, + 'B':0, 'Z':0, }, + 'I':BLOSUMRow{ + 'A':-1, 'R':-3, 'N':-3, 'D':-3, 'C':-1, 'Q':-3, 'E':-3, 'G':-4, 'H':-3, 'I':4, + 'L':2, 'K':-3, 'M':1, 'F':0, 'P':-3, 'S':-2, 'T':-1, 'W':-3, 'Y':-1, 'V':3, + 'B':-3, 'Z':-3, }, + 'L':BLOSUMRow{ + 'A':-1, 'R':-2, 'N':-3, 'D':-4, 'C':-1, 'Q':-2, 'E':-3, 'G':-4, 'H':-3, 'I':2, + 'L':4, 'K':-2, 'M':2, 'F':0, 'P':-3, 'S':-2, 'T':-1, 'W':-2, 'Y':-1, 'V':1, + 'B':-4, 'Z':-3, }, + 'K':BLOSUMRow{ + 'A':-1, 'R':2, 'N':0, 'D':-1, 'C':-3, 'Q':1, 'E':1, 'G':-2, 'H':-1, 'I':-3, + 'L':-2, 'K':5, 'M':-1, 'F':-3, 'P':-1, 'S':0, 'T':-1, 'W':-3, 'Y':-2, 'V':-2, + 'B':0, 'Z':1, }, + 'M':BLOSUMRow{ + 'A':-1, 'R':-1, 'N':-2, 'D':-3, 'C':-1, 'Q':0, 'E':-2, 'G':-3, 'H':-2, 'I':1, + 'L':2, 'K':-1, 'M':5, 'F':0, 'P':-2, 'S':-1, 'T':-1, 'W':-1, 'Y':-1, 'V':1, + 'B':-3, 'Z':-1, }, + 'F':BLOSUMRow{ + 'A':-2, 'R':-3, 'N':-3, 'D':-3, 'C':-2, 'Q':-3, 'E':-3, 'G':-3, 'H':-1, 'I':0, + 'L':0, 'K':-3, 'M':0, 'F':6, 'P':-4, 'S':-2, 'T':-2, 'W':1, 'Y':3, 'V':-1, + 'B':-3, 'Z':-3, }, + 'P':BLOSUMRow{ + 'A':-1, 'R':-2, 'N':-2, 'D':-1, 'C':-3, 'Q':-1, 'E':-1, 'G':-2, 'H':-2, 'I':-3, + 'L':-3, 'K':-1, 'M':-2, 'F':-4, 'P':7, 'S':-1, 'T':-1, 'W':-4, 'Y':-3, 'V':-2, + 'B':-2, 'Z':-1, }, + 'S':BLOSUMRow{ + 'A':1, 'R':-1, 'N':1, 'D':0, 'C':-1, 'Q':0, 'E':0, 'G':0, 'H':-1, 'I':-2, + 'L':-2, 'K':0, 'M':-1, 'F':-2, 'P':-1, 'S':4, 'T':1, 'W':-3, 'Y':-2, 'V':-2, + 'B':0, 'Z':0, }, + 'T':BLOSUMRow{ + 'A':0, 'R':-1, 'N':0, 'D':-1, 'C':-1, 'Q':-1, 'E':-1, 'G':-2, 'H':-2, 'I':-1, + 'L':-1, 'K':-1, 'M':-1, 'F':-2, 'P':-1, 'S':1, 'T':5, 'W':-2, 'Y':-2, 'V':0, + 'B':-1, 'Z':-1, }, + 'W':BLOSUMRow{ + 'A':-3, 'R':-3, 'N':-4, 'D':-4, 'C':-2, 'Q':-2, 'E':-3, 'G':-2, 'H':-2, 'I':-3, + 'L':-2, 'K':-3, 'M':-1, 'F':1, 'P':-4, 'S':-3, 'T':-2, 'W':11, 'Y':2, 'V':-3, + 'B':-4, 'Z':-3, }, + 'Y':BLOSUMRow{ + 'A':-2, 'R':-2, 'N':-2, 'D':-3, 'C':-2, 'Q':-1, 'E':-2, 'G':-3, 'H':2, 'I':-1, + 'L':-1, 'K':-2, 'M':-1, 'F':3, 'P':-3, 'S':-2, 'T':-2, 'W':2, 'Y':7, 'V':-1, + 'B':-3, 'Z':-2, }, + 'V':BLOSUMRow{ + 'A':0, 'R':-3, 'N':-3, 'D':-3, 'C':-1, 'Q':-2, 'E':-2, 'G':-3, 'H':-3, 'I':3, + 'L':1, 'K':-2, 'M':1, 'F':-1, 'P':-2, 'S':-2, 'T':0, 'W':-3, 'Y':-1, 'V':4, + 'B':-3, 'Z':-2, }, + 'B':BLOSUMRow{ + 'A':-2, 'R':-1, 'N':3, 'D':4, 'C':-3, 'Q':0, 'E':1, 'G':-1, 'H':0, 'I':-3, + 'L':-4, 'K':0, 'M':-3, 'F':-3, 'P':-2, 'S':0, 'T':-1, 'W':-4, 'Y':-3, 'V':-3, + 'B':4, 'Z':1, }, + 'Z':BLOSUMRow{ + 'A':-1, 'R':0, 'N':0, 'D':1, 'C':-3, 'Q':3, 'E':4, 'G':-2, 'H':0, 'I':-3, + 'L':-3, 'K':1, 'M':-1, 'F':-3, 'P':-1, 'S':0, 'T':-1, 'W':-3, 'Y':-2, 'V':-2, + 'B':1, 'Z':4, }, +} + +//Realign +type FloatRow []float64 +type FloatMatrix []FloatRow +type IntRow []int +type IntMatrix []IntRow +func InitializeFloatMatrix(size_a int, size_b int) *FloatMatrix { + float_matrix := make(FloatMatrix, size_a) + for i, _ := range(float_matrix) { + float_matrix[i] = make(FloatRow, size_b) + } + return &float_matrix +} +func InitializeIntMatrix(size_a int, size_b int) *IntMatrix { + int_matrix := make(IntMatrix, size_a) + for i, _ := range(int_matrix) { + int_matrix[i] = make(IntRow, size_b) + } + return &int_matrix +} +func AlignMatrix(equivalence_matrix *FloatMatrix) (FloatMatrix, int, float64) { + number_of_residues_a := len(*equivalence_matrix) + number_of_residues_b := len((*equivalence_matrix)[0]) + //Constants + bog := 0.0 + beg := 0.0 + iog := 5.0 + ieg := 1.0 + + //Initialize matrices + D := InitializeFloatMatrix(number_of_residues_a+1, number_of_residues_b+1) + E := InitializeFloatMatrix(number_of_residues_a+1, number_of_residues_b+1) + F := InitializeFloatMatrix(number_of_residues_a+1, number_of_residues_b+1) + P1 := InitializeIntMatrix(number_of_residues_a+1, number_of_residues_b+1) + P2 := InitializeIntMatrix(number_of_residues_a+1, number_of_residues_b+1) + pE := InitializeIntMatrix(number_of_residues_a+1, number_of_residues_b+1) + pF := InitializeIntMatrix(number_of_residues_a+1, number_of_residues_b+1) + + //Fill matrices + for i := 0; i <= number_of_residues_a; i++ { + if i != number_of_residues_a { + (*D)[i][number_of_residues_b] = + -1 * (bog + float64(number_of_residues_a - 1 - i) * beg) + (*P1)[i][number_of_residues_b] = number_of_residues_a + (*P2)[i][number_of_residues_b] = number_of_residues_a + } + (*E)[i][number_of_residues_b] = -2000.0 + (*F)[i][number_of_residues_b] = -2000.0 + (*pE)[i][number_of_residues_b] = number_of_residues_a + (*pF)[i][number_of_residues_b] = number_of_residues_a + } + + for i := 0; i <= number_of_residues_b; i++ { + if i != number_of_residues_b { + (*D)[number_of_residues_a][i] = + -1 * (bog + float64(number_of_residues_b - 1 - i) * beg) + (*P1)[number_of_residues_a][i] = number_of_residues_b + (*P2)[number_of_residues_a][i] = number_of_residues_b + } + (*E)[number_of_residues_a][i] = -2000.0 + (*F)[number_of_residues_a][i] = -2000.0 + (*pE)[number_of_residues_a][i] = number_of_residues_b + (*pF)[number_of_residues_a][i] = number_of_residues_b + } + + for i := 0; i < number_of_residues_a; i++ { + for j := 0; j < number_of_residues_b; j++ { + similarity := (*equivalence_matrix)[i][j] + (*D)[i][j] = similarity + } + } + + //Solv_Rec + for i := number_of_residues_a - 1; i >= 0; i-- { + gp1o := iog + gp1e := ieg + if i == 0 { + gp1o = bog + gp1e = beg + } + for j := number_of_residues_b - 1; j >= 0; j-- { + gp2o := iog + gp2e := ieg + if j == 0 { + gp2o = bog + gp2e = beg + } + + //Determine E + d1 := (*E)[i+1][j] - gp2e + d2 := (*D)[i+1][j] - gp2o + if d1 > d2 { + (*E)[i][j] = d1 + (*pE)[i][j] = (*pE)[i+1][j] + } else { + (*E)[i][j] = d2 + (*pE)[i][j] = i+1 + } + //Determine F + d1 = (*F)[i][j+1] - gp1e + d2 = (*D)[i][j+1] - gp1o + if d1 > d2 { + (*F)[i][j] = d1; + (*pF)[i][j] = (*pF)[i][j+1] + } else { + (*F)[i][j] = d2; + (*pF)[i][j] = j+1 + } + //Determine D + Mx := 0.0 + if (*E)[i][j] > (*F)[i][j] { + Mx = (*E)[i][j] + (*P1)[i][j] = (*pE)[i][j] + (*P2)[i][j] = j + } else { + Mx = (*F)[i][j] + (*P1)[i][j] = i + (*P2)[i][j] = (*pF)[i][j] + } + + d1 = (*D)[i][j] + (*D)[i+1][j+1] + if d1 >= Mx { + (*D)[i][j] = d1 + (*P1)[i][j] = i+1 + (*P2)[i][j] = j+1 + } else { + (*D)[i][j] = Mx + } + } + } + + //MxSc := D + + //Bck_Trk + Dal := make([]IntRow, 2) + Dal[0] = make(IntRow, 30000) + Dal[1] = make(IntRow, 30000) + + i := 0 + j := 0 + Alen := 0 + for i < number_of_residues_a && j < number_of_residues_b { + if i == (*P1)[i][j] && j != (*P2)[i][j] { + for k := j; k < (*P2)[i][j]; k++ { + Dal[0][Alen] = -10 + Dal[1][Alen] = k + Alen += 1 + } + } else if i != (*P1)[i][j] && j == (*P2)[i][j] { + for k := i; k < (*P1)[i][j]; k++ { + Dal[0][Alen] = k + Dal[1][Alen] = -10 + Alen += 1 + } + } else if (*P1)[i][j] == i+1 && (*P2)[i][j] == j+1 { + Dal[0][Alen] = i + Dal[1][Alen] = j + Alen += 1 + } + l := i + i = (*P1)[i][j] + j = (*P2)[l][j] + } + + if i == number_of_residues_a && j < number_of_residues_b { + for k := j; k < number_of_residues_b; k++ { + Dal[0][Alen] = -10 + Dal[1][Alen] = k + Alen += 1 + } + } else if i < number_of_residues_a && j == number_of_residues_b { + for k := i; k < number_of_residues_a; k++ { + Dal[0][Alen] = k + Dal[1][Alen] = -10 + Alen += 1 + } + } + + Ial := make([]IntRow, 2) + for i := 0; i < 2; i++ { + Ial[i] = make(IntRow, Alen) + for j := 0; j < Alen; j++ { + Ial[i][j] = Dal[i][j] + } + } + + //Format results + //NOTE: This has been modified so that iner and map12 now are stored in floats! + nalign := 0 + sim_tot := 0.0 + iner := make(FloatRow, number_of_residues_a+number_of_residues_b) + map12 := make(FloatMatrix, 0, number_of_residues_a+number_of_residues_b) + for j := 0; j < Alen; j++ { + k1 := Ial[0][j] + k2 := Ial[1][j] + iner[j] = 0 + if k1 >= 0 && k2 >= 0 { + iner[j] = (*equivalence_matrix)[k1][k2] + if iner[j] > 0.0 { + nalign += 1 + sim_tot += iner[j] + } + //fmt.Printf("REALGN %d %d %d\n", k1, k2, iner[j]) + map12 = append(map12, FloatRow{float64(k1), float64(k2), iner[j]}) + } else if k1 >= 0 { + //fmt.Printf("REALGN %d - 0\n", k1) + map12 = append(map12, FloatRow{float64(k1), -1, -1}) + } else if k2 >= 0 { + //fmt.Printf("REALGN - %d 0\n", k2) + map12 = append(map12, FloatRow{-1, float64(k2), -1}) + } + } + return map12, nalign, sim_tot +} + +//FASTA +type FASTASequence struct { + Label string + Sequence string +} + +func NewScannerLarge(file_path string) (*os.File, *bufio.Scanner) { + file, err := os.Open(file_path) + check(err) + scanner := bufio.NewScanner(file) + buffer_size := 10*1024*1024 //10 MB buffer + scanner_buffer := make([]byte, 0, buffer_size) //10 MB buffer + scanner.Buffer(scanner_buffer, buffer_size) + return file, scanner +} + +func ParseFASTA(path string) []FASTASequence { + sequences := make([]FASTASequence, 0, 10000) + label := "" + buffer := bytes.Buffer{} + file, scanner := NewScannerLarge(path) + defer file.Close() + //Parse sequences delimited by new sequences + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if line[0] == '>' { + sequence := buffer.String() + if sequence != "" { + sequences = append(sequences, FASTASequence{label, sequence}) + } + buffer.Reset() + label = line[1:] + } else { + buffer.WriteString(line) + } + } + //Parse final sequence + sequence := buffer.String() + if sequence != "" { + sequences = append(sequences, FASTASequence{label, sequence}) + } + return sequences +} + +//Get domains for chain +func get_chain_domains(dash_url string, dash_input DASHInput) []RESTDomain { + unique_domains := make(map[string]RESTDomain) + response := http_query("GET", + fmt.Sprintf(DASHChainDomainsURL(dash_url), dash_input.PDBID), nil) + + defer func() { + io.Copy(ioutil.Discard, response.Body) + response.Body.Close() + response.Close = true + }() + scanner := bufio.NewScanner(response.Body) + for scanner.Scan() { + json_bytes := scanner.Bytes() + var domain RESTDomain + err := json.Unmarshal(json_bytes, &domain) + check(err) + if domain.StatusCode != -1 { + fatal(domain) + } + domain.ResidueNumberInts = parse_residue_numbers(domain.ResidueNumbers) + for _, residue_number := range(domain.ResidueNumberInts) { + if residue_number >= dash_input.Start && residue_number <= dash_input.End { + _, exist := unique_domains[domain.DomainID] + if !exist { + unique_domains[domain.DomainID] = domain + } + } + } + } + + domains := make([]RESTDomain, 0, len(unique_domains)) + for _, domain := range(unique_domains) { + domains = append(domains, domain) + } + return domains +} + +//Get chain/domain and self-alignments +func get_chain(dash_url string, pdb_id string) RESTChain { + var chain RESTChain + response := http_query("GET", fmt.Sprintf(DASHChainURL(dash_url), pdb_id), nil) + defer func() { + io.Copy(ioutil.Discard, response.Body) + response.Body.Close() + response.Close = true + }() + json_bytes, err := ioutil.ReadAll(response.Body) + err = json.Unmarshal(json_bytes, &chain) + check(err) + if chain.StatusCode != -1 { + fatal(chain) + } + return chain +} + +func get_chain_self_alignment(dash_url string, pdb_id string) RESTAlignment { + chain := get_chain(dash_url, pdb_id) + var alignment RESTAlignment + alignment.ID1 = chain.PDBID + alignment.ID2 = chain.PDBID + alignment.PRIMS1 = replace_non_standard_residues(chain.Sequence) + alignment.PRIMS2 = alignment.PRIMS1 + alignment.SECOS1 = strings.Repeat(" ", len(chain.Sequence)) + alignment.SECOS2 = alignment.SECOS1 + alignment.EQUIVALENCE = strings.Repeat("9", len(chain.Sequence)) + return alignment +} + +func parse_domain_alignment(json_string string) RESTAlignment { + var alignment RESTAlignment + err := json.Unmarshal([]byte(json_string), &alignment) + check(err) + if alignment.StatusCode == -1 { + alignment.PRIMS1 = replace_non_standard_residues(alignment.PRIMS1) + alignment.PRIMS2 = replace_non_standard_residues(alignment.PRIMS2) + } else if alignment.StatusCode == 17 { + alignment.LOWSIMILARITY = true + } else { + non_fatal(alignment) + } + return alignment +} + +func dummy_prims(prims string, start int, end int) (string, int, int) { + //Create new dummy of prims with all gaps + new_prims_bytes := make([]byte, len(prims)) + for i, _ := range(new_prims_bytes) { + new_prims_bytes[i] = '-' + } + //Fill in only residues between start and end, save indices to slice later + start_index := -1 + end_index := -1 + count := 0 + for i := 0; i < len(prims); i++ { + if count > end { + break + } + if prims[i] != '-' { + count += 1 + } + if prims[i] != '-' && count >= start && count <= end { + new_prims_bytes[i] = prims[i] + } + if count == start && start_index == -1 { + start_index = i + } + if count == end && end_index == -1 { + end_index = i + } + } + return string(new_prims_bytes), start_index, end_index+1 +} + +func slice_alignment(alignment RESTAlignment, + query_start int, query_end int, subject_start int, subject_end int) RESTAlignment { + new_query_prims, start_index, end_index := + dummy_prims(alignment.PRIMS1, query_start, query_end) + new_subject_prims, subject_start_index, subject_end_index := + dummy_prims(alignment.PRIMS2, subject_start, subject_end) + alignment.PRIMS1 = new_query_prims + alignment.PRIMS2 = new_subject_prims + if subject_start_index < start_index { + start_index = subject_start_index + } + if subject_end_index > end_index { + end_index = subject_end_index + } + alignment.PRIMS1 = alignment.PRIMS1[start_index:end_index] + alignment.PRIMS2 = alignment.PRIMS2[start_index:end_index] + alignment.SECOS1 = alignment.SECOS1[start_index:end_index] + alignment.SECOS2 = alignment.SECOS2[start_index:end_index] + alignment.EQUIVALENCE = alignment.EQUIVALENCE[start_index:end_index] + new_equivalence_bytes := make([]byte, len(alignment.EQUIVALENCE)) + for i := 0; i < len(alignment.PRIMS1); i++ { + if alignment.PRIMS1[i] != '-' && alignment.PRIMS2[i] != '-' { + new_equivalence_bytes[i] = alignment.EQUIVALENCE[i] + } else { + new_equivalence_bytes[i] = '0' + } + } + alignment.EQUIVALENCE = string(new_equivalence_bytes) + new_score := 0 + for _, equivalence_byte := range(new_equivalence_bytes) { + equivalence, err := strconv.Atoi(string(equivalence_byte)) + check(err) + new_score += equivalence + } + alignment.SCORE = new_score + return alignment +} + +//Output formatting functions +func format_alignment_legacy(alignment RESTAlignment) string { + lines := make([]string, 0, 10) + if alignment.LOWSIMILARITY { + lines = append(lines, + fmt.Sprintf("Query %s Template %s lowsimilarity", + alignment.ID1, alignment.ID2)) + } else { + lines = append(lines, fmt.Sprintf("Query %s Template %s", + alignment.ID1, alignment.ID2)) + } + lines = append(lines, fmt.Sprintf("QUERY %s", alignment.PRIMS1)) + lines = append(lines, fmt.Sprintf("QUERY %s", alignment.SECOS1)) + lines = append(lines, fmt.Sprintf("TEMPL %s", alignment.PRIMS2)) + lines = append(lines, fmt.Sprintf("TEMPL %s", alignment.SECOS2)) + lines = append(lines, fmt.Sprintf("Equivalence %s", alignment.EQUIVALENCE)) + lines = append(lines, "") + return strings.Join(lines, "\n") +} + +func average_over_window(equivalences *[]float64, index int, lookaround int) float64 { + if lookaround == 0 { + return (*equivalences)[index] + } + start := index - lookaround + if start < 0 { + start = 0 + } + end := index + lookaround + 1 + if end > len(*equivalences) { + end = len(*equivalences) + } + total := 0.0 + count := 0.0 + for i := start; i < end; i++ { + equivalence := (*equivalences)[i] + if equivalence > 0 { + total += equivalence + count += 1.0 + } + } + return total/count +} + +func output_alignment_hat3(hat3_file *os.File, + query_index int, template_index int, query string, + template string, equivalence_string string, equivalence_threshold float64, + equivalence_scale float64, minimum_segment_length int, + equivalence_lookaround int) { + + equivalences := make([]float64, len(query)) + equivalence_mask := make([]bool, len(query)) + //Parse equivalence, enforce threshold, rescale equivalence, multiply by scale + for i := 0; i < len(query); i++ { + equivalence_int, err := strconv.Atoi(string(equivalence_string[i])) + check(err) + equivalence := float64(equivalence_int) + + if equivalence >= equivalence_threshold { + equivalence := (equivalence - equivalence_threshold+1) / + (9 - equivalence_threshold+1) * 9.0 + equivalence = equivalence * equivalence_scale + equivalences[i] = equivalence + } + } + + //Make a mask based on minimum segment length + last_zero_index := -1 + last_index := len(equivalences) - 1 + for x, equivalence := range(equivalences) { + //Case where the end of a segment is a 0 equivalence + if equivalence <= 0 { + var start_index int + var length int + if last_zero_index == -1 { + //If there is no last zero index + length = x + start_index = 0 + } else { + //If there is + length = x - last_zero_index - 1 + start_index = last_zero_index + 1 + } + //Fill mask if long enough + if length >= minimum_segment_length { + for start_index < x { + equivalence_mask[start_index] = true + start_index += 1 + } + } + //Set this as the previous index with a zero + last_zero_index = x + //Special case for when the alignment ends without a zero equivalence + } else if x == last_index { + var start_index int + var length int + if last_zero_index == -1 { + //If there is no last zero index then the length is the whole thing + length = len(equivalences) + start_index = 0 + } else { + //If there is + length = x - last_zero_index + start_index = last_zero_index + 1 + } + //Fill mask if long enough + if length >= minimum_segment_length { + for start_index <= x { + equivalence_mask[start_index] = true + start_index += 1 + } + } + } + } + + //Compute final equivalence and construct line + lines := make([]string, 0, len(query)) + query_i := -1 + template_i := -1 + for i := 0; i < len(query); i++ { + if query[i] != '-' { + query_i += 1 + } + if template[i] != '-' { + template_i += 1 + } + if equivalence_mask[i] { + windowed_equivalence := average_over_window(&equivalences, i, + equivalence_lookaround) + lines = append(lines, fmt.Sprintf("%d %d 1 %0.5f %d %d %d %d k", + query_index, template_index, windowed_equivalence, + query_i, query_i, template_i, template_i)) + } + } + + if len(lines) > 0 { + fmt.Fprintln(hat3_file, strings.Join(lines, "\n")) + } +} + +func replace_non_standard_residues(sequence string) string { + sequence = strings.ToUpper(sequence) + sequence = strings.Replace(sequence, "U", "X", -1) + sequence = strings.Replace(sequence, "J", "X", -1) + sequence = strings.Replace(sequence, "O", "X", -1) + return sequence +} + +func filter_sequences_and_hat3(sequence_file_path string, hat3_path string, + minimum_alignment_percent float64) { + //Read Sequence Data and Save Indexes + sequence_data := make([]Sequence, 0, 10000) + sequence_file, err := os.Open(sequence_file_path) + check(err) + scanner := bufio.NewScanner(sequence_file) + for scanner.Scan() { + id := strings.TrimSpace(scanner.Text())[1:] + scanner.Scan() + sequence := strings.TrimSpace(scanner.Text()) + sequence_data = append(sequence_data, Sequence{id, sequence}) + } + sequence_file.Close() + + //Read hat3 file to see which ID's were used + hat3_file, err := os.Open(hat3_path) + check(err) + scanner = bufio.NewScanner(hat3_file) + old_hat3_id_map := make(map[int][]int) + previous_query_index := -1 + previous_subject_index := -1 + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + fields := strings.Fields(line) + query_index, err := strconv.Atoi(fields[0]) + check(err) + subject_index, err := strconv.Atoi(fields[1]) + check(err) + if query_index != previous_query_index || + subject_index != previous_subject_index { + old_hat3_id_map[query_index] = + append(old_hat3_id_map[query_index], subject_index) + old_hat3_id_map[subject_index] = + append(old_hat3_id_map[subject_index], query_index) + previous_query_index = query_index + previous_subject_index = subject_index + } + } + hat3_file.Close() + + //Append alignment counts to ID's + for query_index, subject_indexes := range(old_hat3_id_map) { + sequence_data[query_index].Label += fmt.Sprintf("||%d", len(subject_indexes)) + } + + //Filter least-used sequences from hat3 + alignment_count_cutoff := + int(float64(len(old_hat3_id_map))*minimum_alignment_percent/100.0) + filtered_old_hat3_index_map := make(map[int]bool) + for query_index, subject_indexes := range(old_hat3_id_map) { + if len(subject_indexes) >= alignment_count_cutoff { + filtered_old_hat3_index_map[query_index] = true + for _, subject_index := range(subject_indexes) { + if len(old_hat3_id_map[subject_index]) >= alignment_count_cutoff { + filtered_old_hat3_index_map[subject_index] = true + } + } + } + } + + //Make map from new to old indexes + existing_hat3_indexes := make([]int, 0, len(old_hat3_id_map)) + for i, _ := range(filtered_old_hat3_index_map) { + existing_hat3_indexes = append(existing_hat3_indexes, i) + } + sort.Ints(existing_hat3_indexes) + hat3_id_map_old_new := make(map[int]int) + for new_index, old_index := range(existing_hat3_indexes) { + hat3_id_map_old_new[old_index] = new_index + } + + //Write new hat3 file + new_hat3_path := fmt.Sprintf("%s_cleaned", hat3_path) + new_hat3_file, err := os.Create(new_hat3_path) + check(err) + hat3_file, err = os.Open(hat3_path) + check(err) + scanner = bufio.NewScanner(hat3_file) + for scanner.Scan() { + fields := strings.Fields(strings.TrimSpace(scanner.Text())) + query_index, err := strconv.Atoi(fields[0]) + check(err) + subject_index, err := strconv.Atoi(fields[1]) + check(err) + new_query_index, new_query_index_exist := + hat3_id_map_old_new[query_index] + new_subject_index, new_subject_index_exist := + hat3_id_map_old_new[subject_index] + if new_query_index_exist && new_subject_index_exist { + fields[0] = fmt.Sprintf("%d", new_query_index) + fields[1] = fmt.Sprintf("%d", new_subject_index) + fmt.Fprintln(new_hat3_file, strings.Join(fields, " ")) + } + } + hat3_file.Close() + new_hat3_file.Close() + + //Write Cleaned Sequences + new_sequence_file, err := os.Create(sequence_file_path) + check(err) + defer new_sequence_file.Close() + for _, old_index := range(existing_hat3_indexes) { + sequence := sequence_data[old_index] + sequence_lines := fmt.Sprintf(">%s\n%s", sequence.Label, sequence.Sequence) + fmt.Fprintln(new_sequence_file, sequence_lines) + } + //Move new hat3 to old hat3 + err = os.Rename(new_hat3_path, hat3_path) + check(err) +} + +func main() { + fmt.Println("------------------") + fmt.Println("MAFFT-DASH Client v", VersionNumber) + fmt.Println("------------------") + //Parse flags + var help bool + var input_path string + var hat3_output_path string + var alignments_output_path string + var sequences_output_path string + var slice bool + var filter float64 + var equivalence_threshold float64 + var equivalence_scale float64 + var blosum_alpha float64 + var structure_only bool + var minimum_segment_length int + var equivalence_lookaround int + var template_list_path string + var dash_url string + flag.BoolVar(&help, "help", false, "Display this help message.") + flag.StringVar(&input_path, "i", "", + fmt.Sprintf("Path to FASTA sequence file. (REQUIRED!) (Limit of %d sequences)", + SequenceLimit)) + flag.StringVar(&dash_url, "url", "https://sysimm.org/dash/REST1.0/", + "URL for DASH REST service.") + flag.StringVar(&template_list_path, "templates", "", + "Path to explicit list of DASH templates (Debug-only).") + flag.BoolVar(&slice, "slice", true, + "Slice alignments/sequences according to start/end positions.") + flag.Float64Var(&filter, "filter", 22.5, + "Filter sequences/hat3 where sequence is aligned to less than this percentage of the inputs.") + flag.Float64Var(&equivalence_threshold, "threshold", 1.0, + "Only use equivalence values >= this value for hat3.") + flag.Float64Var(&equivalence_scale, "scale", 1.0, + "Multiply equivalence values by this value before outputting to hat3.") + flag.IntVar(&minimum_segment_length, "length", 5, + "Only use equivalences when the number of consecutive residues >= the threshold are >= this length.") + flag.IntVar(&equivalence_lookaround, "lookaround", 0, + "Output the average of this many surrounding values instead of raw equivalence. (default 0)") + flag.StringVar(&hat3_output_path, "hat3", "./hat3", "Output path for hat3 file.") + flag.StringVar(&alignments_output_path, "alignments", "./dash_alignments", + "Output path for raw alignments for debug purposes.") + flag.StringVar(&sequences_output_path, "sequences", "./dash_sequences.fa", + "Output path for template sequences for debug purposes.") + flag.Float64Var(&blosum_alpha, "alpha", 0.75, "Background sequence BLOSUM multiplier.") + flag.BoolVar(&structure_only, "structure-only", false, + "Output alignments with only residues which exist in the structure. Sets BLOSUM Alpha to 0.0") + flag.Parse() + if input_path == "" && template_list_path == "" { + fmt.Println( + "Please submit a FASTA sequence file with -i or a template list with -templates.") + fmt.Println("------------------") + flag.PrintDefaults() + os.Exit(0) + } + if help { + flag.PrintDefaults() + os.Exit(0) + } + if structure_only { + blosum_alpha = 0.0 + } + fmt.Println("Querying from", dash_url) + + //Parse sequences and query DASH for representatives + sequences := []FASTASequence{} + if input_path != "" { + sequences = ParseFASTA(input_path) + if len(sequences) > SequenceLimit { + fatal(fmt.Sprintf("Number of sequences greater than sequence limit of %d.", + SequenceLimit)) + } + } + template_list_buffer := bytes.Buffer{} + if template_list_path != "" { + //Parse template list into JSON so that it's the same format as what the + //server would return + fmt.Println("Using local template list from", template_list_path) + template_list, err := os.Open(template_list_path) + check(err) + scanner := bufio.NewScanner(template_list) + i := 0 + for scanner.Scan() { + i += 1 + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + split_line := strings.Split(line, "||") + if len(split_line) != 3 { + fatal(fmt.Sprintf("Line %d contains wrong number of fields.", i)) + } + id := split_line[0] + start, err := strconv.Atoi(split_line[1]) + check(err) + end, err := strconv.Atoi(split_line[2]) + check(err) + object := RESTSearch{-1, "", id, start, end} + object_bytes, err := json.Marshal(object) + check(err) + _, err = template_list_buffer.Write(object_bytes) + check(err) + _, err = template_list_buffer.WriteString("\n") + check(err) + } + template_list.Close() + } else if input_path != "" { + //Write request body for template selection + fmt.Println("Building query for template selection.") + request_body := bytes.Buffer{} + for i, sequence := range(sequences) { + //Use index if labels don't exist + label := fmt.Sprintf("%d", i) + if sequence.Label != "" { + label = sequence.Label + } + _, err := request_body.WriteString(fmt.Sprintf(">%s\n%s\n", + label, sequence.Sequence)) + check(err) + } + //Send query + fmt.Println("Sending query for template selection...") + response := http_query("POST", DASHChainSearchURL(dash_url), &request_body) + _, err := io.Copy(&template_list_buffer, response.Body) + check(err) + io.Copy(ioutil.Discard, response.Body) + response.Body.Close() + fmt.Println("Waiting for response from server...") + } + + //Parse results for template selection + dash_inputs := make([]DASHInput, 0, 10*len(sequences)) + id_map := make(map[string]bool) + scanner := bufio.NewScanner(&template_list_buffer) + for scanner.Scan() { + json_bytes := scanner.Bytes() + var result RESTSearch + err := json.Unmarshal(json_bytes, &result) + check(err) + if result.StatusCode != -1 { + fatal(result) + } + var dash_input DASHInput + dash_input.FullID = + fmt.Sprintf("%s||%d||%d", result.ID, result.Start, result.End) + dash_input.PDBID = result.ID + dash_input.Start = result.Start + dash_input.End = result.End + _, exists := id_map[dash_input.FullID] + if !exists { + dash_inputs = append(dash_inputs, dash_input) + id_map[dash_input.FullID] = true + } + } + + sort.Slice(dash_inputs, func(i, j int) bool { + return dash_inputs[i].FullID < dash_inputs[j].FullID + }) + + //Split chains into domains + dash_input_map := make(map[string][]DASHInput) + dash_domain_id_map := make([]string, 0, 10000) + for i, dash_input := range(dash_inputs) { + if i % 25 == 0 { + percent := i*100/len(dash_inputs) + fmt.Printf("Querying DASH for domains - [%d%%]\n", percent) + } + dash_input.Hat3Index = i + dash_input.Domains = get_chain_domains(dash_url, dash_input) + for _, domain := range(dash_input.Domains) { + _, exist := dash_input_map[domain.DomainID] + if !exist { + dash_domain_id_map = append(dash_domain_id_map, domain.DomainID) + } + dash_input_map[domain.DomainID] = + append(dash_input_map[domain.DomainID], dash_input) + } + dash_inputs[i] = dash_input + } + fmt.Printf("Querying DASH for domains - [100%%]\n") + + //Open output files + sequences_output_file, err := os.Create(sequences_output_path) + check(err) + alignments_output_file, err := os.Create(alignments_output_path) + check(err) + hat3_output_file, err := os.Create(hat3_output_path) + check(err) + + //Get sequences and self-alignments + for i, dash_input := range(dash_inputs) { + if i % 25 == 0 { + percent := i*100/len(dash_inputs) + fmt.Printf("Querying DASH for sequences - [%d%%]\n", percent) + } + raw_alignment := get_chain_self_alignment(dash_url, dash_input.PDBID) + alignment := raw_alignment + if slice { + alignment = slice_alignment(alignment, + dash_input.Start, dash_input.End, + dash_input.Start, dash_input.End) + } + dash_inputs[i].Sequence = alignment.PRIMS1 + fmt.Fprintln(sequences_output_file, + fmt.Sprintf(">DASH_%s\n%s", + dash_input.FullID, alignment.PRIMS1)) + alignment.ID1 = dash_input.FullID + alignment.ID2 = dash_input.FullID + fmt.Fprintln(alignments_output_file, + format_alignment_legacy(alignment)) + } + fmt.Printf("Querying DASH for sequences - [100%%]\n") + + //Batch alignment downloads in groups based on alignment limit + alignment_map := make(map[string]RESTAlignment) + request_body := bytes.Buffer{} + alignment_count := 0 + chunk_index := 0 + number_of_domains := len(dash_domain_id_map) + number_of_domain_alignments := (number_of_domains*(number_of_domains-1)/2) + for x := 0; x < len(dash_domain_id_map); x++ { + for y := x + 1; y < len(dash_domain_id_map); y++ { + _, err := request_body.WriteString(fmt.Sprintf("%s_%s\n", + dash_domain_id_map[x], dash_domain_id_map[y])) + check(err) + alignment_count += 1 + if alignment_count >= AlignmentLimit { + current_progress := chunk_index*AlignmentLimit + current_percent := current_progress*100/number_of_domain_alignments + fmt.Printf("Downloading alignments - [%d%%]\n", current_percent) + //Submit to server + response := http_query("POST", + DASHDomainAlignmentURL(dash_url), &request_body) + scanner = bufio.NewScanner(response.Body) + //Parse results + for scanner.Scan() { + alignment := parse_domain_alignment(scanner.Text()) + if alignment.StatusCode == -1 { + alignment_id := alignment.ID1 + "_" + alignment.ID2 + alignment_map[alignment_id] = alignment + } + } + //Reset + chunk_index += 1 + io.Copy(ioutil.Discard, response.Body) + response.Body.Close() + alignment_count = 0 + request_body.Reset() + } + } + } + //Get remaining alignments + if alignment_count > 0 { + current_progress := chunk_index*AlignmentLimit + current_percent := current_progress*100/number_of_domain_alignments + fmt.Printf("Downloading alignments - [%d%%]\n", current_percent) + //Submit to server + response := http_query("POST", + DASHDomainAlignmentURL(dash_url), &request_body) + scanner = bufio.NewScanner(response.Body) + //Parse results + for scanner.Scan() { + alignment := parse_domain_alignment(scanner.Text()) + if alignment.StatusCode == -1 { + alignment_id := alignment.ID1 + "_" + alignment.ID2 + alignment_map[alignment_id] = alignment + } + } + io.Copy(ioutil.Discard, response.Body) + response.Body.Close() + } + fmt.Printf("Downloading alignments - [100%%]\n") + + //Combine domain alignments into full chain alignments + number_of_chains := len(dash_inputs) + number_of_chain_alignments := (number_of_chains*(number_of_chains-1)/2) + alignment_count = 0 + for x := 0; x < len(dash_inputs); x++ { + for y := x + 1; y < len(dash_inputs); y++ { + if alignment_count % AlignmentLimit == 0 { + current_percent := alignment_count*100/number_of_chain_alignments + fmt.Printf("Combining domain alignments - [%d%%]\n", current_percent) + } + alignment_count += 1 + dash_input_a := dash_inputs[x] + dash_input_b := dash_inputs[y] + size_a := len(dash_input_a.Sequence) + size_b := len(dash_input_b.Sequence) + //Initialize equivalence matrix with BLOSUM + equivalence_matrix := InitializeFloatMatrix(size_a, size_b) + low_similarity := true + for x, query_residue := range dash_input_a.Sequence { + for y, template_residue := range dash_input_b.Sequence { + blosum_score := + float64(BLOSUM62[byte(query_residue)][byte(template_residue)]) + if blosum_score > 0 { + //Re-scale BLOSUM scores to RASH's 0-9.99 scale + blosum_score = blosum_score / float64(BLOSUM62Max) * 9.999 + //Multiply by a factor to control the influence + (*equivalence_matrix)[x][y] = blosum_score * blosum_alpha + } + } + } + for _, domain_a := range(dash_input_a.Domains) { + for _, domain_b := range(dash_input_b.Domains) { + //Fill matrix with equivalence data for realignment + alignment_id := domain_a.DomainID + "_" + domain_b.DomainID + alignment, exist := alignment_map[alignment_id] + if !exist { + alignment_id = domain_b.DomainID + "_" + domain_a.DomainID + alignment, exist = alignment_map[alignment_id] + if exist { + alignment.Reverse() + } + } + + if exist { + low_similarity = false + index_a := -1 + index_b := -1 + for i := 0; i < len(alignment.PRIMS1); i++ { + if alignment.PRIMS1[i] != '-' { index_a += 1 } + if alignment.PRIMS2[i] != '-' { index_b += 1 } + if alignment.PRIMS1[i] != '-' && alignment.PRIMS2[i] != '-' { + matrix_index_a := + domain_a.ResidueNumberInts[index_a] - dash_input_a.Start + matrix_index_b := + domain_b.ResidueNumberInts[index_b] - dash_input_b.Start + equivalence, err := + strconv.ParseFloat(string(alignment.EQUIVALENCE[i]), 64) + check(err) + if matrix_index_a >= 0 && matrix_index_a < size_a && + matrix_index_b >= 0 && matrix_index_b < size_b { + (*equivalence_matrix)[matrix_index_a][matrix_index_b] = + equivalence + } + } + } + } + } + } + + //Construct alignment from realignment + aligned_matrix, _, _ := AlignMatrix(equivalence_matrix) + PRIMS1_bytes := []byte(strings.Repeat("-", len(aligned_matrix))) + PRIMS2_bytes := []byte(strings.Repeat("-", len(aligned_matrix))) + EQUIVALENCE_bytes := []byte(strings.Repeat("0", len(aligned_matrix))) + for i, row := range(aligned_matrix) { + index_a := int(row[0]) + index_b := int(row[1]) + equivalence := strconv.Itoa(int(row[2])) + if index_a != -1 && index_b != -1 { + EQUIVALENCE_bytes[i] = equivalence[0] + } + if index_a != -1 { + PRIMS1_bytes[i] = dash_input_a.Sequence[index_a] + } + if index_b != -1 { + PRIMS2_bytes[i] = dash_input_b.Sequence[index_b] + } + } + var alignment RESTAlignment + alignment.ID1 = dash_input_a.FullID + alignment.ID2 = dash_input_b.FullID + alignment.PRIMS1 = string(PRIMS1_bytes) + alignment.PRIMS2 = string(PRIMS2_bytes) + alignment.SECOS1 = strings.Repeat(" ", len(aligned_matrix)) + alignment.SECOS2 = alignment.SECOS1 + alignment.EQUIVALENCE = string(EQUIVALENCE_bytes) + alignment.LOWSIMILARITY = low_similarity + + //Output alignment and hat3 + fmt.Fprintln(alignments_output_file, + format_alignment_legacy(alignment)) + if !alignment.LOWSIMILARITY { + output_alignment_hat3(hat3_output_file, + dash_input_a.Hat3Index, dash_input_b.Hat3Index, + alignment.PRIMS1, alignment.PRIMS2, + alignment.EQUIVALENCE, equivalence_threshold, + equivalence_scale, minimum_segment_length, + equivalence_lookaround) + } + } + } + fmt.Printf("Combining domain alignments - [100%%]\n") + + //Filter unused sequences from hat3 and sequences file which are below the threshold + fmt.Println("Filtering structural restraint(hat3) file...") + sequences_output_file.Close() + hat3_output_file.Close() + filter_sequences_and_hat3(sequences_output_path, hat3_output_path, filter) + + //Combine original sequences with DASH sequences + fmt.Println("Combining original sequences with DASH sequences...") + dash_sequences := ParseFASTA(sequences_output_path) + final_sequence_file, err := os.Create(sequences_output_path) + check(err) + for _, sequence := range(dash_sequences) { + fmt.Fprintln(final_sequence_file, + fmt.Sprintf(">%s\n%s", sequence.Label, sequence.Sequence)) + } + for _, sequence := range(sequences) { + fmt.Fprintln(final_sequence_file, + fmt.Sprintf(">%s\n%s", sequence.Label, sequence.Sequence)) + } + final_sequence_file.Close() + + //Final user output + fmt.Println("------------------") + fmt.Println("Ready to run MAFFT:") + fmt.Println(" mafft --seedtable", hat3_output_path, + "--localpair", "--maxiterate 100", sequences_output_path) +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/defs.c b/mafft/src/mafft-7.487-with-extensions/core/defs.c new file mode 100644 index 0000000000..42b0ea68b6 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/defs.c @@ -0,0 +1,175 @@ +#include "mltaln.h" +#include "dp.h" + +TLS int commonAlloc1 = 0; +TLS int commonAlloc2 = 0; +TLS int **commonIP = NULL; +TLS int **commonJP = NULL; +int nthread = 1; +int nthreadpair = 1; +int randomseed = 0; +int parallelizationstrategy = BAATARI1; + + +char modelname[500]; +int njob, nlenmax; +int amino_n[0x100]; +char amino_grp[0x100]; +//int amino_dis[0x100][0x100]; +int **amino_dis = NULL; +double **n_disLN = NULL; +//double amino_dis_consweight_multi[0x100][0x100]; +double **amino_dis_consweight_multi = NULL; +int **n_dis = NULL; +int **n_disFFT = NULL; +double **n_dis_consweight_multi = NULL; +unsigned char amino[0x100]; +double polarity[0x100]; +double volume[0x100]; +int ribosumdis[37][37]; + +int ppid; +double thrinter; +double fastathreshold; +int pslocal, ppslocal; +int constraint; +int divpairscore; +int fmodel; // 1-> fmodel 0->default -1->raw +int nblosum; // 45, 50, 62, 80 +int kobetsubunkatsu; +int bunkatsu; +int dorp = NOTSPECIFIED; // arguments de shitei suruto, tbfast -> pairlocalalign no yobidashi de futsugou +int niter; +int contin; +int calledByXced; +int devide; +int scmtd; +int weight; +int utree; +int tbutree; +int refine; +int check; +double cut; +int cooling; +int trywarp = 0; +int penalty, ppenalty, penaltyLN; +int penalty_dist, ppenalty_dist; +int RNApenalty, RNAppenalty; +int RNApenalty_ex, RNAppenalty_ex; +int penalty_ex, ppenalty_ex, penalty_exLN; +int penalty_EX, ppenalty_EX; +int penalty_OP, ppenalty_OP; +int penalty_shift, ppenalty_shift; +double penalty_shift_factor = 100.0; +int RNAthr, RNApthr; +int offset, poffset, offsetLN, offsetFFT; +int scoremtx; +int TMorJTT; +char use_fft; +char force_fft; +int nevermemsave; +int fftscore; +int fftWinSize; +int fftThreshold; +int fftRepeatStop; +int fftNoAnchStop; +int divWinSize; +int divThreshold; +int disp; +int outgap = 1; +char alg; +int cnst; +int mix; +int tbitr; +int tbweight; +int tbrweight; +int disopt; +int pamN; +int checkC; +double geta2; +int treemethod; +int kimuraR; +char *swopt; +int fftkeika; +int score_check; +int makedistmtx; +char *inputfile; +char *addfile; +int addprofile = 1; +int rnakozo; +char rnaprediction; +int scoreout = 0; +int spscoreout = 0; +int outnumber = 0; +int legacygapcost = 0; +double minimumweight = 0.0005; +int nwildcard = 0; + +char *signalSM; +FILE *prep_g; +FILE *trap_g; +char **seq_g; +char **res_g; + +double consweight_multi = 1.0; +double consweight_rna = 0.0; +char RNAscoremtx = 'n'; + +TLS char *newgapstr = "-"; + +int nalphabets = 26; +int nscoredalphabets = 20; + +double specificityconsideration = 0.0; +int ndistclass = 10; +int maxdistclass = -1; + +int gmsg = 0; + +double sueff_global = SUEFF; + +double lenfaca, lenfacb, lenfacc, lenfacd; +int maxl, tsize; + + + +void initglobalvariables() +{ + commonAlloc1 = 0; + commonAlloc2 = 0; + commonIP = NULL; + commonJP = NULL; + nthread = 1; + randomseed = 0; + parallelizationstrategy = BAATARI1; + + trywarp = 0; + penalty_shift_factor = 100.0; + outgap = 1; + addprofile = 1; + scoreout = 0; + outnumber = 0; + legacygapcost = 0; + consweight_multi = 1.0; + consweight_rna = 0.0; + RNAscoremtx = 'n'; + + newgapstr = "-"; + + nalphabets = 26; + nscoredalphabets = 20; + + specificityconsideration = 0.0; + ndistclass = 10; + maxdistclass = -1; + + gmsg = 0; +} + +// for usetmpfile +int compacttree = 0; +int lhlimit = INT_MAX; +int specifictarget = 0; +int nadd = 0; // <- static in tbfast.c, pairlocalalign.c +int usenaivescoreinsteadofalignmentscore = 0; +int nthreadreadlh = 1; diff --git a/mafft/src/mafft-7.487-with-extensions/core/disttbfast.c b/mafft/src/mafft-7.487-with-extensions/core/disttbfast.c new file mode 100644 index 0000000000..e267b258ba --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/disttbfast.c @@ -0,0 +1,5254 @@ +#include "mltaln.h" + + +#define REPORTCOSTS 0 + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 +#define SKIP 1 + +#define ITERATIVECYCLE 2 + +#define END_OF_VEC -1 + +static int treein; +static int topin; +static int treeout; +static int noalign; +static int distout; +static int tuplesize; +static int subalignment; +static int subalignmentoffset; +static int nguidetree; +static int sparsepickup; +static int keeplength; +static int ndeleted; +static int mapout; +static int smoothing; +static double maxdistmtxsize; +static int nthreadtb; +static int useexternalanchors; +static int oneiteration; +static double maxanchorseparation; + +#if 0 +#define PLENFACA 0.0123 +#define PLENFACB 10252 +#define PLENFACC 10822 +#define PLENFACD 0.5 +#define DLENFACA 0.01 +#define DLENFACB 2445 +#define DLENFACC 2412 +#define DLENFACD 0.1 +#else +#define PLENFACA 0.01 +#define PLENFACB 10000 +#define PLENFACC 10000 +#define PLENFACD 0.1 +#define D6LENFACA 0.01 +#define D6LENFACB 2500 +#define D6LENFACC 2500 +#define D6LENFACD 0.1 +#define D10LENFACA 0.01 +#define D10LENFACB 1000000 +#define D10LENFACC 1000000 +#define D10LENFACD 0.0 +#endif + +typedef struct _jobtable +{ + int i; + int j; +} Jobtable; + +typedef struct _msacompactdistmtxthread_arg +{ + int njob; + int thread_no; + int *selfscore; + double **partmtx; + char **seq; + int **skiptable; + double *mindist; + int *mindistfrom; + int *jobpospt; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} msacompactdistmtxthread_arg_t; + +typedef struct _compactdistmtxthread_arg +{ + int njob; + int thread_no; + int *nogaplen; + int **pointt; + int *selfscore; + double **partmtx; + int *jobpospt; + double *mindist; + int *mindistfrom; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} compactdistmtxthread_arg_t; + +typedef struct _msadistmtxthread_arg +{ + int njob; + int thread_no; + int *selfscore; + double **iscore; + double **partmtx; + char **seq; + int **skiptable; + Jobtable *jobpospt; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} msadistmtxthread_arg_t; + +#ifdef enablemultithread +// ue futatsu ha singlethread demo tsukau +typedef struct _treebasethread_arg +{ + int thread_no; + int njob; + int *nrunpt; + int *nlen; + int *jobpospt; + int ***topol; + Treedep *dep; + double ***cpmxhist; + int **memhist; + char **aseq; + double *effarr; + int *alloclenpt; + int *fftlog; + char *mergeoralign; + double **newdistmtx; + int *selfscore; + ExtAnch *extanch; + int **anchindex; + pthread_mutex_t *mutex; + pthread_cond_t *treecond; +} treebasethread_arg_t; + +typedef struct _distancematrixthread_arg +{ + int thread_no; + int njob; + int *jobpospt; + int **pointt; + double **mtx; + pthread_mutex_t *mutex; +} distancematrixthread_arg_t; +#endif + + +void arguments( int argc, char *argv[] ) +{ + int c; + + nthread = 1; + nthreadpair = 1; + nthreadtb = 1; + outnumber = 0; + topin = 0; + treein = 0; + treeout = 0; + distout = 0; + noalign = 0; + nevermemsave = 0; + inputfile = NULL; + nadd = 0; + addprofile = 1; + fftkeika = 0; + constraint = 0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; + useexternalanchors = 0; + oneiteration = 0; + force_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'X'; + sueff_global = 0.1; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; + dorp = NOTSPECIFIED; + ppenalty_dist = NOTSPECIFIED; + ppenalty = -1530; + ppenalty_ex = NOTSPECIFIED; + penalty_shift_factor = 1000.0; + poffset = -123; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + TMorJTT = JTT; + scoreout = 0; + spscoreout = 0; + tuplesize = 6; + subalignment = 0; + subalignmentoffset = 0; + legacygapcost = 0; + specificityconsideration = 0.0; + nguidetree = 1; + sparsepickup = 0; + keeplength = 0; + mapout = 0; + smoothing = 0; + nwildcard = 0; + maxanchorseparation = 1000.0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + reporterr( "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); + reporterr( "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'V': + ppenalty_dist = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// reporterr( "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + reporterr( "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); +// reporterr( "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + reporterr( "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// reporterr( "blosum %d / kimura 200 \n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + reporterr( "jtt/kimura %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + reporterr( "tm %d\n", pamN ); + --argc; + goto nextoption; + case 'C': + nthreadpair = nthread = myatoi( *++argv ); + reporterr( "nthread = %d\n", nthread ); + reporterr( "nthreadpair = %d\n", nthread ); + if( strchr( *argv, '-' ) ) + nthreadtb = myatoi( strchr( *argv, '-' )+1 ); + else + nthreadtb = nthread; + reporterr( "nthreadtb = %d\n", nthreadtb ); + --argc; + goto nextoption; + case 's': + specificityconsideration = (double)myatof( *++argv ); +// reporterr( "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'K': + addprofile = 0; + break; + case 'y': + distout = 1; + break; + case 't': + treeout = 1; + break; + case '^': + treeout = 2; + break; + case 'T': + noalign = 1; + break; + case 'r': + oneiteration = 1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'L': + legacygapcost = 1; + break; + case 'e': + fftscore = 0; + break; + case 'x': + maxanchorseparation = myatof( *++argv ); + --argc; + goto nextoption; + case 'H': + subalignment = 1; + subalignmentoffset = myatoi( *++argv ); + --argc; + goto nextoption; +#if 0 + case 'R': + fftRepeatStop = 1; + break; +#endif + case 'n' : + outnumber = 1; + break; +#if 0 + case 's': + treemethod = 's'; + break; + case 'q': + treemethod = 'q'; // minimum + break; +#endif + case 'q': + sparsepickup = myatoi( *++argv ); +// reporterr( "sparsepickup = %d\n", sparsepickup ); + --argc; + goto nextoption; + case 'X': + treemethod = 'X'; + sueff_global = atof( *++argv ); +// fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; + case 'E': + nguidetree = myatoi( *++argv ); +// reporterr( "nguidetree = %d\n", nguidetree ); + --argc; + goto nextoption; +#if 0 + case 'a': + alg = 'a'; + break; + case 'H': + alg = 'H'; + break; + case 'R': + alg = 'R'; + break; +#endif + case 'A': + alg = 'A'; + break; + case '&': + alg = 'a'; + break; + case '@': + alg = 'd'; + break; + case 'N': + nevermemsave = 1; + break; + case 'M': + alg = 'M'; + break; +#if 0 + case 'S' : + scoreout = 1; // for checking parallel calculation + break; +#else + case 'S' : + spscoreout = 1; // 2014/Dec/30, sp score + break; +#endif + case 'B': // hitsuyou! memopt -M -B no tame + break; + case 'F': + use_fft = 1; + break; + case 'l': + useexternalanchors = 1; + case 'G': + use_fft = 1; + force_fft = 1; + break; +#if 0 + case 'V': + topin = 1; + break; +#endif + case 'U': + treein = 1; + break; + case 'u': + weight = 0; + tbrweight = 0; + break; + case 'v': + tbrweight = 3; + break; +#if 1 + case 'd': + disp = 1; + break; +#endif +#if 1 + case 'O': + outgap = 0; + break; +#else + case 'O': + fftNoAnchStop = 1; + break; +#endif + case 'J': + tbutree = 0; + break; + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'W': + tuplesize = myatoi( *++argv ); + --argc; + goto nextoption; +#if 0 + case 'Z': + checkC = 1; + break; +#endif + case 'Y': + keeplength = 1; + break; + case 'Z': + mapout = 1; + break; + case 'p': + smoothing = 1; + break; + case ':': + nwildcard = 1; + break; + default: + reporterr( "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + reporterr( "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + reporterr( "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + +static int varpairscore( int nseq, int npick, int nlenmax, char **seq, int seed ) +{ + int i, j, npair; + int *slist; + char **pickseq; + double score; + double scoreav; + double scoreav2; + double scorestd; + double scorevar; + slist = calloc( nseq, sizeof( int ) ); + pickseq = AllocateCharMtx( npick, nlenmax ); + reporterr( "nseq = %d, nlenmax=%d, seed=%d\n", nseq, nlenmax, seed ); + + srand( seed ); + + for( i=0; i longestlen[i][0] ) + { + longestlen[i][0] = seqlen[m]; + longestseq[i][0] = m; + } +// reporterr( "%d ", topol[i][0][j] ); + } +// reporterr( "longest = %d (%d)\n", longestlen[i][0], longestseq[i][0] ); + + + longestlen[i][1] = -1; + longestseq[i][1] = -1; + for( j=0; (m=topol[i][1][j])!=-1; j++ ) // sukoshi muda + { + if( seqlen[m] > longestlen[i][1] ) + { + longestlen[i][1] = seqlen[m]; + longestseq[i][1] = m; + } +// reporterr( "%d ", topol[i][1][j] ); + } +// reporterr( "longest = %d (%d)\n", longestlen[i][1], longestseq[i][1] ); + } + + m = 1; + for( i=n-2; i>-1; i-- ) + { +// reporterr( "longest[%d][0] = %d (%d)\n", i, longestlen[i][0], longestseq[i][0] ); +// reporterr( "longest[%d][1] = %d (%d)\n", i, longestlen[i][1], longestseq[i][1] ); + select[longestseq[i][0]] = 1; + select[longestseq[i][1]] = 1; + m += 1; + if( m >= sparsepickup ) break; + } + for( i=0, k=0, j=0; injob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **partmtx = targ->partmtx; + int *nogaplen = targ->nogaplen; + int **pointt = targ->pointt; + int *jobpospt = targ->jobpospt; + double *mindist = targ->mindist; + int *mindistfrom = targ->mindistfrom; + int i, j; + double tmpdist, preference, tmpdistx; //, tmpdisty; + int *table1; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == -1 ) + { + pthread_mutex_unlock( targ->mutex ); + commonsextet_p( NULL, NULL ); + return( NULL ); + } + *jobpospt = i-1; + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + i = *jobpospt; + if( i == -1 ) + { + commonsextet_p( NULL, NULL ); + return( NULL ); + } + *jobpospt = i-1; + } + + table1 = (int *)calloc( tsize, sizeof( int ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + if( i % 100 == 0 ) + { + if( nthreadpair ) + reporterr( "\r% 5d / %d (thread %4d)", njob-i, njob, thread_no ); + else + reporterr( "\r% 5d / %d", njob-i, njob ); + } + makecompositiontable_p( table1, pointt[i] ); + +// for( j=i+1; j-1; j-- ) + { + + tmpdist = distcompact( nogaplen[i], nogaplen[j], table1, pointt[j], selfscore[i], selfscore[j] ); + preference = preferenceval( i, j, njob ); + tmpdistx = tmpdist + preference; + if( tmpdistx < mindist[i] ) + { + mindist[i] = tmpdistx; + mindistfrom[i] = j; + } + +// preference = preferenceval( j, i, njob ); +// tmpdisty = tmpdist + preference; +// if( tmpdisty < mindist[j] ) +// { +// mindist[j] = tmpdisty; +// mindistfrom[j] = i; +// } + + if( partmtx[i] ) partmtx[i][j] = tmpdist; + if( partmtx[j] ) partmtx[j][i] = tmpdist; + } + free( table1 ); + } +} + +static void *ylcompactdisthalfmtxthread( void *arg ) // enablemultithread == 0 demo tsukau +{ + compactdistmtxthread_arg_t *targ = (compactdistmtxthread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **partmtx = targ->partmtx; + int *nogaplen = targ->nogaplen; + int **pointt = targ->pointt; + int *jobpospt = targ->jobpospt; + double *mindist = targ->mindist; + int *mindistfrom = targ->mindistfrom; + int i, j; + double tmpdist, preference, tmpdistx, tmpdisty; + int *table1; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + commonsextet_p( NULL, NULL ); + return( NULL ); + } + *jobpospt = i+1; + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + i = *jobpospt; + if( i == njob-1 ) + { + commonsextet_p( NULL, NULL ); + return( NULL ); + } + *jobpospt = i+1; + } + + table1 = (int *)calloc( tsize, sizeof( int ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + if( i % 100 == 0 ) + { + if( nthreadpair ) + reporterr( "\r% 5d / %d (thread %4d)", i+1, njob, thread_no ); + else + reporterr( "\r% 5d / %d", i+1, njob ); + } + makecompositiontable_p( table1, pointt[i] ); + + for( j=i+1; j-1; j-- ) + { + + tmpdist = distcompact( nogaplen[i], nogaplen[j], table1, pointt[j], selfscore[i], selfscore[j] ); + preference = preferenceval( i, j, njob ); + tmpdistx = tmpdist + preference; + if( tmpdistx < mindist[i] ) + { + mindist[i] = tmpdistx; + mindistfrom[i] = j; + } + + preference = preferenceval( j, i, njob ); + tmpdisty = tmpdist + preference; + if( tmpdisty < mindist[j] ) + { + mindist[j] = tmpdisty; + mindistfrom[j] = i; + } + + if( partmtx[i] ) partmtx[i][j] = tmpdist; + if( partmtx[j] ) partmtx[j][i] = tmpdist; + } + free( table1 ); + } +} + + +static void *msacompactdisthalfmtxthread( void *arg ) // enablemultithread == 0 demo tsukau +{ + msacompactdistmtxthread_arg_t *targ = (msacompactdistmtxthread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **partmtx = targ->partmtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + double *mindist = targ->mindist; + int *mindistfrom = targ->mindistfrom; + int *jobpospt = targ->jobpospt; + double tmpdist, preference, tmpdistx; //, tmpdisty; + int i, j; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == -1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + *jobpospt = i-1; + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + i = *jobpospt; + if( i == -1 ) + { + return( NULL ); + } + *jobpospt = i-1; + } + + if( i % 100 == 0 ) + { + if( nthreadpair ) + fprintf( stderr, "\r% 5d / %d (thread %4d)", njob-i, njob, thread_no ); + else + fprintf( stderr, "\r% 5d / %d", i, njob ); + } + + for( j=i-1; j>-1; j-- ) +// for( j=i+1; jnjob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **partmtx = targ->partmtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + double *mindist = targ->mindist; + int *mindistfrom = targ->mindistfrom; + int *jobpospt = targ->jobpospt; + double tmpdist, preference, tmpdistx, tmpdisty; + int i, j; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + *jobpospt = i+1; + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + i = *jobpospt; + if( i == njob-1 ) + { + return( NULL ); + } + *jobpospt = i+1; + } + + if( i % 100 == 0 ) + { + if( nthreadpair ) + fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + else + fprintf( stderr, "\r% 5d / %d", i, njob ); + } + +// for( j=i-1; j>-1; j-- ) + for( j=i+1; jnjob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **iscore = targ->iscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + + double ssi, ssj, bunbo, iscoretmp; + int i, j; + int nlim = njob-1; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = jobpospt->i; // (jobpospt-i)++ dato, shuuryou hantei no mae ni ++ surunode, tomaranakunaru. + + if( i == nlim ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + jobpospt->i += 1; + pthread_mutex_unlock( targ->mutex ); + if( i % 100 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + } + else +#endif + { + i = (jobpospt->i)++; + if( i == nlim ) return( NULL ); + if( i % 100 == 0 ) fprintf( stderr, "\r% 5d / %d", i, njob ); + } + + ssi = selfscore[i]; + for( j=i+1; j 10 ) iscoretmp = 10.0; // 2015/Mar/17 + + } + if( iscoretmp < 0.0 ) + { + reporterr( "WARNING: negative distance, iscoretmp = %f\n", iscoretmp ); + iscoretmp = 0.0; + } + iscore[i][j-i] = iscoretmp; +// printf( "i,j=%d,%d, iscoretmp=%f\n", i, j, iscoretmp ); + + } + } +} +#else +static void *msadistmtxthread( void *arg ) // enablemultithread == 0 demo tsukau +{ + msadistmtxthread_arg_t *targ = (msadistmtxthread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **iscore = targ->iscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + + double ssi, ssj, bunbo, iscoretmp; + int i, j; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) pthread_mutex_lock( targ->mutex ); +#endif + j = jobpospt->j; + i = jobpospt->i; + j++; + if( j == njob ) + { + i++; + j = i + 1; + if( i == njob-1 ) + { +#ifdef enablemultithread + if( nthreadpair ) pthread_mutex_unlock( targ->mutex ); +#endif + return( NULL ); + } + } + jobpospt->j = j; + jobpospt->i = i; +#ifdef enablemultithread + if( nthreadpair ) pthread_mutex_unlock( targ->mutex ); +#endif + + + if( nthreadpair ) + { + if( j==i+1 && i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + } + else + { + if( j==i+1 && i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d", i, njob ); + } + ssi = selfscore[i]; + ssj = selfscore[j]; + bunbo = MIN( ssi, ssj ); +//fprintf( stderr, "bunbo = %f\n", bunbo ); +//fprintf( stderr, "naivepairscorefast() = %f\n", naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty_dist ) ); + if( bunbo == 0.0 ) + iscoretmp = 2.0; // 2013/Oct/17 + else + { + iscoretmp = ( 1.0 - naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty_dist ) / bunbo ) * 2.0; // 2014/Aug/15 fast + if( iscoretmp > 10 ) iscoretmp = 10.0; // 2015/Mar/17 + + } + iscore[i][j-i] = iscoretmp; + + + } +} +#endif + +#ifdef enablemultithread +static void *distancematrixthread( void *arg ) +{ + distancematrixthread_arg_t *targ = (distancematrixthread_arg_t *)arg; + int thread_no = targ->thread_no; + int njob = targ->njob; + int *jobpospt = targ->jobpospt; + int **pointt = targ->pointt; + double **mtx = targ->mtx; + + int *table1; + int i, j; + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == njob ) + { + pthread_mutex_unlock( targ->mutex ); + commonsextet_p( NULL, NULL ); + return( NULL ); + } + *jobpospt = i+1; + pthread_mutex_unlock( targ->mutex ); + + table1 = (int *)calloc( tsize, sizeof( int ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + if( i % 100 == 0 ) + { + reporterr( "\r% 5d / %d (thread %4d)", i+1, njob, thread_no ); + } + makecompositiontable_p( table1, pointt[i] ); + + for( j=i; j-1; j++ ) + { + if( pairanch[j].i == k ) + { +// reporterr( "pairanch[%d].endi: %d->%d\n", j, pairanch[j].endi, map[pairanch[j].endi] ); + pairanch[j].starti = map[pairanch[j].starti]; + pairanch[j].endi = map[pairanch[j].endi]; + } + } + } + free( map ); + + len = strlen( seq2[0] )+1; + map = calloc( sizeof( int ), len ); + for( k=0; k-1; j++ ) + { + if( pairanch[j].j == k ) + { +// reporterr( "pairanch[%d].endj: %d->%d\n", j, pairanch[j].endj, map[pairanch[j].endj] ); + pairanch[j].startj = map[pairanch[j].startj]; + pairanch[j].endj = map[pairanch[j].endj]; + } + } + } + free( map ); +} + +static int anchidcomp( const void *p, const void *q ) +{ + if ( ((ExtAnch *)q)->i != ((ExtAnch *)p)->i ) + return ((ExtAnch *)p)->i - ((ExtAnch *)q)->i; + return ((ExtAnch *)p)->j - ((ExtAnch *)q)->j; +} + +static int anchcomp( const void *p, const void *q ) +{ + if ( ((ExtAnch *)q)->starti != ((ExtAnch *)p)->starti ) + return ((ExtAnch *)p)->starti - ((ExtAnch *)q)->starti; + return (int)((void *)p - (void *)q); +} + +static int anchscorecomp( const void *p, const void *q ) +{ + if ( ((ExtAnch *)q)->score != ((ExtAnch *)p)->score ) + return ((ExtAnch *)q)->score - ((ExtAnch *)p)->score; + return (int)((void *)q - (void *)p); +} + + +static void indexanchors( ExtAnch *a, int **idx ) +{ + int n; + for( n=0; a[n].i>-1; n++ ) + ; + + qsort( a, n, sizeof( ExtAnch ), anchidcomp ); + + + for( n=0; a[n].i>-1; n++ ) + { +// reporterr( "%d, %dx%d, %d-%d x %d-%d\n", n, a[n].i, a[n].j, a[n].starti, a[n].endi, a[n].startj, a[n].endj ); + if( idx[a[n].i][a[n].j] == -1 ) idx[a[n].i][a[n].j] = n; + } +#if 0 + int m; + for( n=0; n %d\n", n, m, idx[n][m] ); + exit( 1 ); +#endif +} + + +#if 0 +static void checkanchors_internal( ExtAnch *a ) +{ + int p, q, r, s; + int i, j; + int consistent; + int m; +#if 0 + reporterr( "before sortscore\n" ); + for( p=0; a[p].i>-1; p++ ) + { + reporterr( "a[%d].starti,j=%d,%d, score=%d\n", p, a[p].starti, a[p].startj, a[p].score ); + } +#endif + + + for( r=0; a[r].i>-1; ) + { + i = a[r].i; + j = a[r].j; + s = r; + for( ; i==a[r].i && j==a[r].j; r++ ) + ; +// reporterr( "s=%d, r=%d\n", s, r ); + + qsort( a+s, r-s, sizeof( ExtAnch ), anchscorecomp ); +#if 0 + reporterr( "after sortscore, r=%d\n", r ); + for( p=s; p m ) m = a[q].score; +// reporterr( "INconsistent\n" ); +// reporterr( "p=%d, q=%d\n", p, q ); +// reporterr( "p: a[%d].regi,regj=%d-%d,%d-%d, score=%d\n", p, a[p].starti, a[p].endi, a[p].startj, a[p].endj, a[p].score ); +// reporterr( "q: a[%d].regi,regj=%d-%d,%d-%d, score=%d\n", q, a[q].starti, a[q].endi, a[q].startj, a[q].endj, a[q].score ); +// a[q].starti = a[q].startj = a[q].startj = a[q].endj = -1; +// a[q].score = a[p].score - a[q].score; // ?? +// a[q].score = ( a[p].score + a[q].score ) / 2; // ?? + a[q].score = 0; + } + } + if( !consistent ) +// a[p].score = ( a[p].score + m ) / 2; // >= 0 + a[p].score -= m; // >= 0 +// a[p].score = 0; + } + } + +#if 0 + reporterr( "after filtering\n" ); + for( p=0; a[p].i>-1; p++ ) + { + reporterr( "a[%d].starti,j=%d,%d, score=%d\n", p, a[p].starti, a[p].startj, a[p].score ); + } + exit( 1 ); +#endif +} +#endif + +static void checkanchors_strongestfirst( ExtAnch *a, int s, double gapratio1, double gapratio2 ) +{ + int p, q; + double zureij; + double nogaplenestimation1; + double nogaplenestimation2; +#if 0 + reporterr( "before sortscore\n" ); + for( p=0; a[p].i>-1; p++ ) + { + reporterr( "a[%d].starti,j=%d,%d, score=%d\n", p, a[p].starti, a[p].startj, a[p].score ); + } +#endif + qsort( a, s, sizeof( ExtAnch ), anchscorecomp ); + + nogaplenestimation1 = (double)a[0].starti / (1.0+gapratio1); + nogaplenestimation2 = (double)a[0].startj / (1.0+gapratio2); + zureij = nogaplenestimation1 - nogaplenestimation2; + + for( p=0; a[p].i>-1; p++ ) + { + if( a[p].starti == -1 ) continue; + +#if 0 + nogaplenestimation1 = (double)a[p].starti / (1.0+gapratio1); + nogaplenestimation2 = (double)a[p].startj / (1.0+gapratio2); + if( fabs( zureij - ( nogaplenestimation1 - nogaplenestimation2 ) ) > maxanchorseparation ) + { +// reporterr( "warning: long internal gaps in %d-%d, |%5.2f-%5.2f - %5.2f| = %5.2f > %5.2f\n", a[p].i, a[p].j, nogaplenestimation1, nogaplenestimation2, zureij, fabs( zureij - ( nogaplenestimation1, nogaplenestimation2 ) ), maxanchorseparation ); + a[p].starti = a[p].startj = a[p].startj = a[p].endj = -1; + continue; + } +#else + int nearest, mindist; + double zurei, zurej; + if( p ) + { + mindist = 999999999; + for( q=0; q maxanchorseparation ) +// if( fabs( zurei - zurej ) > maxanchorseparation || zurei > maxanchorseparation || zurej > maxanchorseparation ) // test + { +// reporterr( "warning: long internal gaps in %d-%d, |%5.2f-%5.2f - %5.2f| = %5.2f > %5.2f\n", a[p].i, a[p].j, nogaplenestimation1, nogaplenestimation2, zureij, fabs( zureij - ( nogaplenestimation1, nogaplenestimation2 ) ), maxanchorseparation ); + a[p].starti = a[p].startj = a[p].startj = a[p].endj = -1; + continue; + } +#endif + +// reporterr( "P score=%d, %d-%d, %d-%d\n", a[p].score, a[p].starti, a[p].endi, a[p].startj, a[p].endj ); + for( q=p+1; a[q].i>-1; q++ ) + { + if( a[q].starti == -1 ) continue; +// reporterr( "Q score=%d, %d-%d, %d-%d\n", a[q].score, a[q].starti, a[q].endi, a[q].startj, a[q].endj ); + + + if( a[p].endi < a[q].starti && a[p].endj < a[q].startj ) + { +// reporterr( "consistent\n" ); + ; + } + else if( a[p].endi == a[q].starti && a[p].endj < a[q].startj && a[q].starti-1; p++ ) + { + reporterr( "a[%d].starti,j=%d,%d, score=%d\n", p, a[p].starti, a[p].startj, a[p].score ); + } +#endif +} + + +static double gapnongapratio( int n, char **s ) +{ + int i, j, len; + char *seq, *pt1, *pt2; + double fv, ng; + + len = strlen( s[0] ); + seq = calloc( len+1, sizeof( char ) ); + + fv = 0.0; + ng = 0.0; + for( i=0; i jump to %d\n", i, j, m1[i], m2[j], anchindex[m1[i]][m2[j]] ); + k = anchindex[m1[i]][m2[j]]; + while( ( k!=-1 ) && ( extanch[k].i == m1[i] && extanch[k].j == m2[j] ) ) + { + s++; + k++; + } + } + else + { +// reporterr( "%dx%d, %dx%d -> jump to %d\n", j, i, m1[i], m2[j], anchindex[m2[j]][m1[i]] ); + k = anchindex[m2[j]][m1[i]]; + while( ( k!=-1 ) && ( extanch[k].i == m2[j] && extanch[k].j == m1[i] ) ) + { + s++; + k++; + } + } +#else + k = 0; + while( extanch[k].i > -1 ) // kanari muda + { + //reporterr( "m1[i],m2[j]=%d,%d ? extanch[k].i,j=%d,%d k=%d\n", m1[i], m2[j], extanch[k].i, extanch[k].j, k ); + if( ( extanch[k].i == m1[i] && extanch[k].j == m2[j] ) || ( extanch[k].i == m2[j] && extanch[k].j == m1[i] ) ) + { + //reporterr( "hit, extanch[k].startj=%d\n", extanch[k].startj ); + s++; + } + k++; + } +#endif + } + *pairanch = calloc( sizeof( ExtAnch ), s+1 ); + + s = 0; + for( i=0; i -1 ) // kanari muda + { + if( extanch[k].i == m1[i] && extanch[k].j == m2[j] ) + { + (*pairanch)[s].i = i; + (*pairanch)[s].j = j; + (*pairanch)[s].starti = extanch[k].starti; // map mae + (*pairanch)[s].endi = extanch[k].endi; // map mae + (*pairanch)[s].startj = extanch[k].startj; // map mae + (*pairanch)[s].endj = extanch[k].endj; // map mae + (*pairanch)[s].score = extanch[k].score; + s++; + } + if( extanch[k].j == m1[i] && extanch[k].i == m2[j] ) + { + (*pairanch)[s].i = i; + (*pairanch)[s].j = j; + (*pairanch)[s].starti = extanch[k].startj; // map mae + (*pairanch)[s].endi = extanch[k].endj; // map mae + (*pairanch)[s].startj = extanch[k].starti; // map mae + (*pairanch)[s].endj = extanch[k].endi; // map mae + (*pairanch)[s].score = extanch[k].score; + s++; + } + k++; + } +#endif + } + (*pairanch)[s].i = (*pairanch)[s].j = -1; + + recountpositions( *pairanch, n1, n2, seq1, seq2 ); +// truncateseq_group( *pairanch, seq1, seq2, n1, n2 ); +// copybackanchors( *pairanch, ddn1, n2, seq1, seq2 ); // tabun dame + +#if 0 + reporterr( "Before check\n" ); + for( k=0; (*pairanch)[k].i>-1; k++ ) + { + if( (*pairanch)[k].starti!=-1) + reporterr( "seq1-%d,seq2-%d %d-%d,%d-%d\n", (*pairanch)[k].i, (*pairanch)[k].j, (*pairanch)[k].starti, (*pairanch)[k].endi, (*pairanch)[k].startj, (*pairanch)[k].endj ); + } +#endif + +#if 0 + reporterr( "\ngroup1=\n" ); + for( i=0; m1[i]>-1; i++ ) + reporterr( "%d ", m1[i] ); + reporterr( "\n" ); + reporterr( "\ngroup2=\n" ); + for( i=0; m2[i]>-1; i++ ) + reporterr( "%d ", m2[i] ); + reporterr( "\n" ); +#endif + + checkanchors_strongestfirst( *pairanch, s, gapnongapratio( n1, seq1 ), gapnongapratio( n2, seq2 ) ); + + +// qsort( *pairanch, s, sizeof( ExtAnch ), anchcomp ); +// checkanchors_new( *pairanch ); + +#if 0 + reporterr( "After check\n" ); + for( k=0; (*pairanch)[k].i>-1; k++ ) + { + if( (*pairanch)[k].starti!=-1) + reporterr( "seq1-%d,seq2-%d %d-%d,%d-%d\n", (*pairanch)[k].i, (*pairanch)[k].j, (*pairanch)[k].starti, (*pairanch)[k].endi, (*pairanch)[k].startj, (*pairanch)[k].endj ); + } +#endif +} + +static void *treebasethread( void *arg ) +{ + treebasethread_arg_t *targ = (treebasethread_arg_t *)arg; + int thread_no = targ->thread_no; + int *nrunpt = targ->nrunpt; + int njob = targ->njob; + int *nlen = targ->nlen; + int *jobpospt = targ->jobpospt; + int ***topol = targ->topol; + Treedep *dep = targ->dep; + double ***cpmxhist = targ->cpmxhist; + int **memhist = targ->memhist; + char **aseq = targ->aseq; + double *effarr = targ->effarr; + int *alloclen = targ->alloclenpt; + int *fftlog = targ->fftlog; + char *mergeoralign = targ->mergeoralign; + double **newdistmtx = targ->newdistmtx; + int *selfscore = targ->selfscore; + ExtAnch *extanch = targ->extanch; + int **anchindex = targ->anchindex; + + char **mseq1, **mseq2; + char **localcopy; + int i, m, j, l; + int immin, immax; + int len1, len2; + int clus1, clus2; + double pscore, tscore; + char *indication1, *indication2; + double *effarr1 = NULL; + double *effarr2 = NULL; +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + int m1, m2; + double **dynamicmtx; + int ssi, ssm, bunbo; + int tm, ti; + int **localmem = NULL; + double ***cpmxchild0, ***cpmxchild1; + double orieff1, orieff2; + ExtAnch *pairanch = NULL; +#if SKIP + int **skiptable1 = NULL, **skiptable2 = NULL; +#endif +#if 0 + int i, j; +#endif + + + + tscore = 0; + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + localcopy = calloc( njob, sizeof( char * ) ); + for( i=0; imutex ); + l = *jobpospt; + if( l == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + Falign_givenanchors( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + free( mseq1 ); + free( mseq2 ); + free( localcopy ); + free( effarr1 ); + free( effarr2 ); + free( indication1 ); + free( indication2 ); + if( specificityconsideration ) + FreeDoubleMtx( dynamicmtx ); + free( localmem ); + return( NULL ); + } + *jobpospt = l+1; + +// reporterr( "l=%d, child0=%d, child1=%d\n", l, dep[l].child0, dep[l].child1 ); + + if( dep[l].child0 != -1 ) + { + while( dep[dep[l].child0].done == 0 ) + pthread_cond_wait( targ->treecond, targ->mutex ); + } + if( dep[l].child1 != -1 ) + { + while( dep[dep[l].child1].done == 0 ) + pthread_cond_wait( targ->treecond, targ->mutex ); + } + + + + +// while( *nrunpt >= nthread ) // bug + while( *nrunpt >= nthreadtb ) // tabun iranai + pthread_cond_wait( targ->treecond, targ->mutex ); // tabun iranai + (*nrunpt)++; + + m1 = topol[l][0][0]; + m2 = topol[l][1][0]; +#if 0 + localmem[0][0] = -1; + posinmem=topolorderz( localmem[0], topol, dep, l, 0 ) - localmem[0]; + localmem[1][0] = -1; + posinmem=topolorderz( localmem[1], topol, dep, l, 1 ) - localmem[1]; +#else + if( dep[l].child0 == -1 ) + { + localmem[0] = calloc( sizeof( int ), 2 ); + localmem[0][0] = m1; + localmem[0][1] = -1; + clus1 = 1; + } + else + { + localmem[0] = memhist[dep[l].child0]; + clus1 = intlen( localmem[0] ); + } + if( dep[l].child1 == -1 ) + { + localmem[1] = calloc( sizeof( int ), 2 ); + localmem[1][0] = m2; + localmem[1][1] = -1; + clus2 = 1; + } + else + { + localmem[1] = memhist[dep[l].child1]; + clus2 = intlen( localmem[1] ); + } + + if( l != njob-2 ) + { + memhist[l] = calloc( sizeof( int ), clus1+clus2+1 ); + intcpy( memhist[l], localmem[0] ); + intcpy( memhist[l]+clus1, localmem[1] ); + memhist[l][clus1+clus2] = -1; + } +#endif + +// moved, 2018/Mar/10. Must be after changing memhist[l] + if( mergeoralign[l] == 'n' ) + { +// reporterr( "SKIP!\n" ); + dep[l].done = 1; + (*nrunpt)--; + pthread_cond_broadcast( targ->treecond ); +// free( topol[l][0] ); topol[l][0] = NULL; +// free( topol[l][1] ); topol[l][1] = NULL; +// free( topol[l] ); topol[l] = NULL; + pthread_mutex_unlock( targ->mutex ); + free( localmem[0] ); + free( localmem[1] ); + continue; + } + + +// reporterr( "l=%d, dep[l].child0=%d, dep[l].child1=%d\n", l, dep[l].child0, dep[l].child1 ); + if( dep[l].child0 == -1 ) cpmxchild0 = NULL; else cpmxchild0 = cpmxhist+dep[l].child0; + if( dep[l].child1 == -1 ) cpmxchild1 = NULL; else cpmxchild1 = cpmxhist+dep[l].child1; +// reporterr( "cpmxchild0=%p, cpmxchild1=%p\n", cpmxchild0, cpmxchild1 ); + + +// reporterr( "\ndistfromtip = %f\n", dep[l].distfromtip ); + if( specificityconsideration ) + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip ); + else + dynamicmtx = n_dis_consweight_multi; +// reporterr( "dynamicmtx[0][1] = %f\n", dynamicmtx[0][1] ); + + len1 = strlen( aseq[m1] ); + len2 = strlen( aseq[m2] ); + if( *alloclen <= len1 + len2 ) + { + reporterr( "\nReallocating.." ); + *alloclen = ( len1 + len2 ) + 1000; + ReallocateCharMtx( aseq, njob, *alloclen + 10 ); + reporterr( "done. *alloclen = %d\n", *alloclen ); + } + + + for( i=0; (j=localmem[0][i])!=-1; i++ ) + { + localcopy[j] = calloc( *alloclen, sizeof( char ) ); + strcpy( localcopy[j], aseq[j] ); +// localcopy[j] = aseq[j]; + } + for( i=0; (j=localmem[1][i])!=-1; i++ ) + { + localcopy[j] = calloc( *alloclen, sizeof( char ) ); + strcpy( localcopy[j], aseq[j] ); +// localcopy[j] = aseq[j]; + } + + if( !nevermemsave && ( alg != 'M' && ( len1 > 30000 || len2 > 30000 ) ) ) + { + reporterr( "\nlen1=%d, len2=%d, Switching to the memsave mode\n", len1, len2 ); + alg = 'M'; + } + + if( alg == 'M' ) // hoka no thread ga M ni shitakamo shirenainode + { +// reporterr( "Freeing commonIP (thread %d)\n", thread_no ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + pthread_mutex_unlock( targ->mutex ); + +#if 1 // CHUUI@@@@ + clus1 = fastconjuction_noname( localmem[0], localcopy, mseq1, effarr1, effarr, indication1, 0.0, &orieff1 ); + clus2 = fastconjuction_noname( localmem[1], localcopy, mseq2, effarr2, effarr, indication2, 0.0, &orieff2 ); +#else + clus1 = fastconjuction_noweight( topol[l][0], localcopy, mseq1, effarr1, indication1 ); + clus2 = fastconjuction_noweight( topol[l][1], localcopy, mseq2, effarr2, indication2 ); +#endif + + +#if 0 + for( i=0; i 66 ) reporterr( "..." ); + reporterr( "\n" ); + reporterr( "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) reporterr( "..." ); + reporterr( "\n" ); +#endif + +/* + reporterr( "before align all\n" ); + display( aseq, njob ); + reporterr( "\n" ); + reporterr( "before align 1 %s \n", indication1 ); + display( mseq1, clus1 ); + reporterr( "\n" ); + reporterr( "before align 2 %s \n", indication2 ); + display( mseq2, clus2 ); + reporterr( "\n" ); +*/ + + + +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000); +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// else ffttry = 0; + ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000); // v6.708 +// reporterr( "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); +// reporterr( "fftlog=%d,%d, ffttry=%d\n", fftlog[m1], fftlog[m2], ffttry ); + + if( useexternalanchors ) + { +// reporterr( "%%%% %d vs %d\n", m1, m2 ); + pickpairanch( &pairanch, extanch, anchindex, clus1, clus2, localmem[0], localmem[1], mseq1, mseq2 ); +// reporterr( "pairanch: %d:%d\n", pairanch[0].starti, pairanch[0].startj ); + pscore = Falign_givenanchors( pairanch, NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + free( pairanch ); + pairanch = NULL; + } + else if( force_fft || ( use_fft && ffttry ) ) + { + if( l < 500 || l % 100 == 0 ) reporterr( " f\b\b" ); + if( alg == 'M' ) + { + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + { + pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); + } + } + else + { + if( l < 500 || l % 100 == 0 ) reporterr( " d\b\b" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); +// reporterr( "%d-%d", clus1, clus2 ); + pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + break; + case( 'd' ): + if( 1 && clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = D__align_ls( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + } + break; + case( 'A' ): + if( clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { +// reporterr( "%d-%d", clus1, clus2 ); + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + } + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } +#if SCOREOUT + reporterr( "score = %10.2f\n", pscore ); +#endif + tscore += pscore; + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + + if( disp ) display( localcopy, njob ); + + if( newdistmtx ) // tsukawanai + { +#if 0 + reporterr( "group1 = " ); + for( i=0; imutex ); + dep[l].done = 1; + (*nrunpt)--; + pthread_cond_broadcast( targ->treecond ); + + for( i=0; (j=localmem[0][i])!=-1; i++ ) + strcpy( aseq[j], localcopy[j] ); + for( i=0; (j=localmem[1][i])!=-1; i++ ) + strcpy( aseq[j], localcopy[j] ); + +// reporterr( "at step %d\n", l ); +// use_getrusage(); + + pthread_mutex_unlock( targ->mutex ); + + + + for( i=0; (j=localmem[0][i])!=-1; i++ ) + { + if(localcopy[j] ) free( localcopy[j] ); + localcopy[j] = NULL; + } + for( i=0; (j=localmem[1][i])!=-1; i++ ) + { + if( localcopy[j] ) free( localcopy[j] ); + localcopy[j] = NULL; + } + + +// if( topol[l][0] ) free( topol[l][0] ); +// topol[l][0] = NULL; +// if( topol[l][1] ) free( topol[l][1] ); +// topol[l][1] = NULL; +// if( topol[l] ) free( topol[l] ); +// topol[l] = NULL; + + +// reporterr( "\n" ); + + free( localmem[0] ); + free( localmem[1] ); + } +#if SCOREOUT + reporterr( "totalscore = %10.2f\n\n", tscore ); +#endif +} +#endif + +static int dooneiteration( int *nlen, char **aseq, int nadd, char *mergeoralign, char **mseq1, char **mseq2, int ***topol, Treedep *dep, int **memhist, double ***cpmxhist, double *effarr, double **newdistmtx, int *selfscore, ExtAnch *extanch, int **anchindex, int *alloclen, int (*callback)(int, int, char*) ) +{ + int l, ll, len1, len2, i, j; + int clus1, clus2; + double pscore; + char *indication1 = NULL, *indication2 = NULL; + double *effarr1 = NULL; + double *effarr2 = NULL; + int *fftlog = NULL; // fixed at 2006/07/26 +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + int m1, m2; + int *alreadyaligned = NULL; + double **dynamicmtx = NULL; + int **localmem = NULL; + double ***cpmxchild0, ***cpmxchild1; + double orieff1, orieff2; + double oscore, nscore; + ExtAnch *pairanch; + char **oseq1, **oseq2; +#if SKIP + int **skiptable1 = NULL, **skiptable2 = NULL; +#endif +#if 0 + int i, j; +#endif + + + if( effarr1 == NULL ) + { + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + fftlog = AllocateIntVec( njob ); + alreadyaligned = AllocateIntVec( njob ); + if( specificityconsideration ) + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + localmem = calloc( sizeof( int * ), 2 ); + } + for( i=0; i 66 ) reporterr( "..." ); + reporterr( "\n" ); + reporterr( "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) reporterr( "..." ); + reporterr( "\n" ); +#endif + +/* + reporterr( "before align all\n" ); + display( aseq, njob ); + reporterr( "\n" ); + reporterr( "before align 1 %s \n", indication1 ); + display( mseq1, clus1 ); + reporterr( "\n" ); + reporterr( "before align 2 %s \n", indication2 ); + display( mseq2, clus2 ); + reporterr( "\n" ); +*/ + + if( !nevermemsave && ( alg != 'M' && ( len1 > 30000 || len2 > 30000 ) ) ) + { + reporterr( "\nlen1=%d, len2=%d, Switching to the memsave mode\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000); + ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000); // v6.708 +// reporterr( "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); + + if( useexternalanchors ) + { + pickpairanch( &pairanch, extanch, anchindex, clus1, clus2, localmem[0], localmem[1], mseq1, mseq2 ); +// reporterr( "pairanch: %d:%d\n", pairanch[0].starti, pairanch[0].startj ); + pscore = Falign_givenanchors( pairanch, NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + free( pairanch ); + pairanch = NULL; + } + else if( force_fft || ( use_fft && ffttry ) ) + { + if( l < 500 || l % 100 == 0 ) reporterr( " f\b\b" ); + if( alg == 'M' ) + { + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + { + pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); +// reporterr( "######### mseq1[0] = %s\n", mseq1[0] ); + } + } + else + { + if( l < 500 || l % 100 == 0 ) reporterr( " d\b\b" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); +// reporterr( "%d-%d", clus1, clus2 ); + pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + break; + case( 'd' ): + if( 1 && clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = D__align_ls( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + } + break; + case( 'A' ): + if( clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); +// reporterr( "\n\n %d - %d (%d x %d) : \n", topol[l][0][0], topol[l][1][0], clus1, clus2 ); + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + } + + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, strlen( mseq1[0] ), &nscore ); +#if SCOREOUT + reporterr( "score = %10.2f\n", pscore ); +#endif + if( nscore < oscore ) + { + for( i=0; ig1\n%s\n", mseq1[i] ); + for( i=0; ig2\n%s\n", mseq2[i] ); + exit( 1 ); + } +#endif + +// free( topol[l][0] ); topol[l][0] = NULL; +// free( topol[l][1] ); topol[l][1] = NULL; +// free( topol[l] ); topol[l] = NULL; + + +// reporterr( ">514\n%s\n", aseq[514] ); + free( localmem[0] ); + free( localmem[1] ); + + } + + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + Falign_givenanchors( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + free( effarr1 ); + free( effarr2 ); + free( indication1 ); + free( indication2 ); + free( fftlog ); + if( specificityconsideration ) + FreeDoubleMtx( dynamicmtx ); + free( alreadyaligned ); + free( localmem ); + effarr1 = NULL; + return( 0 ); + + chudan_tbfast: + + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + Falign_givenanchors( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + if( effarr1 ) free( effarr1 ); effarr1 = NULL; + if( effarr2 ) free( effarr2 ); effarr2 = NULL; + if( indication1 ) free( indication1 ); indication1 = NULL; + if( indication2 ) free( indication2 ); indication2 = NULL; + if( fftlog ) free( fftlog ); fftlog = NULL; + if( alreadyaligned ) free( alreadyaligned ); alreadyaligned = NULL; + if( specificityconsideration ) + { + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); dynamicmtx = NULL; + } + if( localmem ) free( localmem ); localmem = NULL; +#if SKIP + if( skiptable1 ) FreeIntMtx( skiptable1 ); skiptable1 = NULL; + if( skiptable2 ) FreeIntMtx( skiptable2 ); skiptable2 = NULL; +#endif + + return( 1 ); +} +static int treebase( int *nlen, char **aseq, int nadd, char *mergeoralign, char **mseq1, char **mseq2, int ***topol, Treedep *dep, int **memhist, double ***cpmxhist, double *effarr, double **newdistmtx, int *selfscore, ExtAnch *extanch, int **anchindex, int *alloclen, int (*callback)(int, int, char*) ) +{ + int l, len1, len2, i, m, immin, immax; + int len1nocommongap, len2nocommongap; + int clus1, clus2; + double pscore, tscore; + char *indication1 = NULL, *indication2 = NULL; + double *effarr1 = NULL; + double *effarr2 = NULL; + int *fftlog = NULL; // fixed at 2006/07/26 +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + int m1, m2; + int *gaplen = NULL; + int *gapmap = NULL; + int *alreadyaligned = NULL; + double **dynamicmtx = NULL; + double ssi, ssm, bunbo; + int tm, ti; + int gapmaplen; + int **localmem = NULL; + double ***cpmxchild0, ***cpmxchild1; + double orieff1, orieff2; + ExtAnch *pairanch; +#if SKIP + int **skiptable1 = NULL, **skiptable2 = NULL; +#endif +#if 0 + int i, j; +#endif + + + if( effarr1 == NULL ) + { + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + fftlog = AllocateIntVec( njob ); + gaplen = AllocateIntVec( *alloclen+10 ); + gapmap = AllocateIntVec( *alloclen+10 ); + alreadyaligned = AllocateIntVec( njob ); + if( specificityconsideration ) + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + localmem = calloc( sizeof( int * ), 2 ); + } + for( i=0; i 0 && dep[l].child0 == l-1 && dep[l].child1 == -1 && dep[dep[l].child0].child1 == -1 ) + { + localmem[0][clus1] = topol[l-1][1][0]; + localmem[0][clus1+1] = -1; + + localmem[1][0] = topol[l][1][0]; + localmem[1][1] = -1; + } + else + { + localmem[0][0] = -1; + posinmem = topolorderz( localmem[0], topol, dep, l, 0 ) - localmem[0]; + localmem[1][0] = -1; + posinmem = topolorderz( localmem[1], topol, dep, l, 1 ) - localmem[1]; + } +#else + if( dep[l].child0 == -1 ) + { + localmem[0] = calloc( sizeof( int ), 2 ); + localmem[0][0] = m1; + localmem[0][1] = -1; + clus1 = 1; + } + else + { + localmem[0] = memhist[dep[l].child0]; + clus1 = intlen( localmem[0] ); + } + if( dep[l].child1 == -1 ) + { + localmem[1] = calloc( sizeof( int ), 2 ); + localmem[1][0] = m2; + localmem[1][1] = -1; + clus2 = 1; + } + else + { + localmem[1] = memhist[dep[l].child1]; + clus2 = intlen( localmem[1] ); + } + + if( l != njob-2 ) + { + memhist[l] = calloc( sizeof( int ), clus1+clus2+1 ); + intcpy( memhist[l], localmem[0] ); + intcpy( memhist[l]+clus1, localmem[1] ); + memhist[l][clus1+clus2] = -1; + } +#endif + + if( mergeoralign[l] == 'n' ) + { +// reporterr( "SKIP!\n" ); +// free( topol[l][0] ); topol[l][0] = NULL; +// free( topol[l][1] ); topol[l][1] = NULL; +// free( topol[l] ); topol[l] = NULL; + free( localmem[0] ); + free( localmem[1] ); + continue; + } + +// reporterr( "\ndistfromtip = %f\n", dep[l].distfromtip ); + if( specificityconsideration ) + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip ); + else + dynamicmtx = n_dis_consweight_multi; +// makedynamicmtx( dynamicmtx, n_dis_consweight_multi, ( dep[l].distfromtip - 0.2 ) * 3 ); + + + len1 = strlen( aseq[m1] ); + len2 = strlen( aseq[m2] ); + if( *alloclen < len1 + len2 ) + { + reporterr( "\nReallocating.." ); + *alloclen = ( len1 + len2 ) + 1000; + ReallocateCharMtx( aseq, njob, *alloclen + 10 ); + gaplen = realloc( gaplen, ( *alloclen + 10 ) * sizeof( int ) ); + if( gaplen == NULL ) + { + reporterr( "Cannot realloc gaplen\n" ); + exit( 1 ); + } + gapmap = realloc( gapmap, ( *alloclen + 10 ) * sizeof( int ) ); + if( gapmap == NULL ) + { + reporterr( "Cannot realloc gapmap\n" ); + exit( 1 ); + } + reporterr( "done. *alloclen = %d\n", *alloclen ); + } + +#if 1 // CHUUI@@@@ + clus1 = fastconjuction_noname( localmem[0], aseq, mseq1, effarr1, effarr, indication1, 0.0, &orieff1 ); + clus2 = fastconjuction_noname( localmem[1], aseq, mseq2, effarr2, effarr, indication2, 0.0, &orieff2 ); +#else + clus1 = fastconjuction_noname( topol[l][0], aseq, mseq1, effarr1, effarr, indication1, 0.0 ); + clus2 = fastconjuction_noname( topol[l][1], aseq, mseq2, effarr2, effarr, indication2, 0.0 ); +// clus1 = fastconjuction_noweight( topol[l][0], aseq, mseq1, effarr1, indication1 ); +// clus2 = fastconjuction_noweight( topol[l][1], aseq, mseq2, effarr2, indication2 ); +#endif + + + + + + + + + + + + if( mergeoralign[l] == '1' || mergeoralign[l] == '2' ) + { + newgapstr = "="; + } + else + newgapstr = "-"; + + len1nocommongap = len1; + len2nocommongap = len2; + if( mergeoralign[l] == '1' ) // nai + { + findcommongaps( clus2, mseq2, gapmap ); + commongappick( clus2, mseq2 ); + len2nocommongap = strlen( mseq2[0] ); + } + else if( mergeoralign[l] == '2' ) + { + findcommongaps( clus1, mseq1, gapmap ); + commongappick( clus1, mseq1 ); + len1nocommongap = strlen( mseq1[0] ); + } + +#if 0 + for( i=0; i 66 ) reporterr( "..." ); + reporterr( "\n" ); + reporterr( "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) reporterr( "..." ); + reporterr( "\n" ); +#endif + +/* + reporterr( "before align all\n" ); + display( aseq, njob ); + reporterr( "\n" ); + reporterr( "before align 1 %s \n", indication1 ); + display( mseq1, clus1 ); + reporterr( "\n" ); + reporterr( "before align 2 %s \n", indication2 ); + display( mseq2, clus2 ); + reporterr( "\n" ); +*/ + + + if( !nevermemsave && ( alg != 'M' && ( len1 > 30000 || len2 > 30000 ) ) ) + { + reporterr( "\nlen1=%d, len2=%d, Switching to the memsave mode\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000); +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// else ffttry = 0; + ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); +// reporterr( "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); +// reporterr( "fftlog=%d,%d, ffttry=%d\n", fftlog[m1], fftlog[m2], ffttry ); + + if( useexternalanchors ) + { + pickpairanch( &pairanch, extanch, anchindex, clus1, clus2, localmem[0], localmem[1], mseq1, mseq2 ); +// reporterr( "pairanch: %d:%d\n", pairanch[0].starti, pairanch[0].startj ); + pscore = Falign_givenanchors( pairanch, NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + free( pairanch ); + pairanch = NULL; + } + else if( force_fft || ( use_fft && ffttry ) ) + { + if( l < 500 || l % 100 == 0 ) reporterr( " f\b\b" ); + if( alg == 'M' ) + { + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + { + pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); +// reporterr( "######### mseq1[0] = %s\n", mseq1[0] ); + } + } + else + { + if( l < 500 || l % 100 == 0 ) reporterr( " d\b\b" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + if( l < 500 || l % 100 == 0 ) reporterr( "m" ); + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); +// reporterr( "%d-%d", clus1, clus2 ); + pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + break; + case( 'd' ): + if( 1 && clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = D__align_ls( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + } + break; + case( 'A' ): + if( clus1 == 1 && clus2 == 1 ) + { +// reporterr( "%d-%d", clus1, clus2 ); + pscore = G__align11( dynamicmtx, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { + if( l < 500 || l % 100 == 0 ) if( ( cpmxchild1 && *cpmxchild1 ) || ( cpmxchild0 && *cpmxchild0 ) ) reporterr( " h" ); +// reporterr( "\n\n %d - %d (%d x %d) : \n", topol[l][0][0], topol[l][1][0], clus1, clus2 ); + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + } + + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } +#if SCOREOUT + reporterr( "score = %10.2f\n", pscore ); +#endif + tscore += pscore; + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + +// writePre( njob, name, nlen, aseq, 0 ); + + if( disp ) display( aseq, njob ); +// reporterr( "\n" ); + + if( mergeoralign[l] == '1' ) // jissainiha nai. atarashii hairetsu ha saigo dakara. + { + reporterr( "Check source!!!\n" ); + exit( 1 ); + } + if( mergeoralign[l] == '2' ) + { +// if( localkeeplength ) ndeleted += deletenewinsertions( clus1, clus2, mseq1, mseq2, NULL ); +// for( i=0; iSTEP0 mseq1[%d] = \n%s\n", i, mseq1[i] ); +// for( i=0; iSTEP0 mseq2[%d] = \n%s\n", i, mseq2[i] ); + gapmaplen = strlen( mseq1[0] )-len1nocommongap+len1; + adjustgapmap( gapmaplen, gapmap, mseq1[0] ); +#if 0 + reporterr( "\n" ); + for( i=0; iSTEP1 mseq1[%d] = \n%s\n", i, mseq1[i] ); + for( i=0; iSTEP1 mseq2[%d] = \n%s\n", i, mseq2[i] ); +#endif +// if( clus1 + clus2 < njob ) restorecommongaps( njob, aseq, topol[l][0], topol[l][1], gapmap, *alloclen, '-' ); + if( smoothing ) + { + restorecommongapssmoothly( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); + findnewgaps( clus1, 0, mseq1, gaplen ); + insertnewgaps_bothorders( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, gapmaplen, *alloclen, alg, '-' ); + } + else + { + restorecommongaps( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); + findnewgaps( clus1, 0, mseq1, gaplen ); + insertnewgaps( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, *alloclen, alg, '-' ); + } + +#if 0 + reporterr( "\n" ); + for( i=0; iSTEP3 mseq1[%d] = \n%s\n", i, mseq1[i] ); + for( i=0; iSTEP3 mseq2[%d] = \n%s\n", i, mseq2[i] ); +#endif + +#if 0 + for( i=0; i-1; i++ ) alreadyaligned[m] = 1; + } + + if( newdistmtx ) // tsukawanai + { +#if 0 + reporterr( "group1 = " ); + for( i=0; ig1\n%s\n", mseq1[i] ); + for( i=0; ig2\n%s\n", mseq2[i] ); + exit( 1 ); + } +#endif + +// free( topol[l][0] ); topol[l][0] = NULL; +// free( topol[l][1] ); topol[l][1] = NULL; +// free( topol[l] ); topol[l] = NULL; + + +// reporterr( ">514\n%s\n", aseq[514] ); + free( localmem[0] ); + free( localmem[1] ); + } + +#if SCOREOUT + reporterr( "totalscore = %10.2f\n\n", tscore ); +#endif + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + Falign_givenanchors( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + free( effarr1 ); + free( effarr2 ); + free( indication1 ); + free( indication2 ); + free( fftlog ); + free( gaplen ); + free( gapmap ); + if( specificityconsideration ) + FreeDoubleMtx( dynamicmtx ); + free( alreadyaligned ); + free( localmem ); + effarr1 = NULL; + return( 0 ); + + chudan_tbfast: + + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + Falign_givenanchors( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + if( effarr1 ) free( effarr1 ); effarr1 = NULL; + if( effarr2 ) free( effarr2 ); effarr2 = NULL; + if( indication1 ) free( indication1 ); indication1 = NULL; + if( indication2 ) free( indication2 ); indication2 = NULL; + if( fftlog ) free( fftlog ); fftlog = NULL; + if( gaplen ) free( gaplen ); gaplen = NULL; + if( gapmap ) free( gapmap ); gapmap = NULL; + if( alreadyaligned ) free( alreadyaligned ); alreadyaligned = NULL; + if( specificityconsideration ) + { + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); dynamicmtx = NULL; + } + if( localmem ) free( localmem ); localmem = NULL; +#if SKIP + if( skiptable1 ) FreeIntMtx( skiptable1 ); skiptable1 = NULL; + if( skiptable2 ) FreeIntMtx( skiptable2 ); skiptable2 = NULL; +#endif + + return( 1 ); +} + +static void WriteOptions( FILE *fp ) +{ + + if( dorp == 'd' ) fprintf( fp, "DNA\n" ); + else + { + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "BLOSUM %d\n", nblosum ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + } + reporterr( "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + if( use_fft ) fprintf( fp, "FFT on\n" ); + + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Algorithm A+\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( treemethod == 'X' ) + fprintf( fp, "Tree = UPGMA (mix).\n" ); + else if( treemethod == 'E' ) + fprintf( fp, "Tree = UPGMA (average).\n" ); + else if( treemethod == 'q' ) + fprintf( fp, "Tree = Minimum linkage.\n" ); + else + fprintf( fp, "Unknown tree.\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( dorp == 'd' ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + +static double **preparepartmtx( int nseq ) +{ + int i; + double **val; + double size; + + val = (double **)calloc( nseq, sizeof( double *) );; + size = 0; + + if( compacttree == 1 ) + { + for( i=0; i maxdistmtxsize ) + { + reporterr( "\n\nThe size of full distance matrix is estimated to exceed %.2fGB.\n", maxdistmtxsize / 1000 / 1000 /1000 ); + reporterr( "Will try the calculation using a %d x %d matrix.\n", nseq, i ); + reporterr( "This calculation will be slow due to the limited RAM space.\n", i, nseq ); + reporterr( "To avoid the slowdown, please try '--initialramusage xGB' (x>>%.2f),\n", maxdistmtxsize / 1000 / 1000 /1000 ); + reporterr( "if larger RAM space is available.\n" ); + reporterr( "Note that xGB is NOT the upper limit of RAM usage.\n" ); + reporterr( "Two to three times larger space may be used for building a guide tree.\n" ); + reporterr( "Memory usage of the MSA stage depends on similarity of input sequences.\n\n" ); +// reporterr( "If the RAM is small, try '--initialramusage xGB' with a smaller x value.\n" ); + reporterr( "The '--memsavetree' option uses smaller RAM space.\n" ); + reporterr( "If tree-like relationship can be ignored, try '--pileup' or '--randomchain'.\n\n" ); + reporterr( "The result of --initialramusage xGB is almost identical to the default, except for rounding differences.\n" ); + + reporterr( "In the cases of --memsavetree, --pileup and --randomchain, the result differs from the default.\n\n" ); + break; + } + val[i] = (double *)calloc( nseq, sizeof( double ) ); + } + if( i == nseq ) reporterr( "The full matrix will be used.\n" ); + + for( ;i nlenmax ) nlenmax = ien; + } + infp = NULL; +// stderr = fopen( "/dev/null", "a" ); // Windows???? + tmpargv = AllocateCharMtx( argc, 0 ); + for( i=0; i 1000000 ) + { + reporterr( "The number of sequences must be < %d\n", 1000000 ); + reporterr( "Please try the --parttree option for such large data.\n" ); + exit( 1 ); + } + + if( njob < 2 ) + { + seq = AllocateCharMtx( 2, nlenmax*1+1 ); + name = AllocateCharMtx( 2, B+1 ); + nlen = AllocateIntVec( 2 ); + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); + gappick0( seq[1], seq[0] ); + writeData_pointer( stdout, njob, name, nlen, seq+1 ); + reporterr( "Warning: Only %d sequence found.\n", njob ); + FreeCharMtx( seq ); + FreeCharMtx( name ); + free( nlen ); + exit( 0 ); + } + + if( specificityconsideration != 0.0 && nlenmax) + { + if( nlenmax > 100000 ) + { + reporterr( "\n" ); + reporterr( "Too long to apply --allowshift or --unalignlevel>0\n" ); + reporterr( "Please use the normal mode.\n" ); + reporterr( "Please also note that MAFFT does not assume genomic rearrangements.\n" ); + reporterr( "\n" ); + exit( 1 ); + } + } + + +#if !defined(mingw) && !defined(_MSC_VER) + setstacksize( 200 * njob ); // topolorder() de ookime no stack wo shiyou. +#endif + + if( subalignment ) + { + readsubalignmentstable( njob, NULL, NULL, &nsubalignments, &maxmem ); + reporterr( "nsubalignments = %d\n", nsubalignments ); + reporterr( "maxmem = %d\n", maxmem ); + subtable = AllocateIntMtx( nsubalignments, maxmem+1 ); + insubtable = AllocateIntVec( njob ); + preservegaps = AllocateIntVec( njob ); + for( i=0; i equivalent to v7.448 + free( tmpseq ); + } + + constants( njob, seq ); + + +#if 0 + reporterr( "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + reporterr( "Illegal character %c\n", c ); + exit( 1 ); + } + + reporterr( "\n" ); + +// reporterr( "tuplesize = %d, dorp = %c\n", tuplesize, dorp ); + if( dorp == 'p' && tuplesize != 6 ) + { + reporterr( "tuplesize must be 6 for aa sequence\n" ); + exit( 1 ); + } + if( dorp == 'd' && tuplesize != 6 && tuplesize != 10 ) + { + reporterr( "tuplesize must be 6 or 10 for dna sequence\n" ); + exit( 1 ); + } + + if( treein ) + { + int npickx; + treein = check_guidetreefile( &randomseed, &npickx, &maxdistmtxsize ); + if( treein == 't' ) + { + varpairscore( njob, npickx, nlenmax, seq, randomseed ); + exit( 1 ); + } + else if( treein == 'c' ) + { + compacttree = 1; + treein = 0; +// use_fft = 0; // kankeinai? +// maxdistmtxsize = 5 * 1000 * 1000; // 5GB. ato de kahen ni suru. +// maxdistmtxsize = 1.0 * 1000 * 1000 * 1000; // 5GB. ato de kahen ni suru. + } + else if( treein == 'Y' ) + { + compacttree = 4; // youngest linkage, 3 ha tbfast de tsukaunode ichiou sakeru + treein = 0; +// use_fft = 0; // kankeinai? + } + else if( treein == 'S' || treein == 'C' ) + { + compacttree = 2; // 3 ha tbfast de tsukaunode ichiou sakeru + treein = 0; +// use_fft = 0; // kankeinai? + } + else if( treein == 'a' ) + { +// reporterr( "Compute pairwise scores\n" ); + if( njob > 200000 ) + { + reporterr( "Chain?\n" ); + treein = 's'; + nguidetree = 1; + } + else if( njob < 100 || 't' == varpairscore( njob, npickx, nlenmax, seq, randomseed ) ) + { + if( treein == 'c' ) exit( 1 ); + reporterr( "Tree!\n" ); + treein = 0; + nguidetree = 2; + } + else + { + reporterr( "Chain!\n" ); + treein = 's'; + nguidetree = 1; + } + } + else if ( treein != 0 ) // auto no toki arieru + nguidetree = 1; + } + +# if 0 // tameshini + if( sueff_global < 0.0001 || compacttree == 2 ) + { + nthread = 0; + nthreadtb = 0; + } +#endif +// if( njob > 10000 ) nthreadtb = 0; + if( njob > 20000 ) nthreadtb = 0; +// 2018/Jan. Hairetsu ga ooi toki +// 1. topolorder_lessargs no stack ga tarinakunaru +// 2. localcopy no tame kouritsu warui + + if( compacttree == 1 ) + { + if( maxdistmtxsize > (double)njob * (njob-1) * sizeof( double ) / 2 ) + { + reporterr( "Use conventional tree.\n" ); + compacttree = 0; + } + } + + if( !treein ) + { + reporterr( "\n\nMaking a distance matrix ..\n" ); + if( callback && callback( 0, 0, "Distance matrix" ) ) goto chudan; + + tmpseq = AllocateCharVec( nlenmax+1 ); + grpseq = AllocateIntVec( nlenmax+1 ); + pointt = AllocateIntMtx( njob, nlenmax+1 ); + if( !compacttree ) mtx = AllocateFloatHalfMtx( njob ); + if( dorp == 'd' ) tsize = (int)pow( 4, tuplesize ); + else tsize = (int)pow( 6, 6 ); + + if( dorp == 'd' && tuplesize == 6 ) + { + lenfaca = D6LENFACA; + lenfacb = D6LENFACB; + lenfacc = D6LENFACC; + lenfacd = D6LENFACD; + } + else if( dorp == 'd' && tuplesize == 10 ) + { + lenfaca = D10LENFACA; + lenfacb = D10LENFACB; + lenfacc = D10LENFACC; + lenfacd = D10LENFACD; + } + else + { + lenfaca = PLENFACA; + lenfacb = PLENFACB; + lenfacc = PLENFACC; + lenfacd = PLENFACD; + } + + maxl = 0; + for( i=0; i maxl ) maxl = nogaplen[i]; + if( dorp == 'd' ) /* nuc */ + { + seq_grp_nuc( grpseq, tmpseq ); +// makepointtable_nuc( pointt[i], grpseq ); +// makepointtable_nuc_octet( pointt[i], grpseq ); + if( tuplesize == 10 ) + makepointtable_nuc_dectet( pointt[i], grpseq ); + else if( tuplesize == 6 ) + makepointtable_nuc( pointt[i], grpseq ); + else + { + reporterr( "tuplesize=%d: not supported\n", tuplesize ); + exit( 1 ); + } + } + else /* amino */ + { + seq_grp( grpseq, tmpseq ); + makepointtable( pointt[i], grpseq ); + } + } + if( nunknown ) reporterr( "\nThere are %d ambiguous characters.\n", nunknown ); + + + if( compacttree ) + { + + reporterr( "Compact tree, step 1\n" ); + mindistfrom = (int *)calloc( njob, sizeof( int ) ); + mindist = (double *)calloc( njob, sizeof( double ) ); + selfscore = (int *)calloc( njob, sizeof( int ) ); + partmtx = preparepartmtx( njob ); + + + for( i=0; i 0 ) + { + compactdistmtxthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + double **mindistthread; + int **mindistfromthread; + if( compacttree == 4 ) + jobpos = 0; + else + jobpos = njob-1; + targ = calloc( nthreadpair, sizeof( compactdistmtxthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + mindistthread = AllocateDoubleMtx( nthreadpair, njob ); + mindistfromthread = AllocateIntMtx( nthreadpair, njob ); + pthread_mutex_init( &mutex, NULL ); + + + for( j=0; j 0 ) + { + distancematrixthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos = 0; + targ = calloc( nthreadpair, sizeof( distancematrixthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i nogaplen[j] ) + { + longer=(double)nogaplen[i]; + shorter=(double)nogaplen[j]; + } + else + { + longer=(double)nogaplen[j]; + shorter=(double)nogaplen[i]; + } +// if( tuplesize == 6 ) + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// else +// lenfac = 1.0; +// reporterr( "lenfac = %f (%.0f,%.0f)\n", lenfac, longer, shorter ); + bunbo = MIN( mtx[i][0], mtx[j][0] ); + if( bunbo == 0.0 ) + mtx[i][j-i] = 2.0; // 2013/Oct/17 -> 2bai + else + mtx[i][j-i] = ( 1.0 - mtx[i][j-i] / bunbo ) * lenfac * 2.0; // 2013/Oct/17 -> 2bai +// reporterr( "##### mtx = %f, mtx[i][0]=%f, mtx[j][0]=%f, bunbo=%f\n", mtx[i][j-i], mtx[i][0], mtx[j][0], bunbo ); + } + } + if( disopt ) + { + for( i=0; i iguidetree loop nai ni idou + if( distout ) + { + hat2p = fopen( "hat2", "w" ); + WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, mtx ); + fclose( hat2p ); + } +#endif + + } +#if 0 + else + { + reporterr( "Loading 'hat2' ... " ); + prep = fopen( "hat2", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2." ); + readhat2_double( prep, njob, name, mtx ); // name chuui + fclose( prep ); + reporterr( "done.\n" ); + } +#endif + +// reporterr( "after computing distance matrix," ); +// use_getrusage(); + + if( nadd && keeplength ) + { + originalgaps = (char *)calloc( nlenmax+1, sizeof( char) ); + recordoriginalgaps( originalgaps, njob-nadd, seq ); + + if( mapout ) + { + addbk = (char **)calloc( nadd+1, sizeof( char * ) ); + for( i=0; i= njob ) // check sumi + { + reporterr( "No such sequence, %d.\n", subtable[i][j]+1 ); + exit( 1 ); + } + if( alignmentlength != strlen( seq[subtable[i][j]] ) ) + { + reporterr( "\n" ); + reporterr( "###############################################################################\n" ); + reporterr( "# ERROR!\n" ); + reporterr( "# Subalignment %d must be aligned.\n", i+1 ); + reporterr( "# Please check the alignment lengths of following sequences.\n" ); + reporterr( "#\n" ); + reporterr( "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][0]+1, name[subtable[i][0]]+1, alignmentlength ); + reporterr( "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][j]+1, name[subtable[i][j]]+1, (int)strlen( seq[subtable[i][j]] ) ); + reporterr( "#\n" ); + reporterr( "# See http://mafft.cbrc.jp/alignment/software/merge.html for details.\n" ); + if( subalignmentoffset ) + { + reporterr( "#\n" ); + reporterr( "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + reporterr( "# In this case, the rule of numbering is:\n" ); + reporterr( "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + reporterr( "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + reporterr( "###############################################################################\n" ); + reporterr( "\n" ); + goto chudan; // TEST!! + //exit( 1 ); + } + insubtable[subtable[i][j]] = 1; + } + for( j=0; j OK\n" ); + break; + } + } + if( !foundthebranch ) + { + system( "cp infile.tree GuideTree" ); // tekitou + reporterr( "\n" ); + reporterr( "###############################################################################\n" ); + reporterr( "# ERROR!\n" ); + reporterr( "# Subalignment %d does not seem to form a monophyletic cluster\n", i+1 ); + reporterr( "# in the guide tree ('GuideTree' in this directory) internally computed.\n" ); + reporterr( "# If you really want to use this subalignment, pelase give a tree with --treein \n" ); + reporterr( "# http://mafft.cbrc.jp/alignment/software/treein.html\n" ); + reporterr( "# http://mafft.cbrc.jp/alignment/software/merge.html\n" ); + if( subalignmentoffset ) + { + reporterr( "#\n" ); + reporterr( "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + reporterr( "# In this case, the rule of numbering is:\n" ); + reporterr( "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + reporterr( "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + reporterr( "############################################################################### \n" ); + reporterr( "\n" ); + goto chudan; // TEST!! + //exit( 1 ); + } +// commongappick( seq[subtable[i]], subalignment[i] ); // irukamo + } +#if 0 + for( i=0; i %c\n\n", i, mergeoralign[i] ); + } +#endif + + for( i=0; i iguidetree loop no soto he + FreeIntMtx( subtable ); + free( insubtable ); + for( i=0; i 0 && nadd == 0 ) // nthreadpair ha minai + { + treebasethread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + pthread_cond_t treecond; + int *fftlog; + int nrun; + int nthread_yoyu; + + nthread_yoyu = nthreadtb * 1; + nrun = 0; + jobpos = 0; + targ = calloc( nthread_yoyu, sizeof( treebasethread_arg_t ) ); + fftlog = AllocateIntVec( njob ); + handle = calloc( nthread_yoyu, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + pthread_cond_init( &treecond, NULL ); + + for( i=0; i0 && nadd==0 ) if( calcpairdists ) + if( calcpairdists && !compacttree ) +#else +// if( 0 && nadd==0 ) if( calcpairdists ) // zettai nai + if( calcpairdists && !compacttree ) +#endif + { + reporterr( "Making a distance matrix from msa.. \n" ); + skiptable = AllocateIntMtx( njob, 0 ); + makeskiptable( njob, skiptable, bseq ); // allocate suru. +#ifdef enablemultithread + if( nthreadpair > 0 ) + { + msadistmtxthread_arg_t *targ; + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos.i = 0; + jobpos.j = 0; + + targ = calloc( nthreadpair, sizeof( msadistmtxthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i 0 ) + { + msacompactdistmtxthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + double **mindistthread; + int **mindistfromthread; + + mindistthread = AllocateDoubleMtx( nthreadpair, njob ); + mindistfromthread = AllocateIntMtx( nthreadpair, njob ); + targ = calloc( nthreadpair, sizeof( msacompactdistmtxthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + if( compacttree == 4 ) + jobpos = 0; + else + jobpos = njob-1; + + for( i=0; i lgui ) + { + reporterr( "alignmentlength = %d, gui allocated %d", ien, lgui ); + val = GUI_LENGTHOVER; + } + else + { + for( i=0; i 0 ) + { + reporterr( "\nTo keep the alignment length, %d letters were DELETED.\n", ndeleted ); + if( mapout ) + reporterr( "The deleted letters are shown in the (filename).map file.\n" ); + else + reporterr( "To know the positions of deleted letters, rerun the same command with the --mapout option.\n" ); + } + + + + if( subalignment ) + { + FreeIntMtx( subtable ); + free( insubtable ); + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + disopt = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + + } + if( argc != 0 ) + { + fprintf( stderr, "options: -i\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + int ktuple; + int i, j; + FILE *infp; + FILE *hat2p; + FILE *hat3p; + char **seq = NULL; // by D.Mathog + char **seq1; + static char **name; + static char **name1; + static int nlen1[M]; + double **mtx; + double **mtx2; + static int nlen[M]; + char b[B]; + double max; + char com[1000]; + int opt[M]; + int res; + char *home; + char queryfile[B]; + char datafile[B]; + char fastafile[B]; + char hat2file[B]; + int pid = (int)getpid(); + LocalHom **localhomtable, *tmpptr; +#if 1 + home = getenv( "HOME" ); +#else /* $HOME wo tsukau to fasta ni watasu hikisuu ga afureru */ + home = NULL; +#endif + +#if DEBUG + if( home ) fprintf( stderr, "home = %s\n", home ); +#endif + if( !home ) home = ""; + sprintf( queryfile, "%s/tmp/query-%d", home, pid ); + sprintf( datafile, "%s/tmp/data-%d", home, pid ); + sprintf( fastafile, "%s/tmp/fasta-%d", home, pid ); + sprintf( hat2file, "hat2-%d", pid ); + + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; +#if 0 + PreRead( infp, &njob, &nlenmax ); +#else + dorp = NOTSPECIFIED; + getnumlen( infp ); +#endif + + if( dorp == 'd' ) + { + scoremtx = -1; + pamN = NOTSPECIFIED; + } + else + { + nblosum = 62; + scoremtx = 1; + } + constants( njob, seq ); + + rewind( infp ); + + name = AllocateCharMtx( njob, B+1 ); + name1 = AllocateCharMtx( njob, B+1 ); + seq = AllocateCharMtx( njob, nlenmax+1 ); + seq1 = AllocateCharMtx( 2, nlenmax+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + mtx2 = AllocateDoubleMtx( njob, njob ); + localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); + for( i=0; i %s", queryfile, datafile, fastafile ); + else + sprintf( com, "blastall -G 10 -E 1 -e 1e10 -p blastp -m 7 -i %s -d %s > %s", queryfile, datafile, fastafile ); + res = system( com ); + if( res ) ErrorExit( "error in fasta" ); + + + hat2p = fopen( fastafile, "r" ); + if( hat2p == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + res = ReadBlastm7( hat2p, mtx[i], i, name1, localhomtable[i] ); + fclose( hat2p ); + +#if 0 + for( j=0; jnext ) + { + if( tmpptr->opt == -1.0 ) continue; +// fprintf( stderr, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->next ); + } + } +#endif + + if( res < njob-i+i%10 ) + { + fprintf( stderr, "WARNING: count (blast) = %d < %d\n", res, njob-i+i%10 ); + } + + +#if 0 + { + int ii, jj; + if( i < njob-1 ) for( jj=i; jj j ) continue; + if( mtx[j][i] > mtx[i][j] ) continue; + for( tmpptr=localhomtable[i]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, (void *)tmpptr->next ); + } + } + fclose( hat3p ); +#endif + + for( i=0; i %s", M, M, 0, queryfile, datafile, ktuple, fastafile ); + else + sprintf( com, "fasta34 -z3 -m10 -Q -b%d -E%d -d%d %s %s %d > %s", M, M, 0, queryfile, datafile, ktuple, fastafile ); + res = system( com ); + if( res ) ErrorExit( "error in fasta" ); + + + hat2p = fopen( fastafile, "r" ); + if( hat2p == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + res = ReadFasta34noalign( hat2p, mtx[i], i, name1, localhomtable[i] ); + fclose( hat2p ); + if( res < njob - i ) + { + fprintf( stderr, "count (fasta34 -z 3) = %d\n", res ); + exit( 1 ); + } + + + if( i == 0 ) + for( j=0; j %f\n", max, i+1, j+1, mtx[i][j], mtx2[i][j] ); + } + } + } + for( i=0; i +#include +#define DEBUG 0 +#define TEST 0 + + +int howmanyx( char *s ) +{ + int val = 0; + if( scoremtx == -1 ) + { + do + { + if( !strchr( "atgcuATGCU", *s ) ) val++; + } while( *++s ); + } + else + { + do + { + if( !strchr( "ARNDCQEGHILKMFPSTWYV", *s ) ) val++; + } while( *++s ); + } + return( val ); +} + +void arguments( int argc, char *argv[] ) +{ + int c; + + disopt = 0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + while ( c = *++argv[0] ) + switch( c ) + { + case 'i': + disopt = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + if( argc != 0 ) + { + fprintf( stderr, "options: -i\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + int ktuple; + int i, j; + FILE *hat2p; + char **seq; + char **seq1; + static char name[M][B]; + static char name1[M][B]; + static int nlen1[M]; + double **mtx; + double **mtx2; + static int nlen[M]; + char b[B]; + double max; + char com[B]; + int opt[M]; + int res; + char *home; + char queryfile[B]; + char datafile[B]; + char fastafile[B]; + char hat2file[B]; + int pid = (int)getpid(); +#if 0 + home = getenv( "HOME" ); +#else /* $HOME wo tsukau to fasta ni watasu hikisuu ga afureru */ + home = NULL; +#endif + +#if DEBUG + if( home ) fprintf( stderr, "home = %s\n", home ); +#endif + if( !home ) home = ""; + sprintf( queryfile, "%s/tmp/query-%d\0", home, pid ); + sprintf( datafile, "%s/tmp/data-%d\0", home, pid ); + sprintf( fastafile, "%s/tmp/fasta-%d\0", home, pid ); + sprintf( hat2file, "hat2-%d\0", pid ); + + arguments( argc, argv ); +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( stdin ); +#endif + rewind( stdin ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + seq1 = AllocateCharMtx( 2, nlenmax+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + mtx2 = AllocateDoubleMtx( njob, njob ); + +#if 0 + FRead( stdin, name, nlen, seq ); +#else + readData( stdin, name, nlen, seq ); +#endif + if( scoremtx == -1 ) ktuple = 6; + else ktuple = 1; + + for( i=0; i %s\0", M, M, 0, queryfile, datafile, ktuple, fastafile ); + else + sprintf( com, "fasta3 -Q -h -b%d -E%d -d%d %s %s %d > %s\0", M, M, 0, queryfile, datafile, ktuple, fastafile ); + res = system( com ); + if( res ) ErrorExit( "error in fasta" ); + + hat2p = fopen( fastafile, "r" ); + if( hat2p == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + ReadFasta3( hat2p, mtx[i], njob-i, name1 ); + + if( i == 0 ) + for( j=0; j %f\n", max, i+1, j+1, mtx[i][j], mtx2[i][j] ); + } + } + } + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + disopt = 1; + break; + case 'A': + swopt = "-A"; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: -i\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + int ktuple; + int i, j; + FILE *hat2p; + FILE *hat3p; + FILE *infp; + char **seq = NULL; // by D.Mathog + char **seq1; + char **name; + char **name1; + static int nlen1[M]; + double **mtx; + double **mtx2; + static int nlen[M]; + static char b[B]; + double max; + char com[1000]; + int opt[M]; + int res; + char *home; + char *fastapath; + char queryfile[B]; + char datafile[B]; + char fastafile[B]; + char hat2file[B]; + int pid = (int)getpid(); + LocalHom **localhomtable, *tmpptr; +#if 0 + home = getenv( "HOME" ); +#else /* $HOME wo tsukau to fasta ni watasu hikisuu ga afureru */ + home = NULL; +#endif + fastapath = getenv( "FASTA_4_MAFFT" ); + if( !fastapath ) + fastapath = "fasta34"; + +#if DEBUG + if( home ) fprintf( stderr, "home = %s\n", home ); +#endif + if( !home ) home = ""; + sprintf( queryfile, "%s/tmp/query-%d", home, pid ); + sprintf( datafile, "%s/tmp/data-%d", home, pid ); + sprintf( fastafile, "%s/tmp/fasta-%d", home, pid ); + sprintf( hat2file, "hat2-%d", pid ); + + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + dorp = NOTSPECIFIED; + getnumlen( infp ); +#endif + + if( dorp == 'd' ) + { + scoremtx = -1; + pamN = NOTSPECIFIED; + } + else + { + nblosum = 62; + scoremtx = 1; + } + constants( njob, seq ); + + rewind( infp ); + + name = AllocateCharMtx( njob, B+1 ); + name1 = AllocateCharMtx( njob, B+1 ); + seq = AllocateCharMtx( njob, nlenmax+1 ); + seq1 = AllocateCharMtx( 2, nlenmax+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + mtx2 = AllocateDoubleMtx( njob, njob ); + localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); + for( i=0; i %s", fastapath, swopt, M, M, M, queryfile, datafile, ktuple, fastafile ); + else + sprintf( com, "%s %s -z3 -m10 -Q -b%d -E%d -d%d %s %s %d > %s", fastapath, swopt, M, M, M, queryfile, datafile, ktuple, fastafile ); + res = system( com ); + if( res ) ErrorExit( "error in fasta" ); + + + + hat2p = fopen( fastafile, "r" ); + if( hat2p == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + if( scoremtx == -1 ) + res = ReadFasta34m10_nuc( hat2p, mtx[i], i, name1, localhomtable[i] ); + else + res = ReadFasta34m10( hat2p, mtx[i], i, name1, localhomtable[i] ); + fclose( hat2p ); + + if( res < njob - i ) + { + fprintf( stderr, "count (fasta34 -z 3) = %d\n", res ); + exit( 1 ); + } + + + if( i == 0 ) + for( j=0; j %f\n", max, i+1, j+1, mtx[i][j], mtx2[i][j] ); + } + } + } + for( i=0; inext ) + { + if( tmpptr->opt == -1.0 ) continue; + fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, (void *)tmpptr->next ); + } + } + fclose( hat3p ); +#endif + + sprintf( com, "/bin/rm %s %s %s", queryfile, datafile, fastafile ); + system( com ); + +#if 0 + sprintf( com, ALNDIR "/supgsdl < %s", hat2file ); + res = system( com ); + if( res ) ErrorExit( "error in spgsdl" ); +#endif + + sprintf( com, "mv %s hat2", hat2file ); + res = system( com ); + if( res ) ErrorExit( "error in mv" ); + + SHOWVERSION; + exit( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/dndpre.c b/mafft/src/mafft-7.487-with-extensions/core/dndpre.c new file mode 100644 index 0000000000..8ff02487b0 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/dndpre.c @@ -0,0 +1,525 @@ +#include "mltaln.h" + +#define TEST 0 + +static int treeout = 0; +static int maxdist = 1; + +#ifdef enablemultithread +typedef struct _jobtable +{ + int i; + int j; +} Jobtable; + +typedef struct _thread_arg +{ + int njob; + int thread_no; + double *selfscore; + double **mtx; + char **seq; + int **skiptable; + Jobtable *jobpospt; + pthread_mutex_t *mutex; +} thread_arg_t; + +#if 0 +void *athread( void *arg ) +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + double *selfscore = targ->selfscore; + double **mtx = targ->mtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + int i, j; + double ssi, ssj, bunbo; + double mtxv; + + if( njob == 1 ) return( NULL ); + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + j = jobpospt->j; + i = jobpospt->i; + j++; +// fprintf( stderr, "\n i=%d, j=%d before check\n", i, j ); + if( j == njob ) + { +// fprintf( stderr, "\n j = %d, i = %d, njob = %d\n", j, i, njob ); + fprintf( stderr, "%4d/%4d (thread %4d), dndpre\r", i+1, njob, thread_no ); + i++; + j = i + 1; + if( i == njob-1 ) + { +// fprintf( stderr, "\n i=%d, njob-1=%d\n", i, njob-1 ); + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + } +// fprintf( stderr, "\n i=%d, j=%d after check\n", i, j ); + jobpospt->j = j; + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex ); + + ssi = selfscore[i]; + ssj = selfscore[j]; + + bunbo = MIN( ssi, ssj ); + if( bunbo == 0.0 ) + mtxv = maxdist; + else + { +// mtxv = maxdist * ( 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo ); + if( usenaivescoreinsteadofalignmentscore ) + mtxv = maxdist * ( 1.0 - (double)naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], 0.0 ) / bunbo ); + else + mtxv = maxdist * ( 1.0 - (double)naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty ) / bunbo ); + } +#if 1 + if( mtxv < 0.0 ) + { + reporterr( "WARNING: negative distance, mtxv = %f\n", mtxv ); + mtxv = 0.0; + } + + if( mtxv > 9.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j] = mtxv; + } +} +#else +void *athread( void *arg ) +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + double *selfscore = targ->selfscore; + double **mtx = targ->mtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + int i, j; + double ssi, ssj, bunbo; + double mtxv; + + if( njob == 1 ) return( NULL ); + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + i = jobpospt->i; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + jobpospt->i += 1; + pthread_mutex_unlock( targ->mutex ); + if( i % 100 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + + + ssi = selfscore[i]; + for( j=i+1; j 9.9 ) + { + fprintf( stderr, "WARNING: distance %d-%d is strange, %f.\n", i, j, mtxv ); + mtxv = 9.9; +// exit( 1 ); // 2016/Aug/3 + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j] = mtxv; + } + } +} +#endif + +#endif + +void arguments( int argc, char *argv[] ) +{ + int c; + + nadd = 0; + nthread = 1; + alg = 'X'; + fmodel = 0; + treeout = 0; + scoremtx = 1; + nblosum = 62; + dorp = NOTSPECIFIED; + inputfile = NULL; + ppenalty = NOTSPECIFIED; //? + ppenalty_ex = NOTSPECIFIED; //? + poffset = NOTSPECIFIED; //? + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + usenaivescoreinsteadofalignmentscore = 0; + nwildcard = 0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'Z': + usenaivescoreinsteadofalignmentscore = 1; + break; + case 't': + treeout = '1'; + break; + case 'D': + dorp = 'd'; + break; + case 'a': + fmodel = 1; + break; + case 'P': + dorp = 'p'; + break; + case ':': + nwildcard = 1; + break; + case 'K': // Hontou ha iranai. disttbfast.c, tbfast.c to awaserutame. + break; + case 'I': + nadd = myatoi( *++argv ); + fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'M': + maxdist = myatoi( *++argv ); +// fprintf( stderr, "maxdist = %d\n", maxdist ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + +int main( int argc, char **argv ) +{ + int i, j, ilim; + char **seq; + static char **name; + int *nlen; + double *selfscore; + double **mtx; + double mtxv; + FILE *fp; + FILE *infp; + double ssi, ssj, bunbo; + int **skiptable = NULL; + char c; + + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( infp ); +#endif + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + rewind( infp ); + + njob -= nadd; // atarashii hairetsu ha mushi + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + selfscore = AllocateFloatVec( njob ); + nlen = AllocateIntVec( njob ); + + +#if 0 + FRead( stdin, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); +#endif + fclose( infp ); + + + for( i=1; i 0 ) + { + thread_arg_t *targ; + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos.i = 0; + jobpos.j = 0; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i 9.0 ) + { + fprintf( stderr, "WARNING: Distance %d-%d is strange, %f.\n", i, j, mtxv ); + mtxv = 9.9; +// exit( 1 ); // 2016/Aug/3 + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j] = mtxv; + } + } + } +#endif + +#if TEST + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'K': + nadd = myatoi( *++argv ); + fprintf( stderr, "nadd = %d\n", niter ); + --argc; + goto nextoption; + case 'I': + niter = myatoi( *++argv ); + fprintf( stderr, "niter = %d\n", niter ); + --argc; + goto nextoption; + case 'e': + RNApthr = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'o': + RNAppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + if( penalty_shift_factor < 100.0 && penalty_shift_factor != 2.0 ) + { + fprintf( stderr, "%f, penalty_shift is fixed to penalty x 2 in the iterative refinement phase.\n", penalty_shift_factor ); + penalty_shift_factor = 2.0; + } + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; + fprintf( stderr, "blosum %d / kimura 200\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt/kimura %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "tm %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + bunkatsu = 0; + fastathreshold = atof( *++argv ); + constraint = 2; + --argc; + goto nextoption; + case 'r': + consweight_rna = atof( *++argv ); + rnakozo = 1; + --argc; + goto nextoption; + case 'c': + consweight_multi = atof( *++argv ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + case 'H': + subalignment = 1; + subalignmentoffset = myatoi( *++argv ); + --argc; + goto nextoption; + case 't': + randomseed = myatoi( *++argv ); + fprintf( stderr, "randomseed = %d\n", randomseed ); + --argc; + goto nextoption; + case 'p': + argkey = *++argv; + if( !strcmp( argkey, "BESTFIRST" ) ) parallelizationstrategy = BESTFIRST; + else if( !strcmp( argkey, "BAATARI0" ) ) parallelizationstrategy = BAATARI0; + else if( !strcmp( argkey, "BAATARI1" ) ) parallelizationstrategy = BAATARI1; + else if( !strcmp( argkey, "BAATARI2" ) ) parallelizationstrategy = BAATARI2; + else + { + fprintf( stderr, "Unknown parallelization strategy, %s\n", argkey ); + exit( 1 ); + } +// exit( 1 ); + --argc; + goto nextoption; + case 's': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; +#if 0 + case 'S' : + scoreout = 1; // for checking parallel calculation + break; +#else + case 'S' : + spscoreout = 1; // 2014/Dec/30, sp score + break; +#endif +#if 0 + case 's' : + RNAscoremtx = 'r'; + break; +#endif +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'N': + nevermemsave = 1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'Q': + alg = 'Q'; + break; +#endif + case 'R': + rnaprediction = 'r'; + break; + case 'O': + fftNoAnchStop = 1; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'r': + fmodel = -1; + break; + case 'R': + fftRepeatStop = 1; + break; +#endif + case 'T': + kobetsubunkatsu = 0; + break; + case 'B': + bunkatsu = 0; + break; +#if 0 + case 'c': + cooling = 1; + break; + case 'a': + alg = 'a'; + break; + case 's' : + treemethod = 's'; + break; + case 'H': + alg = 'H'; + break; +#endif + case 'A': + alg = 'A'; + break; + case 'M': + alg = 'M'; + break; + case '@': + alg = 'd'; + break; + case 'F': + use_fft = 1; + break; +#if 0 + case 't': + weight = 4; + break; +#endif + case 'u': + weight = 0; + break; + case 'U': + intree = 1; + break; + case 'V': + intop = 1; + break; + case 'J': + utree = 0; + break; +#if 0 + case 'd': + disp = 1; + break; +#endif + case 'Z': + score_check = 0; + break; + case 'Y': + score_check = 2; + break; + case 'L': + legacygapcost = 1; + break; +#if 0 + case 'n' : + treemethod = 'n'; + break; +#endif + case 'n' : + outnumber = 1; + break; + case 'X': + treemethod = 'X'; + sueff_global = atof( *++argv ); + fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; +#if 0 + case 'E' : + treemethod = 'E'; + break; + case 'q' : + treemethod = 'q'; + break; +#endif + case 'E': + autosubalignment = atof( *++argv ); + fprintf( stderr, "autosubalignment = %f\n", autosubalignment ); + --argc; + goto nextoption; + case 'W': + minimumweight = atof( *++argv ); + fprintf( stderr, "minimumweight = %f\n", minimumweight ); + --argc; + goto nextoption; + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options : Check source file!\n" ); + exit( 1 ); + } +#if 0 + if( alg == 'A' && weight == 0 ) + ErrorExit( "ERROR : Algorithm A+ and un-weighted\n" ); +#endif +} + + +int main( int argc, char *argv[] ) +{ + int identity; + static int nlen[M]; + static char **name, **seq, **aseq, **bseq; + static Segment *segment = NULL; + static int anchors[MAXSEG]; + int i, j; + int iseg, nseg; + int ***topol; + double **len; + double **eff; + FILE *prep; + FILE *infp; + FILE *orderfp; + int alloclen; + int returnvalue; + char c; + int ocut; + char **seq_g_bk; + LocalHom **localhomtable = NULL; // by D.Mathog + RNApair ***singlerna; + int nogaplen; + static char **nogap1seq; + static char *kozoarivec; + int nkozo; + int alignmentlength; + int **skipthisbranch; + int foundthebranch; + int *reftable; + int nsubalignments, maxmem; + int **subtable; + int *insubtable; + int *preservegaps; + char ***subalnpt; + int ntarget, *targetmap, *targetmapr; + int ilim; + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + if( fastathreshold < 0.0001 ) constraint = 0; + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( infp ); +#endif + rewind( infp ); + + nkozo = 0; + + + + if( njob < 2 ) + { + seq = AllocateCharMtx( 2, nlenmax*1+1 ); + name = AllocateCharMtx( 2, B+1 ); +// nlen = AllocateIntVec( 2 ); + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); + initFiles(); + gappick0( seq[1], seq[0] ); +// writeData_pointer( prep_g, njob, name, nlen, seq+1 ); + writeData_pointer( prep_g, njob, name, nlen, seq+1 ); + reporterr( "Warning: Only %d sequence found.\n", njob ); + FreeCharMtx( seq ); + FreeCharMtx( name ); +// free( nlen ); + closeFiles(); + exit( 0 ); + } + + + if( nlenmax < 1 ) + { + seq = AllocateCharMtx( njob, nlenmax*1+1 ); + name = AllocateCharMtx( njob, B+1 ); +// nlen = AllocateIntVec( 2 ); + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); + initFiles(); + for( i=0; i 30000 ) + if( nlenmax > 50000 ) // version >= 6.823 + { +#if 0 + if( constraint ) + { + fprintf( stderr, "\nnlenmax=%d, nagasugi!\n", nlenmax ); + exit( 1 ); + } + if( nevermemsave ) + { + fprintf( stderr, "\nnevermemsave=1, nlenmax=%d, nagasugi!\n", nlenmax ); + exit( 1 ); + } +#endif + if( !constraint && !nevermemsave && alg != 'M' ) + { + fprintf( stderr, "\nnlenmax=%d, Switching to the memsave mode\n", nlenmax ); + alg = 'M'; + } + } + + + if( specificityconsideration ) calcmaxdistclass(); + + for( i=0; i 0.0 && subalignment == 0 ) + { +// reporterr( "Computing skipthisbranch..\n" ); + insubtable = AllocateIntVec( njob ); + preservegaps = AllocateIntVec( njob ); + subtable = calloc( 1, sizeof( char * ) ); + subtable[0] = NULL; // for FreeIntMtx + for( i=0; i 0 ) + { + reftable = calloc( sizeof( int ), njob ); + for( j=0; j= njob ) + { + fprintf( stderr, "No such sequence, %d.\n", subtable[i][j]+1 ); + exit( 1 ); + } + if( alignmentlength != strlen( seq[subtable[i][j]] ) ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "# ERROR!\n" ); + fprintf( stderr, "# Subalignment %d must be aligned.\n", i+1 ); + fprintf( stderr, "# Please check the alignment lengths of following sequences.\n" ); + fprintf( stderr, "#\n" ); + fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][0]+1, name[subtable[i][0]]+1, alignmentlength ); + fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][j]+1, name[subtable[i][j]]+1, (int)strlen( seq[subtable[i][j]] ) ); + fprintf( stderr, "#\n" ); + fprintf( stderr, "# See http://mafft.cbrc.jp/alignment/software/merge.html for details.\n" ); + if( subalignmentoffset ) + { + fprintf( stderr, "#\n" ); + fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + fprintf( stderr, "# In this case, the rule of numbering is:\n" ); + fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "\n" ); + exit( 1 ); + } + insubtable[subtable[i][j]] = 1; + } + for( j=0; j OK\n" ); + break; + } + } + if( !foundthebranch ) + { + system( "cp infile.tree GuideTree" ); // tekitou + fprintf( stderr, "\n" ); + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "# ERROR!\n" ); + fprintf( stderr, "# Subalignment %d does not seem to form a monophyletic cluster\n", i+1 ); + fprintf( stderr, "# in the guide tree ('GuideTree' in this directory) internally computed.\n" ); + fprintf( stderr, "# If you really want to use this subalignment, pelase give a tree with --treein \n" ); + fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/treein.html\n" ); + fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/merge.html\n" ); + if( subalignmentoffset ) + { + fprintf( stderr, "#\n" ); + fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + fprintf( stderr, "# In this case, the rule of numbering is:\n" ); + fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + fprintf( stderr, "############################################################################### \n" ); + fprintf( stderr, "\n" ); + exit( 1 ); + } +// commongappick( seq[subtable[i]], subalignment[i] ); // irukamo + } +#if 0 + for( i=0; i %d\n\n", skipthisbranch[i][0] ); + fprintf( stderr, "group2 = " ); + for( j=0; topol[i][1][j] != -1; j++ ) + fprintf( stderr, "%d ", topol[i][1][j]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "SKIP -> %d\n\n", skipthisbranch[i][1] ); + } +#endif + + for( i=0; i nlenmax ) nlenmax = nlen[i]; + i++; + } + } + if( nlenmax > N || njob > M ) + { + fprintf( stderr, "ERROR in main\n" ); + exit( 1 ); + } + /* + nlenmax = Na; + */ + rewind( stdin ); + value = main1( nlen, argc, argv ); + exit( 0 ); +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/core/f2cl.c b/mafft/src/mafft-7.487-with-extensions/core/f2cl.c new file mode 100644 index 0000000000..a14dbe2996 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/f2cl.c @@ -0,0 +1,383 @@ +#include "mltaln.h" + +#define DEBUG 0 + + +static char *comment; +static char *orderfile; +static int format; +static int namelen; +static int excludedashseq; +static int extendedalphabet; + +static void fillspace( char *seq, int lenmax ) +{ + int len = strlen( seq ); + seq += len; + lenmax -= len; + while( lenmax-- ) *seq++ = ' '; + *seq = 0; +} + +void setmark_clustal( int nlen, int nseq, char **seq, char *mark ) +{ + int i, j, k, nalpha; + char firstletter; + char *strong[9]; + char *weaker[11]; + int nstrong, nweaker; + char s; + + if( dorp == 'd' ) + { + strong[0] = "TU"; + nstrong = 1; + weaker[0] = "AG"; + weaker[1] = "CT"; + weaker[2] = "CU"; + nweaker = 2; + nalpha = 10; + } + else + { + strong[0] = "STA"; + strong[1] = "NEQK"; + strong[2] = "NHQK"; + strong[3] = "NDEQ"; + strong[4] = "QHRK"; + strong[5] = "MILV"; + strong[6] = "MILF"; + strong[7] = "HY"; + strong[8] = "FYW"; + nstrong = 9; + weaker[0] = "CSA"; + weaker[1] = "ATV"; + weaker[2] = "SAG"; + weaker[3] = "STNK"; + weaker[4] = "STPA"; + weaker[5] = "SGND"; + weaker[6] = "SNDEQK"; + weaker[7] = "NDEQHK"; + weaker[8] = "NEQHRK"; + weaker[9] = "FVLIM"; + weaker[10] = "HFY"; + nweaker = 11; + nalpha = 20; + } + + for( i=0; i= nalpha || amino_n[(unsigned char)firstletter] < 0 ) continue; + + for( j=0; j 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'c': + comment = *++argv; + fprintf( stderr, "comment = %s\n", comment ); + --argc; + goto nextoption; + case 'r': + orderfile = *++argv; + fprintf( stderr, "orderfile = %s\n", orderfile ); + --argc; + goto nextoption; + case 'n': + namelen = myatoi( *++argv ); + fprintf( stderr, "namelen = %d\n", namelen ); + --argc; + goto nextoption; + case 'f': + format = 'f'; + break; + case 'd': + excludedashseq = 1; + break; + case 'y': + format = 'y'; + break; + case 'E': + extendedalphabet = 1; + nblosum = -2; + break; + case 'N': + extendedalphabet = 0; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + static int *nlen, *onlen; + static char **name, **oname, **seq, **oseq, *mark; + static int *order, *oorder; + int i, j; + FILE *infp; + FILE *orderfp; + char gett[B]; + int nlenmin; + int nout; + + arguments( argc, argv ); + + + if( inputfile ) + { + infp = fopen( inputfile, "rb" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen_casepreserve( infp, &nlenmin ); + rewind( infp ); + + seq = AllocateCharMtx( njob, nlenmax*2+1 ); + mark = AllocateCharVec( nlenmax*2+1 ); + order = AllocateIntVec( njob ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + + if( orderfile ) + { + orderfp = fopen( orderfile, "r" ); + if( !orderfp ) + { + fprintf( stderr, "Cannot open %s\n", orderfile ); + exit( 1 ); + } + for( i=0; i= n) break; + k = n2; + while (k <= j) { j -= k; k /= 2; } + j += k; + } +} +/* +*/ +int fft(int n, Fukusosuu *x, int freeflag) +{ + static TLS int last_n = 0; /* {\tt n} */ + static TLS int *bitrev = NULL; /* */ + static TLS double *sintbl = NULL; /* */ + int i, j, k, ik, h, d, k2, n4, inverse; + double t, s, c, dR, dI; + + if (freeflag) + { + if (bitrev) free(bitrev); bitrev = NULL; + if (sintbl) free(sintbl); sintbl = NULL; + last_n = 0; + return( 0 ); + } + + /* */ + if (n < 0) { + n = -n; inverse = 1; /* */ + } else inverse = 0; + n4 = n / 4; + if (n != last_n || n == 0) { + last_n = n; +#if 0 + if (sintbl != NULL) { + free(sintbl); + sintbl = NULL; + } + if (bitrev != NULL) { + free(bitrev); + bitrev = NULL; + } + if (n == 0) return 0; /* */ + sintbl = (double *)malloc((n + n4) * sizeof(double)); + bitrev = (int *)malloc(n * sizeof(int)); +#else /* by T. Nishiyama */ + sintbl = realloc(sintbl, (n + n4) * sizeof(double)); + bitrev = realloc(bitrev, n * sizeof(int)); +#endif + if (sintbl == NULL || bitrev == NULL) { + fprintf(stderr, "\n"); return 1; + } + make_sintbl(n, sintbl); + make_bitrev(n, bitrev); + } + for (i = 0; i < n; i++) { /* */ + j = bitrev[i]; + if (i < j) { + t = x[i].R; x[i].R = x[j].R; x[j].R = t; + t = x[i].I; x[i].I = x[j].I; x[j].I = t; + } + } + for (k = 1; k < n; k = k2) { /* */ +#if 0 + fprintf( stderr, "%d / %d\n", k, n ); +#endif + h = 0; k2 = k + k; d = n / k2; + for (j = 0; j < k; j++) { +#if 0 + if( j % 1 == 0 ) + fprintf( stderr, "%d / %d\r", j, k ); +#endif + c = sintbl[h + n4]; + if (inverse) s = - sintbl[h]; + else s = sintbl[h]; + for (i = j; i < n; i += k2) { +#if 0 + if( k>=4194000 ) fprintf( stderr, "in loop %d - %d < %d, k2=%d\r", j, i, n, k2 ); +#endif + ik = i + k; + dR = s * x[ik].I + c * x[ik].R; + dI = c * x[ik].I - s * x[ik].R; + x[ik].R = x[i].R - dR; x[i].R += dR; + x[ik].I = x[i].I - dI; x[i].I += dI; + } + h += d; + } + } + if (! inverse) /* n */ + for (i = 0; i < n; i++) { x[i].R /= n; x[i].I /= n; } + return 0; /* */ +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/fft.h b/mafft/src/mafft-7.487-with-extensions/core/fft.h new file mode 100644 index 0000000000..64ff19686e --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/fft.h @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include "mtxutl.h" + +#define PI 3.14159265358979323846 +#define END_OF_VEC -1 + +#define NKOUHO 20 +#define NKOUHO_LONG 500 + +#define MAX(X,Y) ( ((X)>(Y))?(X):(Y) ) +#define MIN(X,Y) ( ((X)<(Y))?(X):(Y) ) + diff --git a/mafft/src/mafft-7.487-with-extensions/core/fftFunctions.c b/mafft/src/mafft-7.487-with-extensions/core/fftFunctions.c new file mode 100644 index 0000000000..8c6d1867e0 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/fftFunctions.c @@ -0,0 +1,762 @@ +#include "mltaln.h" + +#define SEGMENTSIZE 150 +#define TMPTMPTMP 0 + +#define DEBUG 0 + +void keika( char *str, int current, int all ) +{ + if( current == 0 ) + fprintf( stderr, "%s : ", str ); + + fprintf( stderr, "\b\b\b\b\b\b\b\b" ); + fprintf( stderr, "%3d /%3d", current+1, all+1 ); + + if( current+1 == all ) + fprintf( stderr, "\b\b\b\b\b\b\b\bdone. \n" ); +} + +double maxItch( double *soukan, int size ) +{ + int i; + double value = 0.0; + double cand; + for( i=0; i value ) value = cand; + return( value ); +} + +void calcNaiseki( Fukusosuu *value, Fukusosuu *x, Fukusosuu *y ) +{ + value->R = x->R * y->R + x->I * y->I; + value->I = -x->R * y->I + x->I * y->R; +} + +Fukusosuu *AllocateFukusosuuVec( int l1 ) +{ + Fukusosuu *value; + value = (Fukusosuu *)calloc( l1, sizeof( Fukusosuu ) ); + if( !value ) + { + fprintf( stderr, "Cannot allocate %d FukusosuuVec\n", l1 ); + return( NULL ); + } + return( value ); +} + +Fukusosuu **AllocateFukusosuuMtx( int l1, int l2 ) +{ + Fukusosuu **value; + int j; +// fprintf( stderr, "allocating %d x %d FukusosuuMtx\n", l1, l2 ); + value = (Fukusosuu **)calloc( l1+1, sizeof( Fukusosuu * ) ); + if( !value ) + { + fprintf( stderr, "Cannot allocate %d x %d FukusosuuVecMtx\n", l1, l2 ); + exit( 1 ); + } + for( j=0; j max ) + { + ikouho = i; + max = tmp; + } + } +#if 0 + if( max < 0.15 ) + { + break; + } +#endif +#if 0 + fprintf( stderr, "Kouho No.%d, pos=%d, score=%f, lag=%d\n", j, ikouho, soukan[ikouho], ikouho-nlen4 ); +#endif + soukan[ikouho] = -9999.9; + kouho[j] = ( ikouho - nlen4 ); + } + return( j ); +} + +void zurasu2( int lag, int clus1, int clus2, + char **seq1, char **seq2, + char **aseq1, char **aseq2 ) +{ + int i; +#if 0 + fprintf( stderr, "### lag = %d\n", lag ); +#endif + if( lag > 0 ) + { + for( i=0; i 0 ) + { + for( i=0; i=0; j-- ) + { + if( prf1[j] ) + { + hat1[pre1] = j; + pre1 = j; + } + if( prf2[j] ) + { + hat2[pre2] = j; + pre2 = j; + } + } + hat1[pre1] = -1; + hat2[pre2] = -1; + + /* make site score */ + stra[i] = 0.0; + for( k=hat1[nalphabets]; k!=-1; k=hat1[k] ) + for( j=hat2[nalphabets]; j!=-1; j=hat2[j] ) +// stra[i] += n_dis[k][j] * prf1[k] * prf2[j]; + stra[i] += n_disFFT[k][j] * prf1[k] * prf2[j]; + stra[i] /= totaleff; + } + + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + status = 0; + cumscore = 0.0; + score = 0.0; + for( j=0; j threshold ) + { +#if 0 + seg->start = i; + seg->end = i; + seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ; + seg->score = score; + status = 0; + value++; +#else + if( !status ) + { + status = 1; + starttmp = i; + length = 0; + cumscore = 0.0; + } + length++; + cumscore += score; +#endif + } + if( score <= threshold || length > SEGMENTSIZE ) + { + if( status ) + { + if( length > fftWinSize ) + { + seg->start = starttmp; + seg->end = i; + seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ; + seg->score = cumscore; +#if 0 + fprintf( stderr, "%d-%d length = %d, score = %f, value = %d\n", seg->start, seg->end, length, cumscore, value ); +#endif + if( length > SEGMENTSIZE ) + { + (seg+0)->skipForeward = 1; + (seg+1)->skipBackward = 1; + } + else + { + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + } + value++; + seg++; + } + length = 0; + cumscore = 0.0; + status = 0; + starttmp = i; + if( value > MAXSEG - 3 ) ErrorExit( "TOO MANY SEGMENTS!"); + } + } + } + if( status && length > fftWinSize ) + { + seg->end = i; + seg->start = starttmp; + seg->center = ( starttmp + i + fftWinSize ) / 2 ; + seg->score = cumscore; +#if 0 +fprintf( stderr, "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + value++; + } +#if TMPTMPTMP + exit( 0 ); +#endif +// fprintf( stderr, "returning %d\n", value ); + return( value ); +} + + +static int permit( Segment *seg1, Segment *seg2 ) +{ + return( 0 ); + if( seg1->end >= seg2->start ) return( 0 ); + if( seg1->pair->end >= seg2->pair->start ) return( 0 ); + else return( 1 ); +} + +void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ) +{ + int i, j, k, shift, cur1, cur2, count, klim; + static TLS int crossscoresize = 0; + static TLS int *result1 = NULL; + static TLS int *result2 = NULL; + static TLS int *ocut1 = NULL; + static TLS int *ocut2 = NULL; + double maximum; + static TLS double **crossscore = NULL; + static TLS int **track = NULL; + static TLS double maxj, maxi; + static TLS int pointj, pointi; + + if( cut1 == NULL) + { + if( result1 ) + { + if( result1 ) free( result1 ); result1 = NULL; + if( result2 ) free( result2 ); result2 = NULL; + if( ocut1 ) free( ocut1 ); ocut1 = NULL; + if( ocut2 ) free( ocut2 ); ocut2 = NULL; + if( track ) FreeIntMtx( track ); track = NULL; + if( crossscore ) FreeDoubleMtx( crossscore ); crossscore = NULL; + } + crossscoresize = 0; + return; + } + + if( result1 == NULL ) + { + result1 = AllocateIntVec( MAXSEG ); + result2 = AllocateIntVec( MAXSEG ); + ocut1 = AllocateIntVec( MAXSEG ); + ocut2 = AllocateIntVec( MAXSEG ); + } + + if( crossscoresize < *ncut+2 ) + { + crossscoresize = *ncut+2; + if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize ); + if( track ) FreeIntMtx( track ); + if( crossscore ) FreeDoubleMtx( crossscore ); + track = AllocateIntMtx( crossscoresize, crossscoresize ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + +#if 0 + for( i=0; i<*ncut-2; i++ ) + fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score ); + + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%#4.0f ", ocrossscore[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */ + crossscore[i][j] = ocrossscore[i][j]; + for( i=0; i<*ncut; i++ ) + { + ocut1[i] = cut1[i]; + ocut2[i] = cut2[i]; + } + + for( i=1; i<*ncut; i++ ) + { +#if 0 + fprintf( stderr, "### i=%d/%d\n", i,*ncut ); +#endif + for( j=1; j<*ncut; j++ ) + { + pointi = 0; maxi = 0.0; + klim = j-2; + for( k=0; k maxj ) + { + pointi = k; + maxi = crossscore[i-1][k]; + } + } + + pointj = 0; maxj = 0.0; + klim = i-2; + for( k=0; k maxj ) + { + pointj = k; + maxj = crossscore[k][j-1]; + } + } + + maxi += penalty; + maxj += penalty; + + maximum = crossscore[i-1][j-1]; + track[i][j] = 0; + + if( maximum < maxi ) + { + maximum = maxi ; + track[i][j] = j - pointi; + } + + if( maximum < maxj ) + { + maximum = maxj ; + track[i][j] = pointj - i; + } + + crossscore[i][j] += maximum; + } + } +#if 0 + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%3d ", track[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + + result1[MAXSEG-1] = *ncut-1; + result2[MAXSEG-1] = *ncut-1; + + for( i=MAXSEG-1; i>=1; i-- ) + { + cur1 = result1[i]; + cur2 = result2[i]; + if( cur1 == 0 || cur2 == 0 ) break; + shift = track[cur1][cur2]; + if( shift == 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - 1; + continue; + } + else if( shift > 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - shift; + } + else if( shift < 0 ) + { + result1[i-1] = cur1 + shift; + result2[i-1] = cur2 - 1; + } + } + + count = 0; + for( j=i; j ocrossscore[result1[j-1]][result2[j-1]] ) + count--; + + cut1[count] = ocut1[result1[j]]; + cut2[count] = ocut2[result2[j]]; + + count++; + } + + *ncut = count; +#if 0 + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); +#endif +} + +void blockAlign3( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ) +// memory complexity = O(n^3), time complexity = O(n^2) +{ + int i, j, shift, cur1, cur2, count; + static TLS int crossscoresize = 0; + static TLS int jumpposi, *jumppos; + static TLS double jumpscorei, *jumpscore; + static TLS int *result1 = NULL; + static TLS int *result2 = NULL; + static TLS int *ocut1 = NULL; + static TLS int *ocut2 = NULL; + double maximum; + static TLS double **crossscore = NULL; + static TLS int **track = NULL; + + if( result1 == NULL ) + { + result1 = AllocateIntVec( MAXSEG ); + result2 = AllocateIntVec( MAXSEG ); + ocut1 = AllocateIntVec( MAXSEG ); + ocut2 = AllocateIntVec( MAXSEG ); + } + if( crossscoresize < *ncut+2 ) + { + crossscoresize = *ncut+2; + if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize ); + if( track ) FreeIntMtx( track ); + if( crossscore ) FreeDoubleMtx( crossscore ); + if( jumppos ) FreeIntVec( jumppos ); + if( jumpscore ) FreeDoubleVec( jumpscore ); + track = AllocateIntMtx( crossscoresize, crossscoresize ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + jumppos = AllocateIntVec( crossscoresize ); + jumpscore = AllocateDoubleVec( crossscoresize ); + } + +#if 0 + for( i=0; i<*ncut-2; i++ ) + fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score ); + + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%#4.0f ", ocrossscore[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */ + crossscore[i][j] = ocrossscore[i][j]; + for( i=0; i<*ncut; i++ ) + { + ocut1[i] = cut1[i]; + ocut2[i] = cut2[i]; + } + for( j=0; j<*ncut; j++ ) + { + jumpscore[j] = -999.999; + jumppos[j] = -1; + } + + for( i=1; i<*ncut; i++ ) + { + + jumpscorei = -999.999; + jumpposi = -1; + + for( j=1; j<*ncut; j++ ) + { +#if 1 + fprintf( stderr, "in blockalign3, ### i=%d, j=%d\n", i, j ); +#endif + + +#if 0 + for( k=0; k maxj ) + { + pointi = k; + maxi = crossscore[i-1][k]; + } + } + + pointj = 0; maxj = 0.0; + for( k=0; k maxj ) + { + pointj = k; + maxj = crossscore[k][j-1]; + } + } + + + maxi += penalty; + maxj += penalty; +#endif + maximum = crossscore[i-1][j-1]; + track[i][j] = 0; + + if( maximum < jumpscorei && permit( seg1[jumpposi], seg1[i] ) ) + { + maximum = jumpscorei; + track[i][j] = j - jumpposi; + } + + if( maximum < jumpscore[j] && permit( seg2[jumppos[j]], seg2[j] ) ) + { + maximum = jumpscore[j]; + track[i][j] = jumpscore[j] - i; + } + + crossscore[i][j] += maximum; + + if( jumpscorei < crossscore[i-1][j] ) + { + jumpscorei = crossscore[i-1][j]; + jumpposi = j; + } + + if( jumpscore[j] < crossscore[i][j-1] ) + { + jumpscore[j] = crossscore[i][j-1]; + jumppos[j] = i; + } + } + } +#if 0 + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%3d ", track[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + + result1[MAXSEG-1] = *ncut-1; + result2[MAXSEG-1] = *ncut-1; + + for( i=MAXSEG-1; i>=1; i-- ) + { + cur1 = result1[i]; + cur2 = result2[i]; + if( cur1 == 0 || cur2 == 0 ) break; + shift = track[cur1][cur2]; + if( shift == 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - 1; + continue; + } + else if( shift > 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - shift; + } + else if( shift < 0 ) + { + result1[i-1] = cur1 + shift; + result2[i-1] = cur2 - 1; + } + } + + count = 0; + for( j=i; j ocrossscore[result1[j-1]][result2[j-1]] ) + count--; + + cut1[count] = ocut1[result1[j]]; + cut2[count] = ocut2[result2[j]]; + + count++; + } + + *ncut = count; +#if 0 + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); +#endif +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/filter.c b/mafft/src/mafft-7.487-with-extensions/core/filter.c new file mode 100644 index 0000000000..a9a70de944 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/filter.c @@ -0,0 +1,164 @@ +#include "mltaln.h" + +#define DEBUG 0 + +double maxunusual; + +static double count_unusual( char *seq, char *usual ) +{ + int i; + char *pt; + int count, len; + count = 0; + pt = seq; + while( *pt ) + { + if( !strchr( usual, *pt ) ) + count++; + pt++; + } +// reporterr( "%d/%d=%f\n", count, pt-seq, ((double)count/(pt-seq)) ); + return( (double)count / (pt-seq) ); +} + + +void arguments( int argc, char *argv[] ) +{ + int c; + + maxunusual = 0.05; + inputfile = NULL; + dorp = NOTSPECIFIED; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'm': + maxunusual = myatof( *++argv ); + fprintf( stderr, "maxunusual = %f\n", maxunusual ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + int nlenmin; + char **name; + char **seq; + int *nlen; + int i; + char *usual; + int nout; + char *tmpseq; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + +// dorp = NOTSPECIFIED; + getnumlen_casepreserve( infp, &nlenmin ); + +// fprintf( stderr, "%d x %d - %d %c\n", njob, nlenmax, nlenmin, dorp ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + tmpseq = AllocateCharVec( nlenmax+1 ); + +// readData_pointer( infp, name, nlen, seq ); + readData_pointer_casepreserve( infp, name, nlen, seq ); + fclose( infp ); + +// for( i=0; i%s\n", name[i]+1 ); + if( seq[i][nlen[i]-1] == '\n' ) seq[i][nlen[i]-1] = 0; + fprintf( origfp, "%s\n", seq[i] ); + } + fclose( origfp ); +#endif + + if( dorp == 'p' ) + usual = "ARNDCQEGHILKMFPSTWYVarndcqeghilkmfpstwyv-"; + else + usual = "ATGCUatgcu-"; + nout = 0; + for( i=0; i%s\n", name[i]+1 ); + fprintf( stdout, "%s\n", seq[i] ); + nout++; + } + } + + if( nout < njob ) + { + if( dorp == 'p' ) + fprintf( stderr, "\n\nRemoved %d sequence(s) where the frequency of ambiguous amino acids > %5.3f\n\n\n", njob-nout, maxunusual ); + else + fprintf( stderr, "\n\nRemoved %d sequence(s) where the frequency of ambiguous bases > %5.3f\n\n\n", njob-nout, maxunusual ); + } + + free( nlen ); + free( tmpseq ); + FreeCharMtx( seq ); + FreeCharMtx( name ); + + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/functions.h b/mafft/src/mafft-7.487-with-extensions/core/functions.h new file mode 100644 index 0000000000..76aa759285 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/functions.h @@ -0,0 +1,427 @@ +extern int intlen( int *num ); +extern char seqcheck( char **seq ); +extern void scmx_calc( int icyc, char **aseq, double *effarr, double **scmx ); +extern void exitall( char arr[] ); +extern void display( char **seq, int nseq ); +extern void intergroup_score( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ); +//extern void intergroup_score_dynmtx( double **pairoffset, int mtx[0x80][0x80], char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ); +extern void intergroup_score_multimtx( int **whichmtx, double ***matrices, char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ); +extern void intergroup_score_gapnomi( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ); +extern void intergroup_score_new( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ); +extern double score_calc5( char **seq, int s, double **eff, int ex ); +extern double score_calc4( char **seq, int s, double **eff, int ex ); +extern void upg2( int nseq, double **eff, int ***topol, double **len ); +//extern void veryfastsupg_double_realloc_nobk_halfmtx( int njob, double **mtx, int ***topol, double **len ); +//extern void veryfastsupg_double_realloc_nobk( int njob, double **mtx, int ***topol, double **len ); +extern void veryfastsupg_int_realloc_nobk( int njob, int **mtx, int ***topol, double **len ); +extern void veryfastsupg( int nseq, double **oeff, int ***topol, double **len ); +extern void veryfastsupg_double( int nseq, double **oeff, int ***topol, double **len ); +extern void veryfastsupg_double_loadtree( int nseq, double **oeff, int ***topol, double **len, char **name ); +//extern void veryfastsupg_double_loadtop( int nseq, double **oeff, int ***topol, double **len ); +extern void veryfastsupg_int( int nseq, int **oeff, int ***topol, double **len ); +extern void fastsupg( int nseq, double **oeff, int ***topol, double **len ); +extern void supg( int nseq, double **oeff, int ***topol, double **len ); +extern void spg( int nseq, double **oeff, int ***topol, double **len ); +extern double ipower( double x, int n ); +extern void countnode( int nseq, int ***topol, double **node ); +extern void countnode_int( int nseq, int ***topol, int **node ); +extern void counteff_simple( int nseq, int ***topol, double **len, double *node ); +extern void counteff_simple_double( int nseq, int ***topol, double **len, double *node ); +extern void counteff_simple_double_nostatic( int nseq, int ***topol, double **len, double *node ); +extern void counteff_simple_double_nostatic_memsave( int nseq, int ***topol, double **len, Treedep *dep, double *node ); +extern void counteff( int nseq, int ***topol, double **len, double **node ); +extern double score_calc1( char *seq1, char *seq2 ); +extern double score_calcp( char *seq1, char *seq2, int len ); +extern double substitution_nid( char *seq1, char *seq2 ); +extern double substitution_score( char *seq1, char *seq2 ); +extern double substitution_hosei( char *seq1, char *seq2 ); +extern double substitution( char *seq1, char *seq2 ); +extern void treeconstruction( char **seq, int nseq, int ***topol, double **len, double **eff ); +extern double bscore_calc( char **seq, int s, double **eff ); +extern void AllocateTmpSeqs( char ***mseq2pt, char **mseq1pt, int locnlenmax ); +extern void FreeTmpSeqs( char **mseq2, char *mseq1 ); +extern void gappick_samestring( char *aseq ); +extern void gappick0( char *aseq, char *seq ); +extern void gappick( int nseq, int s, char **aseq, char **mseq2, + double **eff, double *effarr ); +extern void commongappick_record( int nseq, char **seq, int *map ); +extern void commongappick( int nseq, char **seq ); +extern int commongapcount( int , int, char **, char ** ); +//extern void commongaprecord( int nseq, char **seq, char *originallygapped ); +extern double score_calc0( char **seq, int s, double **eff, int ex ); +extern void strins( char *str1, char *str2 ); +extern int isaligned( int nseq, char **seq ); +extern double score_calc_for_score( int nseq, char **seq ); +extern void doublencpy( double *vec1, double *vec2, int len ); +extern double score_calc_a( char **seq, int s, double **eff ); +extern double score_calc_s( char **seq, int s, double **eff ); +extern double score_calc_for_score_s( int s, char **seq ); +extern double SSPscore( int s, char **seq ); +extern double DSPscore( int s, char **seq ); +extern int searchAnchors( int nseq, char **seq, Segment *seg ); +extern char *progName( char *str ); +extern void dontcalcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ); +extern void dontcalcimportance_target( int nseq, double *eff, char **seq, LocalHom **localhom, int ntarget ); +extern void calcimportance_target( int nseq, int ntarget, double *eff, char **seq, LocalHom **localhom, int *targetmap, int *targetmapr, int alloclen ); +extern void dontcalcimportance_lastone( int nseq, double *eff, char **seq, LocalHom **localhom ); +extern void dontcalcimportance_firstone( int nseq, double *eff, char **seq, LocalHom **localhom ); +extern void dontcalcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom ); +extern void calcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ); +extern void calcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom, int alloclen ); +extern void weightimportance2( int nseq, double *eff, LocalHom **localhom ); +extern void weightimportance4( int clus1, int clus2, double *eff1, double *eff2, LocalHom ***localhom ); +extern void extendlocalhom( int nseq, LocalHom **localhom ); +extern void extendlocalhom2( int nseq, LocalHom **localhom, double **mtx ); +extern int makelocal( char *s1, char *s2, int thr ); +extern void mdfymtx( char **pair, int s1, double **partialmtx, double **mtx ); +extern double score_calc( char **seq, int s ); +extern void cpmx_calc( char **seq, double **cpmx, double *eff, int lgth, int clus ); +extern void cpmx_calc_new( char **seq, double **cpmx, double *eff, int lgth, int clus ); +extern void cpmx_calc_add( char **seq, double **cpmx, double *eff, int lgth, int clus ); +extern void MScpmx_calc_new( char **seq, double **cpmx, double *eff, int lgth, int clus ); +extern void mseqcat( char **seq1, char **seq2, double **eff, double *effarr1, double *effarr2, char name1[M][B], char name2[M][B], int clus1, int clus2 ); +extern void strnbcat( char *s1, char *s2, int m ); +extern int conjuctionforgaln( int s0, int s1, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d ); +extern int fastconjuction( int *memlist, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d ); +extern int fastconjuction_noname_kozo( int *memlist, char **seq, char **aseq, double *peff, double *eff, double *peff_kozo, double *eff_kozo, char *d ); +extern int fastconjuction_noname( int *memlist, char **seq, char **aseq, double *peff, double *eff, char *d, double mineff, double *oritotal ); +extern int fastconjuction_target( int *memlist, char **seq, char **aseq, double *peff, double *eff, char *d, double mineff, int *targetmap ); +extern int fastconjuction_noweight( int *memlist, char **seq, char **aseq, double *peff, char *d ); +extern int conjuctionfortbfast_old( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char *d ); +extern int conjuction( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d ); +extern void doubledelete( double **cpmx, int d, int len ); +extern void chardelete( char *seq, int d ); +extern int RootBranchNode( int nseq, int ***topol, int step, int branch ); +extern void BranchLeafNode( int nseq, int ***topol, int *node, int step, int branch ); +extern void RootLeafNode( int nseq, int ***topol, int *node ); +extern void nodeFromABranch( int nseq, int *result, int **pairwisenode, int ***topol, double **len, int step, int num ); +//extern void OneClusterAndTheOther( int locnjob, char **pair, int *s1, int *s2, int ***topol, int step, int branch ); +extern void OneClusterAndTheOther_fast( int locnjob, int *memlist1, int *memlist2, int *s1, int *s2, char *pairbuf, int ***topol, int step, int branch, double **smalldistmtx, double **distmtx, double *distontree ); +extern void makeEffMtx( int nseq, double **mtx, double *vec ); +extern void node_eff( int nseq, double *eff, int *node ); +extern int shrinklocalhom( char **pair, int s1, int s2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int msshrinklocalhom_fast( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int msshrinklocalhom_fast_half( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int msshrinklocalhom_fast_target( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink, char *swaplist, int *targetmap ); +extern int fastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int fastshrinklocalhom_half( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int fastshrinklocalhom_target( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink, char *swaplist, int *targetmap ); +extern int fastshrinklocalhom_one( int *mem1, int *mem2, int norg, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int msfastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int fastshrinklocalhom_half_seed( int *mem1, int *mem2, int nseed, int *posinlsh1, int *posinlsh2, LocalHom **localhom, LocalHom ***localhomshrink ); +extern int TreeDependentIteration( int locnjob, char **name, int nlen[M], char **aseq, char **bseq, int ***topol, double **len, double **eff, int **skipthisbranch, int alloclen, LocalHom **localhomtable, RNApair ***single, int nkozo, char *kozoarivec, int ntarget, int *targetmap, int *targetmapr ); +extern void checkMinusLength( int nseq, double **len ); +extern void negativeMember2( int *mem, int *query, int locnseq ); +extern int *negativeMember( int *query, int locnseq ); +extern int IntExistsInVec( int query, int *vector ); +extern NodeInCub searchParent( int top, int ***topol, int Start, int End ); +extern void stopolInit( int n, Node *stopol ); +extern void treeCnv( Node *stopol, int locnseq, int ***topol, double **len, double **bw ); +extern int isLeaf( Node node ); +extern double syntheticLength( Node *ob, Node *oppositeNode ); +extern double calcW( Node *ob, Node *op ); +extern void calcBranchWeight( double **bw, int locnseq, Node *stopol, int ***topol, double **len ); +extern void branchWeightToPairWeight( int locnseq, int ***topol, double **pw, double **bw ); +extern void weightFromABranch( int nseq, double *result, Node *stopol, int ***topol, int step, int LorR ); +extern void distFromABranch( int nseq, double *result, Node *stopol, int ***topol, double **len, int step, int LorR ); +extern void keika( char *str, int current, int all ); +extern double maxItch( double *soukan, int size ); +extern void calcNaiseki( Fukusosuu *value, Fukusosuu *x, Fukusosuu *y ); +extern Fukusosuu *AllocateFukusosuuVec( int l1 ); +extern Fukusosuu **AllocateFukusosuuMtx( int l1, int l2 ); +extern Fukusosuu ***AllocateFukusosuuCub( int l1, int l2, int l3 ); +extern void FreeFukusosuuVec( Fukusosuu *vec ); +extern void FreeFukusosuuMtx( Fukusosuu **mtx ); +extern int getKouho( int *kouho, int nkouho, double *soukan, int nlen2 ); +extern void zurasu2( int lag, int clus1, int clus2, char **seq1, char **seq2, char **aseq1, char **aseq2 ); +extern void zurasu( int lag, int clus1, int clus2, char **seq1, char **seq2, char **aseq1, char **aseq2 ); +extern int alignableReagion( int clus1, int clus2, char **seq1, char **seq2, double *eff1, double *eff2, Segment *seg ); +extern void blockAlign( int *cut1, int *cut2, double **ocrossscore, int *ncut ); +extern void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ); +extern void blockAlign3( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ); +extern double imp_match_out_scD( int i1, int j1 ); +extern void imp_match_init_strictD( double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1kozo, double*eff2kozo, LocalHom ***localhom, char *swaplist, int forscore, int *memlist1, int *memlist2, int *uselh, int *seedinlh1, int *seedinlh2, int nodeid, int nfiles ); +extern double MSalignmm( double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, char *, char *, char *, char *, int *, int, int *, int headgp, int tailgp, double ***cpmxchild0, double ***cpmxchild1, double ***cpmxresult, double orieff1, double orieff2 ); +extern double MSalignmm_variousdist( double **pairoffset, double ***matrices, double **dummtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, char *, char *, char *, char *, int *, int, int *, int headgp, int tailgp ); +extern double Lalignmm_hmout( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, char *, char *, char *, char *, double **map ); +extern double Lalign2m2m_hmout( char **seq1, char **seq2, char **seq1r, char **seq2r, char *dir1, char *dir2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, char *, char *, char *, char *, double **map ); +extern double MSalign11( char **seq1, char **seq2, int alloclen ); +//extern double rnalocal( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, RNApair **pair ); +extern double A__align( double **scoringmtx, int penalty, int penalty_ex, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *gs1, char *gs2, char *ge1, char *ge2, int *, int, int *, int headgp, int tailgp, int firstmem, int calledby, double ***cpmxchild0, double ***cpmxchild1, double ***cpmxresult, double orieff1, double orieff2 ); +extern double A__align_variousdist( int **which, double ***scoringmatrices, double **dummtx, int penalty, int penalty_ex, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *gs1, char *gs2, char *ge1, char *ge2, int *, int, int *, int headgp, int tailgp ); +extern double A__align_gapmap( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int *gapmap1, int *gapmap2 ); +extern double translate_and_Calign( char **mseq1, char **mseq2, double *effarr1, double *effarr2, int clus1, int clus2, int alloclen ); +extern double Fgetlag( double **scoringmtx, char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int alloclen ); +extern double Falign( int **whichmtx, double ***scoringmatrices, double **scoreingmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int clus1, int clus2, int alloclen, int *fftlog, int *, int, int * ); +extern double Falign_udpari_long( int **whichmtx, double ***scoringmatrices, double **scoringmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int clus1, int clus2, int alloclen, int *fftlog ); +extern double Falign_givenanchors( ExtAnch *extanch, int **whichmtx, double ***scoringmatrices, double **scoringmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int clus1, int clus2, int alloclen, int *fftlog ); +double Falign_localhom( int **which, double ***scoringmatrices, double **scoreingmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int clus1, int clus2, int alloclen, int constraint, double *totalimpmatch, int *gapmap1, int *gapmap2, int *chudanpt, int chudanref, int *chudanres ); +extern double part_imp_match_out_sc( int i1, int j1 ); +extern void part_imp_match_init_strict( double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *memlist1, int *memlist2 ); +extern void part_imp_match_init( double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, LocalHom ***localhom ); +extern double partA__align( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int start1, int end1, int start2, int end2, int *gapmap1, int *gapmap2, char *, char *, char *, char *, int *, int, int * ); +extern double partA__align_variousdist( int **which, double ***scoringmatrices, double **dummtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int start1, int end1, int start2, int end2, int *gapmap1, int *gapmap2, char *, char *, char *, char *, int *, int, int * ); +extern double G__align11( double **scoringmtx, char **seq1, char **seq2, int alloclen, int headgp, int tailgp ); +extern double G__align11_noalign( double **scoringmtx, int penal, int penal_ex, char **seq1, char **seq2, int alloclen ); +extern double L__align11( double **scoringmtx, double scoreoffset, char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt ); +extern double L__align11_noalign( double **scoringmtx, char **seq1, char **seq2 ); +extern double genL__align11( double **scoringmtx, char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt ); +extern double genG__align11( char **seq1, char **seq2, int alloclen ); +extern double VAalign11( char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt, LocalHom *lhmpt ); +extern double suboptalign11( char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt, LocalHom *lhmpt ) +; +extern int fft(int n, Fukusosuu *x, int dum); +extern void topolcpy( int s1[], int s2[], int *mpt1, int *mpt2 ); +extern void topolcat( int s1[], int s2[], int *mpt1, int *mpt2 ); +extern void topolsort( int m, int s[] ); +extern void topolswap( int s1[], int s2[], int *mpt1, int *mpt2 ); +extern void reduc( double **mtx, int nseq, int im, int jm ); +extern void nj( int nseq, double **omtx, int ***topol, double **dis ); +extern void JTTmtx( double **rsr, double *freq, unsigned char locamino[0x80], char locgrp[0x80], int isTM ); +extern void BLOSUMmtx( int n, double **matrix, double *freq, unsigned char *amino, char *amino_grp, int *rescale ); +extern void extendedmtx( double **matrix, double *freq, unsigned char *amino, char *amino_grp ); +extern void putlocalhom2( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ); +extern void putlocalhom_str( char *al1, char *al2, double *equiv, double scale, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ); +extern void putlocalhom_ext( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ); +extern void putlocalhom3( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ); +extern void putlocalhom( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ); +extern char *cutal( char *al, int al_display_start, int start, int end ); +extern void ErrorExit( char *message ); +extern void strncpy_caseC( char *str1, char *str2, int len ); +extern void seqUpper( int nseq, char **seq ); +extern void seqLower( int nseq, char **seq ); +extern int getaline_fp_eof( char *s, int l, FILE *fp ); +extern int getaline_fp_eof_new(char s[], int l, FILE *fp); +extern int myfgets(char s[], int l, FILE *fp); +extern double input_new( FILE *fp, int d ); +extern void PreRead( FILE *fp, int *locnjob, int *locnlenmax ); +extern int allSpace( char *str ); +extern void Read( char name[M][B], int nlen[M], char **seq ); +extern void FRead( FILE *fp, char name[][B], int nlen[], char **seq ); +extern void kake2hiku( char *str ); +extern int copydatafromgui( char **namegui, char **seqgui, char **name, int *nlen, char **seq ); +extern void readDataforgaln( FILE *fp, char **name, int *nlen, char **seq ); +extern void readData( FILE *fp, char name[][B], int nlen[], char **seq ); +extern void readData_pointer_casepreserve( FILE *fp, char **name, int *nlen, char **seq ); +extern void readData_pointer( FILE *fp, char **name, int *nlen, char **seq ); +extern void readData_pointer2( FILE *fp, int nseq, char **name, int *nlen, char **seq ); +extern void readData_varlen( FILE *fp, char **name, int *nlen, char **seq ); +extern int countATGC( char *s, int *total ); +extern void getnumlen( FILE *fp ); +extern void getnumlen_casepreserve( FILE *fp, int *nlenmin ); +extern void getnumlen_nogap( FILE *fp, int *nlenmin ); +extern void getnumlen_nogap_countn( FILE *fp, int *nlenmin, double *nfreq ); +extern void WriteGapFill( FILE *fp, int locnjob, char name[][B], int nlen[M], char **aseq ); +extern void writeDataforgaln( FILE *fp, int locnjob, char **name, int *nlen, char **aseq ); +extern void writeData( FILE *fp, int locnjob, char name[][B], int nlen[], char **aseq ); +extern void writeData_pointer( FILE *fp, int locnjob, char **name, int *nlen, char **aseq ); +extern void readhat2_doublehalf( FILE *fp, int nseq, char name[M][B], double **mtx ); +extern void readhat2_doublehalf_pointer( FILE *fp, int nseq, char **name, double **mtx ); +extern void readhat2_doublehalf_part_pointer( FILE *fp, int nseq, int nadd, char **name, double **mtx ); +extern void readhat2_double( FILE *fp, int nseq, char name[M][B], double **mtx ); +extern void readhat2_int( FILE *fp, int nseq, char name[M][B], int **mtx ); +extern void readhat2_pointer( FILE *fp, int nseq, char **name, double **mtx ); +extern void readhat2( FILE *fp, int nseq, char name[M][B], double **mtx ); +extern void WriteFloatHat2_pointer_halfmtx( FILE *hat2p, int locnjob, char **name, double **mtx ); +extern void WriteFloatHat2( FILE *hat2p, int locnjob, char name[M][B], double **mtx ); +extern void WriteHat2_int( FILE *hat2p, int locnjob, char name[M][B], int **mtx ); +extern void WriteHat2( FILE *hat2p, int locnjob, char name[M][B], double **mtx ); +extern void WriteHat2_pointer( FILE *hat2p, int locnjob, char **name, double **mtx ); +extern void WriteHat2_part_pointer( FILE *hat2p, int locnjob, int nadd, char **name, double **mtx ); +extern int ReadFasta_sub( FILE *fp, double *dis, int nseq, char name[M][B] ); +extern int ReadSsearch( FILE *fp, double *dis, int nseq, char name[M][B] ); +extern int ReadBlastm7( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ); +extern int ReadBlastm7_scoreonly( FILE *fp, double *dis, int nin ); +extern int ReadBlastm7_avscore( FILE *fp, double *dis, int nin ); +extern int ReadFasta34noalign( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ); +extern int ReadFasta34m10_nuc( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ); +extern int ReadFasta34m10( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ); +extern int ReadFasta34m10_scoreonly_nuc( FILE *fp, double *dis, int nin ); +extern int ReadFasta34m10_scoreonly( FILE *fp, double *dis, int nin ); +extern int ReadFasta34( FILE *fp, double *dis, int nseq, char name[M][B], LocalHom *localhomlist ); +extern int ReadFasta3( FILE *fp, double *dis, int nseq, char name[M][B] ); +extern int ReadFasta( FILE *fp, double *dis, int nseq, char name[M][B] ); +extern int ReadOpt( FILE *fp, int opt[M], int nseq, char name[M][B] ); +extern int ReadOpt2( FILE *fp, int opt[M], int nseq, char name[M][B] ); +extern int writePre( int nseq, char **name, int nlen[M], char **aseq, int force ); +extern void readOtherOptions( int *ppidptr, int *fftThresholdptr, int *fftWinSizeptr ); +extern void initSignalSM( void ); +extern void initFiles( void ); +extern void WriteForFasta( FILE *fp, int locnjob, char **name, int nlen[M], char **aseq ); +extern void readlocalhomtable( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ); +extern void readlocalhomtable_half( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ); +extern void readlocalhomtable_target( FILE*fp, int nt, int njob, LocalHom **localhomtable, char *kozoarivec, int *targetmap ); +extern void readlocalhomtable2( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ); +extern void readlocalhomtable2_half( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ); +extern void readlocalhomtable2_target( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec, int *targetmap ); +extern void readlocalhomtable_part( FILE*fp, int njob, int nadd, LocalHom **localhomtable, char *kozoarivec ); +extern void readlocalhomtable_two( FILE*fp, int njob, int nadd, LocalHom **localhomtable, LocalHom **localhomtablex, char *kozoarivec ); +extern void readlocalhomtable_one( FILE*fp, int njob, int nadd, LocalHom **localhomtable, char *kozoarivec ); +extern void outlocalhom( LocalHom **localhom, int nseq ); +extern void outlocalhom_part( LocalHom **localhom, int norg, int nadd ); +extern void outlocalhompt( LocalHom ***localhom, int n1, int n2 ); +extern void FreeLocalHomTable_half( LocalHom **localhomtable, int n ) ; +extern void FreeLocalHomTable( LocalHom **localhomtable, int n ) ; +extern void FreeLocalHomTable_part( LocalHom **localhomtable, int n, int m ) ; +extern void FreeLocalHomTable_two( LocalHom **localhomtable, int n, int m ) ; +extern void FreeLocalHomTable_one( LocalHom **localhomtable, int n, int m ) ; +extern void freelocalhom1( LocalHom *lh ); +extern void initlocalhom1( LocalHom *lh ); +extern void constants( int nseq, char **seq ); +extern void clustalout_pointer( FILE *fp, int nseq, int maxlen, char **seq, char **name, char *mark, char *comment, int *order, int namelen ); +extern void phylipout_pointer( FILE *fp, int nseq, int maxlen, char **seq, char **name, int *order, int namelen ); +extern void writeData_reorder( FILE *fp, int locnjob, char name[][B], int nlen[], char **aseq, int *order ); +extern void writeData_reorder_pointer( FILE *fp, int locnjob, char **name, int *nlen, char **aseq, int *order ); + +extern void resetlocalhom( int, LocalHom ** ); +extern int load1SeqWithoutName_new( FILE *fpp, char *cbuf ); +extern char *load1SeqWithoutName_realloc( FILE *fpp ); +extern char *load1SeqWithoutName_realloc_casepreserve( FILE *fpp ); +extern void searchKUorWA( FILE *fp ); +extern void gapireru( char *res, char *ori, char *gt ); +extern int seqlen( char *seq ); +extern void st_FinalGapCount( double *fgcp, int clus, char **seq, double *eff, int len ); +extern void st_FinalGapAdd( double *fgcp, int clus, char **seq, double *eff, int len ); +extern void st_OpeningGapCount( double *ogcp, int clus, char **seq, double *eff, int len ); +extern void st_OpeningGapAdd( double *ogcp, int clus, char **seq, double *eff, int len ); +extern void st_FinalGapCount_zure( double *fgcp, int clus, char **seq, double *eff, int len ); +extern void getdiaminofreq_x( double *freq, int clus, char **seq, double *eff, int len ); +extern void new_FinalGapCount_zure( double *fgcp, int clus, char **seq, double *eff, int len, char *s, char *e ); +extern void new_FinalGapCount( double *fgcp, int clus, char **seq, double *eff, int len, char *g ); +extern void new_OpeningGapCount( double *ogcp, int clus, char **seq, double *eff, int len, char *g ); +extern void new_OpeningGapCount_zure( double *ogcp, int clus, char **seq, double *eff, int len, char *s, char *e ); +extern void getGapPattern( double *fgcp, int clus, char **seq, double *eff, int len, char *g ); +extern void getgapfreq( double *freq, int clus, char **seq, double *eff, int len ); +extern void getgapfreq_zure( double *freq, int clus, char **seq, double *eff, int len ); +//extern void getgapfreq_zure_part( double *freq, int clus, char **seq, double *eff, int len, char *s ); +extern void getgapfreq_zure_part( double *freq, int clus, char **seq, double *eff, int len, char *s ); +extern void getdiaminofreq_part( double *freq, int clus, char **seq, double *eff, int len, char *s, char *e ); +extern void getdigapfreq_part( double *freq, int clus, char **seq, double *eff, int len, char *s, char *e ); +extern void getdiaminofreq_st( double *freq, int clus, char **seq, double *eff, int len ); +extern void getdigapfreq_st( double *freq, int clus, char **seq, double *eff, int len ); +extern void st_getGapPattern( Gappat **gpat, int clus, char **seq, double *eff, int len ); +extern void getkyokaigap( char *g, char **s, int pos, int n ); +extern double *loadaamtx( int *rescalept ); +extern double naivepairscore( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, int penal ); +extern double naivepairscore11( char *seq1, char *seq2, int penal ); +extern double naivepairscore11_dynmtx( double **, char *seq1, char *seq2, int penal ); +extern double naivepairscorefast( char *seq1, char *seq2, int *skip1, int *skip2, int penal ); +extern double naiveQpairscore( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, int penal ); +extern double naiveRpairscore( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, int penal ); +extern double naiveHpairscore( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, int penal ); +extern void foldrna( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***gr1, RNApair ***gr2, double **impmtx, int *gapmap1, int *gapmap2, RNApair *pair ); +extern void foldrna_gappick( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***gr1, RNApair ***gr2, double **impmtx, int *gapmap1, int *gapmap2, RNApair *pair ); +extern void imp_rna( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***gr1, RNApair ***gr2, int *gapmap1, int *gapmap2, RNApair *pair ); +extern void imp_rnaD( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***gr1, RNApair ***gr2, int *gapmap1, int *gapmap2, RNApair *pair ); +extern void part_imp_rna( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***gr1, RNApair ***gr2, int *gapmap1, int *gapmap2, RNApair *pair ); +extern void foldalignedrna( int clus1, int clus2, char **mseq1, char **mseq2, double *effarr1, double *effarr2, RNApair *rnapairboth ); +void readmccaskill( FILE *fp, RNApair **pairprob, int length ); +void makegrouprna( RNApair ***group, RNApair ***all, int *memlist ); +void makegrouprnait( RNApair ***group, RNApair ***all, char *pair, int s ); +extern void fixed_musclesupg_double_realloc_nobk_halfmtx( int nseq, double **eff, int ***topol, double **len, Treedep *, int progressout, int efffree ); +extern void fixed_musclesupg_double_realloc_nobk_halfmtx_memsave( int nseq, double **eff, int ***topol, double **len, Treedep *, int progressout, int efffree ); +extern void loadtop( int nseq, double **mtx, int ***topol, double **len, char **name, int *nlen, Treedep * ); +extern void loadtree( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *, int treeout ); +extern int check_guidetreefile( int *seed, int *npick, double *limitram ); +extern void createchain( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int shuffle, int seed ); +//extern void loadtop( int nseq, double **eff, int ***topol, double **len ); +extern void fixed_musclesupg_double_realloc_nobk_halfmtx_treeout( int nseq, double **eff, int ***topol, double **len, char **name, int *nlen, Treedep *, int efffree ); // KESU +extern void fixed_musclesupg_double_realloc_nobk_halfmtx_treeout_memsave( int nseq, double **eff, int ***topol, double **len, char **name, int *nlen, Treedep *, int efffree, int treeout ); +extern void fixed_supg_double_realloc_nobk_halfmtx_treeout_constrained( int nseq, double **eff, int ***topol, double **len, char **name, int *nlen, Treedep *, int ncons, int **constraints, int efffree ); +extern void fixed_musclesupg_double_treeout( int nseq, double **eff, int ***topol, double **len, char **name ); +extern void fixed_supg_double_treeout_constrained( int nseq, double **eff, int ***topol, double **len, char **name, int ncons, int **constraints ); +extern void imp_match_init_strict( double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1kozo, double*eff2kozo, LocalHom ***localhom, char *swaplist, int forscore, int *memlist1, int *memlist2, int *uselh, int *seedinlh1, int *seedinlh2, int nodeid, int nfiles ); +extern void miyataout_reorder_pointer( FILE *fp, int locnjob, int nlenmax, char **name, int *nlen, char **aseq, int *order ); +extern void veryfastsupg_double_outtree( int nseq, double **eff, int ***topol, double **len, char **name ); +extern void cpmx_ribosum( char **seq, char **seqr, char *dir, double **cpmx, double *eff, int lgth, int clus ); +extern void rnaalifoldcall( char **seq, int nseq, RNApair **pairprob ); +extern void readpairfoldalign( FILE *fp, char *seq1, char *seq2, char *aln1, char *aln2, int q1, int q2, int *of1, int *of2, int sumlen ); +extern void write1seq( FILE *fp, char *aseq ); +extern void assignstrweight( int nseq, double *strweight, Node *stopol, int ***topol, int step, int LorR, char *kozoari, double *seqweight ); +extern void cutData( FILE *, int **, char **, int * ); +extern void cutAlignment( FILE *, int **, char **, int *, char **, char ** ); +extern void catData( FILE * ); +extern void getnumlen_nogap_outallreg_web( FILE *fp, FILE *ofp, int *nlenminpt, int *isalignedpt ); +extern void getnumlen_nogap_outallreg( FILE *fp, int *nlenminpt ); +extern double plainscore( int nseq, char **seq ); +extern void eq2dash( char *s ); +extern void eq2dashmatometehayaku( char **s, int n ); +extern void findnewgaps( int n, int rep, char **seq, int *gaplen ); +extern void findcommongaps( int, char **, int * ); +extern void adjustgapmap( int, int *, char * ); +extern void insertnewgaps_bothorders( int njob, int *alreadyaligned, char **seq, int *ex1, int *ex2, int *gaplen, int *gapmap, int gapmaplen, int alloclen, char alg, char gapchar ); +extern void insertnewgaps( int njob, int *alreadyaligned, char **seq, int *ex1, int *ex2, int *gaplen, int *gapmap, int alloclen, char alg, char gapchar ); +extern void restorecommongaps( int n, int n0, char **seq, int *top0, int *top1, int *gaplen, int alloclen, char gapchar ); +extern void restorecommongapssmoothly( int n, int n0, char **seq, int *top0, int *top1, int *gaplen, int alloclen, char gapchar ); +extern int samemember( int *mem, int *cand ); +extern int samemembern( int *mem, int *cand, int candn ); +extern int includemember( int *mem, int *cand ); +extern int overlapmember( int *mem1, int *mem2 ); +//extern void profilealignment( int n0, int n1, int n2, char **aln0, char **aln1, char **aln2, int alloclen, char alg ); +extern void profilealignment2( int n0, int n2, char **aln0, char **aln2, int alloclen, char alg ); +extern void sreverse( char *r, char *s ); +extern int addonetip( int njobc, int ***topolc, double **lenc, double **iscorec, int ***topol, double **len, Treedep *dep, int treeout, Addtree *addtree, int iadd, char **name, int *alnleninnode, int *nogaplen, int noalign ); +extern void intcpy( int *s1, int *s2 ); +extern void intncpy( int *s1, int *s2, int n ); +extern void fltncpy( double *s1, double *s2, int n ); +extern void intcat( int *s1, int *s2 ); +extern void readsubalignmentstable( int n, int **table, int *preservegaps, int *nsubpt, int *maxmempt ); +extern int myatoi( char * ); +extern unsigned long long myatoll( char * ); +extern double myatof( char * ); +extern void gapcount( double *freq, char **seq, int nseq, double *eff, int lgth ); +extern void gapcountf( double *freq, char **seq, int nseq, double *eff, int lgth ); +extern void gapcountadd( double *freq, char **seq, int nseq, double *eff, int lgth ); +extern void outgapcount( double *freq, int nseq, char *gappat, double *eff ); +extern void makedynamicmtx( double **out, double **in, double offset ); +extern double dist2offset( double dist ); +extern void reporterr( const char *str, ... ); +extern void freeconstants(); +extern void closeFiles(); +extern void FreeCommonIP(); +extern void initglobalvariables(); +extern void makeskiptable( int n, int **skip, char **seq ); +extern int generatesubalignmentstable( int nseq, int ***tablept, int *nsubpt, int *maxmempt, int ***topol, double **len, double threshold ); +extern double sumofpairsscore( int nseq, char **seq ); +//extern int maskoriginalgaps( char *repseq, char *originallygapped ); + +//extern void restoregaponlysites( char *originallygapped, int n1, int n2, char **s1, char **s2, int rep ); +extern int isallgap( char * ); +extern int deletenewinsertions_whole( int on, int an, char **oseq, char **aseq, int **deletelist ); +extern int deletenewinsertions_whole_eq( int on, int an, char **oseq, char **aseq, int **deletelist ); +extern int recordoriginalgaps( char *originallygapped, int n, char **s ); +extern void restoreoriginalgaps( int n, char **seq, char *originalgaps ); +extern void reconstructdeletemap( int nadd, char ** addbk, int **deletelist, char **realn, FILE *fp, char **name ); +extern double D__align( double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ); +extern double D__align_ls( double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ); +extern double D__align_variousdist( int **whichmtx, double ***matrices, double **n_dynamicmtx, char **seq1, char **seq2, double *eff1, double *eff2, double **eff1s, double **eff2s, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, char *sgap1, char *sgap2, char *egap1, char *egap2, int *chudanpt, int chudanref, int *chudanres, int headgp, int tailgp ); +extern double D__align_gapmap( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen, int constraint, double *impmatch, int *gapmap1, int *gapmap2 ); +extern void stringshuffle( int *ary, int size ); +extern void topolorder( int *order, int *posinorder, int ***topol, Treedep *dep, int pos, int child ); +extern int *topolorderz( int *order, int ***topol, Treedep *dep, int pos, int nchild ); +extern int *topolordery( int *order, int ***topol, Treedep *dep, int pos, int nchild ); +extern int commonsextet_p( int *table, int *pointt ); +extern void compacttree_memsaveselectable( int nseq, double **partmtx, int *nearest, double *mindist, int **pointt, int *selfscore, char **seq, int **skiptable, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int howcompact, int memsave ); +extern void compacttreedpdist( int njob, char **seq, char **dseq, double *selfscore, int ***topol, double **len, char **name, Treedep *dep, int treeout, int alloclen, int *uselh, int *nfilesfornode, int treegiven ); +extern void compacttreegivendist( int njob, double *mindists, int *neighbors, int ***topol, double **len, char **name, Treedep *dep, int treeout ); +extern double distcompact( int len1, int len2, int *table1, int *point2, int ss1, int ss2 ); +extern double distcompact_msa( char *seq1, char *seq2, int *skiptable1, int *skiptable2, int ss1, int ss2 ); +extern void fillimp( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2 ); +extern void fillimp_file( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2, int *uselh, int *seedinlh1, int *seedinlh2, int nodeid, int nfiles ); +extern int pairlocalalign( int ngui, int lgui, char **namegui, char **seqgui, double **distancemtx, LocalHom **localhomtable, int argc, char **argv, double **expdist ); +extern char creverse( char f ); +#ifndef mingw +extern void setstacksize( rlim_t ); +extern void use_getrusage(void); +#endif +extern void treeout_bin( FILE *treefp, int n, int ***topol, double **len, Treedep *dep, int *nfilesfornode ); +extern void treein_bin( FILE *treefp, int n, int ***topol, double **len, Treedep *dep, int *nfilesfornode ); +extern void uselhout( FILE *, int n, int * ); +extern int uselhin( FILE *, int n, int * ); +extern void pairalign_node( int njob, int nlenmax, char **name, char **seq, int ***topol, double **len, Treedep *dep, int treegiven, int treeout ); +extern void sortbylength( int *uselh, Lennum *in, int size, unsigned long long numpairs ); +extern void limitlh( int *uselh, Lennum *in, int size, int limit ); + +extern double distdp_noalign( char *s1, char *s2, double selfscore1, double selfscore2, int alloclen ); // tbfast.c kara yobareru +extern void getweightfromname( int n, double *w, char **name ); +extern void readexternalanchors( ExtAnch **extanch, int nseq, int *nogaplen ); diff --git a/mafft/src/mafft-7.487-with-extensions/core/genalign11.c b/mafft/src/mafft-7.487-with-extensions/core/genalign11.c new file mode 100644 index 0000000000..f3c584f5dc --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/genalign11.c @@ -0,0 +1,609 @@ +#include "mltaln.h" +#include "dp.h" + +#define DEBUG 0 +#define DEBUG2 0 +#define XXXXXXX 0 +#define USE_PENALTY_EX 1 + +static TLS int localstop; + +#if 1 +static void match_calc_mtx( double **mtx, double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + char *seq2 = s2[0]; + double *doubleptr = mtx[(unsigned char)s1[0][i1]]; + + while( lgth2-- ) + *match++ = doubleptr[(unsigned char)*seq2++]; +} +#else +static void match_calc( double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + int j; + + for( j=0; j 0 && orlgth2 > 0 ) + { + orlgth1 = 0; + orlgth2 = 0; + free( mseq1 ); + free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + free( largeM ); + free( Mp ); + + FreeCharMtx( mseq ); + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + + } + return( 0.0 ); + } + + + +// fprintf( stderr, "@@@@@@@@@@@@@ penalty_OP = %f, penalty_EX = %f, pelanty = %f\n", fpenalty_OP, fpenalty_EX, fpenalty ); + + if( orlgth1 == 0 ) + { + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + } + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + if( lgth1 > orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + FreeFloatVec( largeM ); + FreeIntVec( Mp ); + + FreeCharMtx( mseq ); + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + if( amino_dynamicmtx ) FreeDoubleMtx( amino_dynamicmtx ); amino_dynamicmtx = NULL; + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + largeM = AllocateFloatVec( ll2+2 ); + Mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + + amino_dynamicmtx = AllocateDoubleMtx( 0x100, 0x100 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + FreeIntMtx( commonJP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + commonJP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijpi = commonIP; + ijpj = commonJP; + + +#if 0 + for( i=0; i", wm ); +#endif + g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijpipt = i - 1; + *ijpjpt = mpi; + } + g = *prept; + if( g > mi ) + { + mi = g; + mpi = j-1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f->", wm ); +#endif + g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "m%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijpipt = *mpjpt; + *ijpjpt = j - 1; //IRU! + } + g = *prept; + if( g > *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + *mjpt += fpenalty_ex; +#endif + + + g = tbk + fpenalty_OP; +// g = tbk; + if( g > wm ) + { + wm = g; + *ijpipt = tbki; + *ijpjpt = tbkj; +// fprintf( stderr, "hit! i%d, j%d, ijpi = %d, ijpj = %d\n", i, j, *ijpipt, *ijpjpt ); + } +// g = Mi; + if( Mi > tbk ) + { + tbk = Mi; //error desu. + tbki = i-1; + tbkj = Mpi; + } +// g = *Mjpt; + if( *Mjpt > tbk ) + { + tbk = *Mjpt; + tbki = *Mpjpt; + tbkj = j-1; + } +// tbk += fpenalty_EX;// + foffset; + +// g = *prept; + if( *prept > *Mjpt ) + { + *Mjpt = *prept; + *Mpjpt = i-1; + } +// *Mjpt += fpenalty_EX;// + foffset; + +// g = *prept; + if( *prept > Mi ) + { + Mi = *prept; + Mpi = j-1; + } +// Mi += fpenalty_EX;// + foffset; + + +// fprintf( stderr, "wm=%f, tbk=%f(%c-%c), mi=%f, *mjpt=%f\n", wm, tbk, seq1[0][tbki], seq2[0][tbkj], mi, *mjpt ); +// fprintf( stderr, "ijp = %c,%c\n", seq1[0][abs(*ijpipt)], seq2[0][abs(*ijpjpt)] ); + + + if( maxwm < wm ) + { + maxwm = wm; + endali = i; + endalj = j; + } +#if 1 + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + *ijpipt = localstop; +// *ijpjpt = localstop; + wm = localthr2; + } +#endif +#if 0 + fprintf( stderr, "%5.0f ", *curpt ); +#endif +#if DEBUG2 + fprintf( stderr, "%5.0f ", wm ); +// fprintf( stderr, "%c-%c *ijppt = %d, localstop = %d\n", seq1[0][i], seq2[0][j], *ijppt, localstop ); +#endif + + *curpt += wm; + ijpipt++; + ijpjpt++; + mjpt++; + Mjpt++; + prept++; + mpjpt++; + Mpjpt++; + curpt++; + } +#if DEBUG2 + fprintf( stderr, "\n" ); +#endif + + lastverticalw[i] = currentw[lgth2-1]; + } + + +#if DEBUG2 + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, "endali = %d\n", endali ); + fprintf( stderr, "endalj = %d\n", endalj ); +#endif + + if( ijpi[endali][endalj] == localstop ) // && ijpj[endali][endalj] == localstop ) + { + strcpy( seq1[0], "" ); + strcpy( seq2[0], "" ); + *off1pt = *off2pt = 0; + return( 0.0 ); + } + + + gentracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, cpmx1, cpmx2, ijpi, ijpj, off1pt, off2pt, endali, endalj ); + +// fprintf( stderr, "### impmatch = %f\n", *impmatch ); + + resultlen = strlen( mseq1[0] ); + if( alloclen < resultlen || resultlen > N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + strcpy( seq1[0], mseq1[0] ); + strcpy( seq2[0], mseq2[0] ); + +#if 0 + fprintf( stderr, "\n" ); + fprintf( stderr, ">\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); +#endif + + + return( maxwm ); +} + + diff --git a/mafft/src/mafft-7.487-with-extensions/core/getlag.c b/mafft/src/mafft-7.487-with-extensions/core/getlag.c new file mode 100644 index 0000000000..3ef15d6f6e --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/getlag.c @@ -0,0 +1,461 @@ +#include "mltaln.h" + +#define DEBUG 0 +#define IODEBUG 0 + +void arguments( int argc, char *argv[] ) +{ + int c; + + calledByXced = 0; + devide = 0; + use_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'C'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'x'; + contin = 0; + ppenalty = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + scoremtx = NOTSPECIFIED; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'D': + scoremtx = -1; + break; + case 'P': + scoremtx = 0; + break; + case 'i': + contin = 1; + break; + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; + case 'R': + fftRepeatStop = 1; + break; + case 'Q': + calledByXced = 1; + break; + case 's': + treemethod = 's'; + break; + case 'x': + treemethod = 'x'; + break; + case 'p': + treemethod = 'p'; + break; + case 'a': + alg = 'a'; + break; + case 'A': + alg = 'A'; + break; + case 'S': + alg = 'S'; + break; + case 'C': + alg = 'C'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + disp = 1; + break; + case 'o': + outgap = 0; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'Z': + checkC = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } + readOtherOptions( &ppid, &fftThreshold, &fftWinSize ); +} + + +void treebase( char **name, int nlen[M], char **seq, char **aseq, char **mseq1, char **mseq2, double **mtx, int ***topol, double **len, double **eff, int alloclen ) +{ + int i, j, l; + int clus1, clus2; + int s1, s2, r1, r2; + double pscore; + static char *indication1, *indication2; + static char **name1, **name2; + static double **partialmtx = NULL; + static int ***partialtopol = NULL; + static double **partiallen = NULL; + static double **partialeff = NULL; + static double *effarr = NULL; + static double *effarr1 = NULL; + static double *effarr2 = NULL; +#if 0 + char pair[njob][njob]; +#else + static char **pair; +#endif + if( partialtopol == NULL ) + { + partialmtx = AllocateDoubleMtx( njob, njob ); + partialtopol = AllocateIntCub( njob, 2, njob ); + partialeff = AllocateDoubleMtx( njob, njob ); + partiallen = AllocateDoubleMtx( njob, 2 ); + effarr = AllocateDoubleVec( njob ); + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); + indication1 = AllocateCharVec( njob*3+100 ); + indication2 = AllocateCharVec( njob*3+100 ); + name1 = AllocateCharMtx( njob, B+1 ); + name2 = AllocateCharMtx( njob, B+1 ); +#if 0 +#else + pair = AllocateCharMtx( njob, njob ); +#endif + } + + if( checkC ) + for( i=0; i-1; i++ ) + if( pair[s1][r1] != 1 ) exit( 1 ); + s2 = topol[l][1][0]; + for( i=0; (r2=topol[l][1][i])>-1; i++ ) + if( pair[s2][r2] != 1 ) exit( 1 ); + + clus1 = conjuction( pair, s1, aseq, mseq1, effarr1, effarr, name, name1, indication1 ); + clus2 = conjuction( pair, s2, aseq, mseq2, effarr2, effarr, name, name2, indication2 ); + fprintf( trap_g, "\nSTEP-%d\n", l ); + fprintf( trap_g, "group1 = %s\n", indication1 ); + fprintf( trap_g, "group2 = %s\n", indication2 ); + + fprintf( stderr, "STEP %d /%d\n", l+1, njob-1 ); + fprintf( stderr, "group1 = %.66s", indication1 ); + if( strlen( indication1 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); + + if( checkC ) + for( i=0; i-1; i++ ) + { + pair[s1][r2] = 1; + pair[s2][r2] = 0; + } + + writePre( njob, name, nlen, aseq, 0 ); + + if( disp ) display( aseq, njob ); + fprintf( stderr, "\n" ); + + } +} + +static void WriteOptions( FILE *fp ) +{ + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "Dayhoff( machigai ga aru )\n" ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + else if( scoremtx == -1 ) fprintf( fp, "DNA\n" ); + + if( scoremtx == 0 || scoremtx == -1 ) + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + else + fprintf( fp, "Gap Penalty = %+5.2f\n", (double)ppenalty/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Apgorithm A+\n" ); + else if( alg == 'S' ) + fprintf( fp, "Apgorithm S\n" ); + else if( alg == 'C' ) + fprintf( fp, "Apgorithm A+/C\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( treemethod == 'x' ) + fprintf( fp, "Tree = UPGMA (3).\n" ); + else if( treemethod == 's' ) + fprintf( fp, "Tree = UPGMA (2).\n" ); + else if( treemethod == 'p' ) + fprintf( fp, "Tree = UPGMA (1).\n" ); + else + fprintf( fp, "Unknown tree.\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( scoremtx == -1 ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + + +int main( int argc, char *argv[] ) +{ + static int nlen[M]; + static char **name, **seq; + static char **mseq1, **mseq2; + static char **aseq; + static char **bseq; + static double **pscore; + static double **eff; + static double **node0, **node1; + int i, j; + static int ***topol; + static double **len; + FILE *prep; + char c; + int alloclen; + + arguments( argc, argv ); + getnumlen( stdin ); + rewind( stdin ); + + name = AllocateCharMtx( njob, B+1 ); + seq = AllocateCharMtx( njob, nlenmax*5+1 ); + aseq = AllocateCharMtx( njob, nlenmax*5+1 ); + bseq = AllocateCharMtx( njob, nlenmax*5+1 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + alloclen = nlenmax*5; + + topol = AllocateIntCub( njob, 2, njob ); + len = AllocateDoubleMtx( njob, 2 ); + pscore = AllocateDoubleMtx( njob, njob ); + eff = AllocateDoubleMtx( njob, njob ); + node0 = AllocateDoubleMtx( njob, njob ); + node1 = AllocateDoubleMtx( njob, njob ); + +#if 0 + Read( name, nlen, seq ); +#else + readData_pointer( stdin, name, nlen, seq ); +#endif + + constants( njob, seq ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illeagal character %c\n", c ); + exit( 1 ); + } + + writePre( njob, name, nlen, seq, 0 ); + + if( tbutree == 0 ) + { + for( i=1; i +#include +#include + +static void fgetstilspace( unsigned char *b, FILE *fp ) +{ + unsigned int c; + int alreadyread = 0; + while( 1 ) + { + c = fgetc( fp ); + if( c == ' ' && alreadyread == 0 ) continue; + alreadyread = 1; + if( c == ' ' || c == '\n' || c == '\r' || c == EOF ) + { + ungetc( c, fp ); + break; + } + *b++ = (unsigned char)c; + } + *b = 0; +} + +int main( int ac, char **av ) +{ + unsigned int c; + unsigned char buf[100]; + FILE *fp; + int res; + + if( ac == 1 || ( ac == 2 && av[1][0] == '-' ) ) + { + fp = stdin; + } + else if( ac == 2 ) + { + fp = fopen( av[1], "rb" ); + if( fp == NULL ) + { + fprintf( stderr, "%s: Cannot open %s.\n", av[0], av[1] ); + exit( 1 ); + } + } + else + { + fprintf( stderr, "Usage %s input > output\n", av[0] ); + exit( 1 ); + } + { + while( 1 ) + { + c = fgetc( fp ); + if( c == EOF ) break; + else if( c == '\n' ) printf( "\n" ); + else if( c == '\r' ) printf( "\r" ); +#if 0 + else if( c == '-' ) + { + printf( "-" ); + fprintf( stderr, "Warning: '-' will be removed\n" ); + } + else if( c == '=' ) + { + printf( "=" ); + fprintf( stderr, "Warning: '=' will be removed\n" ); + } +// else if( c == ' ' ) printf( " " ); // nai +#endif + else if( c == '>' || c == '<' ) + { + printf( "%c", c ); + while( 1 ) + { + c = fgetc( fp ); + printf( "%c", c ); + if( c == '\n' ) break; + } + } + else + { + buf[0] = (unsigned char)c; + fgetstilspace( buf+1, fp ); + //fprintf( stderr, "buf=%s\n", buf ); + if( strchr( (const char *)buf, '-' ) ) // added cast, 2019/Jan/25 + { + printf( "-" ); + continue; + } + //res = sscanf( buf, " %x ", &c ); + res = sscanf( (const char *)buf, " %x ", &c ); // added cast, 2019/Jan/25 + if( res == EOF ) + { + //fprintf( stderr, "%s was ignored.\n", buf ); + } + else if( res != 1 ) + { + fprintf( stderr, "Error in reading %s\n", buf ); + exit( 1 ); + } + else if( c <= 0 || c > 0xff ) + { + fprintf( stderr, "Out of range: 0x%x\n", c ); + //exit( 1 ); + } + else if( c == 0x0d || c == 0x0a ) + { + fprintf( stderr, "Warning: skipped 0x%x (CR or LF) that cannot be used in mafft --text.\n", c ); + //printf( "%c", c ); + } + else if( c == 0x20 || c == 0x3E || c == 0x3C || c == 0x3D ) + { + fprintf( stderr, "Warning: skipped 0x%x (%c) that cannot be used in mafft --text.\n", c, c ); + //printf( "%c", c ); + } + else if( c == 0x2D ) + { + fprintf( stderr, "Warning: put 0x%x (%c) that is interpreted as gap in mafft --text.\n", c, c ); + printf( "%c", c ); + } + else + printf( "%c", c ); + } + } + } + fclose( fp ); + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/interface.c b/mafft/src/mafft-7.487-with-extensions/core/interface.c new file mode 100644 index 0000000000..4e8aafb534 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/interface.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include "mafft.h" + +int report( int status, int progress, char *message ) +{ + fprintf( stderr, "status = %d\n", status ); + fprintf( stderr, "progress = %d / 100\n", progress ); + fprintf( stderr, "message = %s\n", message ); + return( 0 ); +} + +int chudan( int status, int progress, char *message ) +{ + fprintf( stderr, "status = %d\n", status ); + fprintf( stderr, "progress = %d / 100\n", progress ); + fprintf( stderr, "message = %s\n", message ); + return( 2 ); +} +int main( void ) +{ + int i; + int argc; + char **argv; + char **seq; + char **name; + char *message; + int res; + int n, l, mlen; + +// printf( "This is interface.\n" ); + + + l = 10000; + n = 130; + seq = (char **)calloc( n, sizeof( char * ) ); + name = (char **)calloc( n, sizeof( char * ) ); + for( i=0; i -D; Protein -> -P + strcpy( argv[18], "-I" ); // --add + strcpy( argv[19], "2" ); // --add + +#if 0 + mlen = 5000; + message = (char *)calloc( mlen+1, sizeof( char ) ); + + fprintf( stderr, "first run\n" ); + res = disttbfast( n, l, mlen, name, seq, &message, argc, argv, report ); + fprintf( stderr, "second run\n" ); + res = disttbfast( n, l, mlen, name, seq, &message, argc, argv, report ); + fprintf( stderr, "third run\n" ); + res = disttbfast( n, l, mlen, name, seq, &message, argc, argv, report ); + + fprintf( stderr, "\n\n\nmessage in interface = :%s:\n", message ); + free( message ); +#else + fprintf( stderr, "first run\n" ); + res = disttbfast( n, l, name, seq, argc, argv, report ); + fprintf( stderr, "second run\n" ); + res = disttbfast( n, l, name, seq, argc, argv, chudan ); +// fprintf( stderr, "third run\n" ); +// res = disttbfast( n, l, name, seq, argc, argv, report ); +#endif + + if( res == GUI_LENGTHOVER ) + { + fprintf( stderr, "length over!" ); + } + else + { + fprintf( stderr, "res = %d\n", res ); + fprintf( stdout, "Output:\n" ); + for( i=0; i numt ) + { +// reporterr( "RNA!\n" ); +// reporterr( "r before ttou =%s\n", r ); + ttou( r+1 ); +// reporterr( "r after ttou =%s\n", r ); + } +} + +void gappick_samestring( char *seq ) +{ + char *aseq = seq; + + for( ; *seq != 0; seq++ ) + { + if( *seq != '-' ) + *aseq++ = *seq; + } + *aseq = 0; +} + +#if 0 + +static int addlocalhom2( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, int skip ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + int iscore; + int isumscore; + int sumoverlap; + LocalHom *tmppt; + int st; + int nlocalhom = 0; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + isumscore = 0; + sumoverlap = 0; + +#if 0 + fprintf( stderr, "nlocalhom = %d in addlocalhom\n", nlocalhom ); + fprintf( stderr, "al1 = %s, al2 = %s\n", al1, al2 ); + fprintf( stderr, "off1 = %d, off2 = %d\n", off1, off2 ); + fprintf( stderr, "localhopt = %p, skip = %d\n", localhompt, skip ); + fprintf( stderr, "pt1 = \n%s\n, pt2 = \n%s\n", pt1, pt2 ); +#endif + + if( skip ) + { + while( --skip > 0 ) localhompt = localhompt->next; + localhompt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + localhompt = localhompt->next; +// fprintf( stderr, "tmppt = %p, localhompt = %p\n", tmppt, localhompt ); + } + tmppt = localhompt; + + st = 0; + iscore = 0; + while( *pt1 != 0 ) + { +// fprintf( stderr, "In in while loop\n" ); +// fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + +#if 1 + isumscore += iscore; + sumoverlap += end2-start2+1; +#else + tmppt->overlapaa = end2-start2+1; + tmppt->opt = iscore * 5.8 / 600; + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "iscore (1)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + iscore = 0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + iscore += n_dis[(int)amino_n[(int)*pt1]][(int)amino_n[(int)*pt2]]; +// fprintf( stderr, "%c-%c, score(0) = %d\n", *pt1, *pt2, iscore ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + + if( st ) + { + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + +#if 1 + isumscore += iscore; + sumoverlap += end2-start2+1; +#else + tmppt->overlapaa = end2-start2+1; + tmppt->opt = (double)iscore * 5.8 / 600; + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif +#if 0 + fprintf( stderr, "score (2)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + } + + for( tmppt=localhompt; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; + tmppt->opt = (double)sumscore * 5.8 / 600 / sumoverlap; + } + return( nlocalhom ); +} + +#endif + + + +static int addlocalhom_r( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, int skip, char korh ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + double score; + double sumscore; + int sumoverlap; + LocalHom *tmppt = NULL; // by D.Mathog, a guess + int st; + int nlocalhom = 0; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + sumscore = 0.0; + sumoverlap = 0; + start1 = 0; // by D.Mathog, a guess + start2 = 0; // by D.Mathog, a guess + +#if 0 + fprintf( stderr, "nlocalhom = %d in addlocalhom\n", nlocalhom ); + fprintf( stderr, "al1 = %s, al2 = %s\n", al1, al2 ); + fprintf( stderr, "off1 = %d, off2 = %d\n", off1, off2 ); + fprintf( stderr, "localhopt = %p, skip = %d\n", localhompt, skip ); +#endif + fprintf( stderr, "pt1 = \n%s\n, pt2 = \n%s\n", pt1, pt2 ); + + if( skip ) + { + while( --skip > 0 ) localhompt = localhompt->next; + localhompt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + localhompt = localhompt->next; + fprintf( stderr, "tmppt = %p, localhompt = %p\n", (void *)tmppt, (void *)localhompt ); + } + tmppt = localhompt; + + st = 0; + score = 0.0; + while( *pt1 != 0 ) + { + fprintf( stderr, "In in while loop\n" ); + fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + sumscore += score; + sumoverlap += end2-start2+1; +#else + tmppt->overlapaa = end2-start2+1; + tmppt->opt = score * 5.8 / 600; + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + + fprintf( stderr, "score (1)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); + score = 0.0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + score += (double)n_dis[(int)amino_n[(unsigned char)*pt1]][(int)amino_n[(unsigned char)*pt2]]; +// fprintf( stderr, "%c-%c, score(0) = %f\n", *pt1, *pt2, score ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + sumscore += score; + sumoverlap += end2-start2+1; +#else + tmppt->overlapaa = end2-start2+1; + tmppt->opt = score * 5.8 / 600; + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + + fprintf( stderr, "score (2)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); + + for( tmppt=localhompt; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; + tmppt->opt = sumscore * 5.8 / 600 / sumoverlap; + } + return( nlocalhom ); +} +void putlocalhom3( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + double score; + double sumscore; + int sumoverlap; + LocalHom *tmppt; + LocalHom *subnosento; + int st; + int saisho; + + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + sumscore = 0.0; + sumoverlap = 0; + start1 = 0; // by Mathog, a guess + start2 = 0; // by Mathog, a guess + + subnosento = localhompt; + while( subnosento->next ) subnosento = subnosento->next; + tmppt = subnosento; + + saisho = ( localhompt->nokori == 0 ); + + fprintf( stderr, "localhompt = %p\n", (void *)localhompt ); + fprintf( stderr, "tmppt = %p\n", (void *)tmppt ); + fprintf( stderr, "subnosento = %p\n", (void *)subnosento ); + + st = 0; + score = 0.0; + while( *pt1 != 0 ) + { +// fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( localhompt->nokori++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if( tmppt->overlapaa>0) + tmppt->opt = score / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + sumscore += score; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "score (1)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + score = 0.0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + score += (double)n_dis[(int)amino_n[(unsigned char)*pt1]][(int)amino_n[(unsigned char)*pt2]]; // - offset ¤Ï¤¤¤é¤Ê¤¤¤«¤â +// fprintf( stderr, "%c-%c, score(0) = %f\n", *pt1, *pt2, score ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + if( *(pt1-1) != '-' && *(pt2-1) != '-' ) + { + if( localhompt->nokori++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if( tmppt->overlapaa>0) + tmppt->opt = score / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + sumscore += score; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "score (2)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + } + + fprintf( stderr, "sumscore = %f\n", sumscore ); + if( !divpairscore ) + { + + if( !saisho ) subnosento = subnosento->next; + for( tmppt=subnosento; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; + if( tmppt->overlapaa>0) + tmppt->opt = sumscore * 5.8 / 600 / sumoverlap; + else + tmppt->opt = -1.0; + fprintf( stderr, "tmpptr->opt = %f\n", tmppt->opt ); + } + } +} +void putlocalhom_ext( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + int iscore; + int isumscore; + int sumoverlap; + LocalHom *tmppt = localhompt; + int nlocalhom = 0; + int st; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + + isumscore = 0; + sumoverlap = 0; + start1 = 0; // by D.Mathog, a guess + start2 = 0; // by D.Mathog, a guess + + st = 0; + iscore = 0; + while( *pt1 != 0 ) + { +// fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if( tmppt->overlapaa>0) + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + isumscore += iscore; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "iscore (1)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + iscore = 0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + iscore += n_dis[(int)amino_n[(unsigned char)*pt1]][(int)amino_n[(unsigned char)*pt2]]; // - offset ¤Ï¤¤¤é¤Ê¤¤¤«¤â +// fprintf( stderr, "%c-%c, iscore(0) = %d\n", *pt1, *pt2, iscore ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + if( *(pt1-1) != '-' && *(pt2-1) != '-' ) + { + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if( tmppt->overlapaa>0) + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + isumscore += iscore; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "iscore (2)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + } + + if( !divpairscore ) + { + for( tmppt=localhompt; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; +// tmppt->opt = (double)isumscore * 5.8 / ( 600 * sumoverlap ); + tmppt->opt = (double)600 * 5.8 / 600; +// fprintf( stderr, "tmpptr->opt = %f\n", tmppt->opt ); + } + } +} + +void putlocalhom_str( char *al1, char *al2, double *equiv, double scale, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ) +{ + int posinaln, pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + int isumscore; + int sumoverlap; + LocalHom *tmppt = localhompt; + int nlocalhom = 0; +// int st; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + isumscore = 0; + sumoverlap = 0; + start1 = 0; // by D.Mathog, a guess + start2 = 0; // by D.Mathog, a guess + + posinaln = 0; + while( *pt1 != 0 ) + { + if( *pt1 != '-' && *pt2 != '-' && equiv[posinaln] > 0.0 ) + { + start1 = end1 = pos1; start2 = end2 = pos2; + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ... (posinaln=%d)\n", posinaln ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + + tmppt->overlapaa = 1; +// tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + tmppt->opt = equiv[posinaln] * scale; +// fprintf( stdout, "*pt1=%c, *pt2=%c, equiv=%f\n", *pt1, *pt2, equiv[posinaln] ); + + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + posinaln++; + } +} + + + +void putlocalhom2( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + int iscore; + int isumscore; + int sumoverlap; + LocalHom *tmppt = localhompt; + int nlocalhom = 0; + int st; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + + + isumscore = 0; + sumoverlap = 0; + start1 = 0; // by D.Mathog, a guess + start2 = 0; // by D.Mathog, a guess + + st = 0; + iscore = 0; + while( *pt1 != 0 ) + { +// fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + tmppt->nokori += 1; + localhompt->last = tmppt; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if(tmppt->overlapaa>0) + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + isumscore += iscore; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "iscore (1)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + iscore = 0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + iscore += n_dis[(int)amino_n[(unsigned char)*pt1]][(int)amino_n[(unsigned char)*pt2]]; // - offset ¤Ï¤¤¤é¤Ê¤¤¤«¤â +// fprintf( stderr, "%c-%c, iscore(0) = %d\n", *pt1, *pt2, iscore ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + if( *(pt1-1) != '-' && *(pt2-1) != '-' ) + { + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + tmppt->nokori += 1; + localhompt->last = tmppt; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + if(tmppt->overlapaa>0) + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + else + tmppt->opt = -1.0; + } + else + { + isumscore += iscore; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "iscore (2)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + } + + if( !divpairscore ) + { + for( tmppt=localhompt; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; + if(tmppt->overlapaa>0) + tmppt->opt = (double)isumscore * 5.8 / ( 600 * sumoverlap ); + else + tmppt->opt = -1.0; +// fprintf( stderr, "tmpptr->opt = %f, sumoverlap=%d\n", tmppt->opt, sumoverlap ); + } + } +} + +#if 0 +void putlocalhom( char *al1, char *al2, LocalHom *localhompt, int off1, int off2, int opt, int overlapaa, char korh ) +{ + int pos1, pos2, start1, start2, end1, end2; + char *pt1, *pt2; + double score; + double sumscore; + int sumoverlap; + LocalHom *tmppt = localhompt; + int nlocalhom = 0; + int st; + pt1 = al1; pt2 = al2; + pos1 = off1; pos2 = off2; + + + sumscore = 0.0; + sumoverlap = 0; + start1 = 0; // by D.Mathog, a guess + start2 = 0; // by D.Mathog, a guess + + st = 0; + score = 0.0; + while( *pt1 != 0 ) + { +// fprintf( stderr, "pt = %c, %c, st=%d\n", *pt1, *pt2, st ); + if( st == 1 && ( *pt1 == '-' || *pt2 == '-' ) ) + { + end1 = pos1 - 1; + end2 = pos2 - 1; + + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + tmppt->opt = score / tmppt->overlapaa * 5.8 / 600; + } + else + { + sumscore += score; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "score (1)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + score = 0.0; + st = 0; + } + else if( *pt1 != '-' && *pt2 != '-' ) + { + if( st == 0 ) + { + start1 = pos1; start2 = pos2; + st = 1; + } + score += (double)n_dis[(int)amino_n[(unsigned char)*pt1]][(int)amino_n[(unsigned char)*pt2]]; // - offset ¤Ï¤¤¤é¤Ê¤¤¤«¤â +// fprintf( stderr, "%c-%c, score(0) = %f\n", *pt1, *pt2, score ); + } + if( *pt1++ != '-' ) pos1++; + if( *pt2++ != '-' ) pos2++; + } + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + end1 = pos1 - 1; + end2 = pos2 - 1; + tmppt->start1 = start1; + tmppt->start2 = start2; + tmppt->end1 = end1 ; + tmppt->end2 = end2 ; + tmppt->korh = korh ; + +#if 1 + if( divpairscore ) + { + tmppt->overlapaa = end2-start2+1; + tmppt->opt = score / tmppt->overlapaa * 5.8 / 600; + } + else + { + sumscore += score; + sumoverlap += end2-start2+1; + } +#else + tmppt->overlapaa = overlapaa; + tmppt->opt = (double)opt; +#endif + +#if 0 + fprintf( stderr, "score (2)= %f\n", score ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + + if( !divpairscore ) + { + for( tmppt=localhompt; tmppt; tmppt=tmppt->next ) + { + tmppt->overlapaa = sumoverlap; + tmppt->opt = sumscore * 5.8 / 600 / sumoverlap; +// fprintf( stderr, "tmpptr->opt = %f\n", tmppt->opt ); + } + } +} +#endif + +char *cutal( char *al, int al_display_start, int start, int end ) +{ + int pos; + char *pt = al; + char *val = NULL; + + pos = al_display_start; + do + { + if( start == pos ) val = pt; + if( end == pos ) break; +// fprintf( stderr, "pos=%d, *pt=%c, val=%p\n", pos, *pt, val ); + if( *pt != '-' ) pos++; + } while( *pt++ != 0 ); + *(pt+1) = 0; + return( val ); +} + +void ErrorExit( char *message ) +{ + fprintf( stderr, "%s\n", message ); + exit( 1 ); +} + +void strncpy_caseC( char *str1, char *str2, int len ) +{ + if( dorp == 'd' && upperCase > 0 ) + { + while( len-- ) + *str1++ = toupper( *str2++ ); + } + else strncpy( str1, str2, len ); +} + +void seqUpper( int nseq, char **seq ) +{ + int i, j, len; + for( i=0; i return 1 */ +{ + int c, i = 0 ; + int noteofflag = 0; + for( i=0; i return 1 */ +char s[] ; int l ; FILE *fp ; +{ + int c = 0, i = 0 ; + int noteofflag = 0; + + if( feof( fp ) ) return( 1 ); + + for( i=0; i M ) + { + fprintf( stderr, "TOO MANY SEQUENCE!\n" ); + fprintf( stderr, "%d > %d\n", njob, M ); + exit( 1 ); + } +} + +int allSpace( char *str ) +{ + int value = 1; + while( *str ) value *= ( !isdigit( *str++ ) ); + return( value ); +} + +void Read( char name[M][B], int nlen[M], char **seq ) +{ + extern void FRead( FILE *x, char y[M][B], int z[M], char **w ); + FRead( stdin, name, nlen, seq ); +} + + +void FRead( FILE *fp, char name[][B], int nlen[], char **seq ) +{ + int i, j; + char b[B]; + + fgets( b, B-1, fp ); +#if DEBUG + fprintf( stderr, "b = %s\n", b ); +#endif + + if( strstr( b, "onnet" ) ) scoremtx = 1; + else if( strstr( b, "DnA" ) ) + { + scoremtx = -1; + upperCase = -1; + } + else if( strstr( b, "dna" ) ) + { + scoremtx = -1; + upperCase = 0; + } + else if( strstr( b, "DNA" ) ) + { + scoremtx = -1; + upperCase = 1; + } + else if( strstr( b, "M-Y" ) || strstr( b, "iyata" ) ) scoremtx = 2; + else scoremtx = 0; +#if DEBUG + fprintf( stderr, " %s->scoremtx = %d\n", b, scoremtx ); +#endif + + geta2 = GETA2; + +#if 0 + if( strlen( b ) >=25 ) + { + b[25] = 0; + #if DEBUG + fprintf( stderr, "kimuraR = %s\n", b+20 ); + #endif + kimuraR = atoi( b+20 ); + + if( kimuraR < 0 || 20 < kimuraR ) ErrorExit( "Illeagal kimuraR value.\n" ); + if( allSpace( b+20 ) ) kimuraR = NOTSPECIFIED; + } + else kimuraR = NOTSPECIFIED; + #if DEBUG + fprintf( stderr, "kimuraR = %d\n", kimuraR ); + #endif + + if( strlen( b ) >=20 ) + { + b[20] = 0; + #if DEBUG + fprintf( stderr, "pamN = %s\n", b+15 ); + #endif + pamN = atoi( b+15 ); + if( pamN < 0 || 400 < pamN ) ErrorExit( "Illeagal pam value.\n" ); + if( allSpace( b+15 ) ) pamN = NOTSPECIFIED; + } + else pamN = NOTSPECIFIED; + + if( strlen( b ) >= 15 ) + { + b[15] = 0; + #if DEBUG + fprintf( stderr, "poffset = %s\n", b+10 ); + #endif + poffset = atoi( b+10 ); + if( poffset > 500 ) ErrorExit( "Illegal extending gap ppenalty\n" ); + if( allSpace( b+10 ) ) poffset = NOTSPECIFIED; + } + else poffset = NOTSPECIFIED; + + if( strlen( b ) >= 10 ) + { + b[10] = 0; + #if DEBUG + fprintf( stderr, "ppenalty = %s\n", b+5 ); + #endif + ppenalty = atoi( b+5 ); + if( ppenalty > 0 ) ErrorExit( "Illegal opening gap ppenalty\n" ); + if( allSpace( b+5 ) ) ppenalty = NOTSPECIFIED; + } + else ppenalty = NOTSPECIFIED; +#endif + + for( i=0; i' ) ) + value++; + b = c; + } + rewind( fp ); + return( value ); +} + +void searchKUorWA( FILE *fp ) +{ + int c, b; + b = '\n'; + while( !( ( ( c = getc( fp ) ) == '>' || c == EOF ) && b == '\n' ) ) + b = c; + ungetc( c, fp ); +} + +#if 0 +static int onlyGraph( char *str ) +{ + char tmp; + char *res = str; + char *bk = str; + +// while( (tmp=*str++) ) if( isgraph( tmp ) ) *res++ = tmp; + while( (tmp=*str++) ) + { + if( 0x20 < tmp && tmp < 0x7f ) *res++ = tmp; + if( tmp == '>' || tmp == '(' ) + { + fprintf( stderr, "========================================================\n" ); + fprintf( stderr, "========================================================\n" ); + fprintf( stderr, "=== \n" ); + fprintf( stderr, "=== ERROR!! \n" ); +// fprintf( stderr, "=== In the '--anysymbol' and '--preservecase' modes, \n" ); + fprintf( stderr, "=== '>' and '(' are acceptable only in title lines.\n" ); + fprintf( stderr, "=== \n" ); + fprintf( stderr, "========================================================\n" ); + fprintf( stderr, "========================================================\n" ); + exit( 1 ); + } + } + *res = 0; + return( res - bk ); +} +#endif + +static int charfilter( unsigned char *str ) +{ + unsigned char tmp; + unsigned char *res = str; + unsigned char *bk = str; + + while( (tmp=*str++) ) + { +// if( tmp == '=' || tmp == '*' || tmp == '<' || tmp == '>' || tmp == '(' || tmp == ')' ) + if( tmp == '=' || tmp == '<' || tmp == '>' ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "Characters '= < >' can be used only in the title lines in the --anysymbol or --text mode.\n" ); + fprintf( stderr, "\n" ); + exit( 1 ); + } +// if( 0x20 < tmp && tmp < 0x7f ) +// if( 0x0 <=tmp && tmp < 0x100 && + if( tmp != 0x0a && tmp != 0x20 && tmp != 0x0d ) +// if( tmp != '\n' && tmp != ' ' && tmp != '\t' ) // unprintable characters mo ok. + { + *res++ = tmp; +// reporterr( "tmp=%d (%c)\n", tmp, tmp ); + } + } + *res = 0; + return( res - bk ); +} + + +static int onlyAlpha_lower( char *str ) +{ + char tmp; + char *res = str; + char *bk = str; + + while( (tmp=*str++) ) + if( isalpha( tmp ) || tmp == '-' || tmp == '*' || tmp == '.' ) + *res++ = tolower( tmp ); + *res = 0; + return( res - bk ); +} +static int onlyAlpha_upper( char *str ) +{ + char tmp; + char *res = str; + char *bk = str; + + while( (tmp=*str++) ) + if( isalpha( tmp ) || tmp == '-' || tmp == '*' || tmp == '.' ) + *res++ = toupper( tmp ); + *res = 0; + return( res - bk ); +} + +void kake2hiku( char *str ) +{ + do + if( *str == '*' ) *str = '-'; + while( *str++ ); +} + +char *load1SeqWithoutName_realloc_casepreserve( FILE *fpp ) +{ + int c, b; + char *cbuf; + int size = N; + char *val; + + val = malloc( (size+1) * sizeof( char ) ); + cbuf = val; + + b = '\n'; + while( ( c = getc( fpp ) ) != EOF && + !( ( c == '>' || c == EOF ) && b == '\n' ) ) + { + *cbuf++ = (char)c; /* Ť¹¤®¤Æ¤â¤·¤é¤Ê¤¤ */ + if( cbuf - val == size ) + { + size += N; + fprintf( stderr, "reallocating...\n" ); + val = (char *)realloc( val, (size+1) * sizeof( char ) ); + if( !val ) + { + fprintf( stderr, "Allocation error in load1SeqWithoutName_realloc \n" ); + exit( 1 ); + } + fprintf( stderr, "done.\n" ); + cbuf = val + size-N; + } + b = c; + } + ungetc( c, fpp ); + *cbuf = 0; +// onlyGraph( val ); + charfilter( (unsigned char *) val ); +// kake2hiku( val ); + return( val ); +} + +char *load1SeqWithoutName_realloc( FILE *fpp ) +{ + int c, b; + char *cbuf; + int size = N; + char *val; + + val = malloc( (size+1) * sizeof( char ) ); + cbuf = val; + + b = '\n'; + while( ( c = getc( fpp ) ) != EOF && + !( ( c == '>' || c == EOF ) && b == '\n' ) ) + { + *cbuf++ = (char)c; /* Ť¹¤®¤Æ¤â¤·¤é¤Ê¤¤ */ + if( cbuf - val == size ) + { + size += N; + fprintf( stderr, "reallocating...\n" ); + val = (char *)realloc( val, (size+1) * sizeof( char ) ); + if( !val ) + { + fprintf( stderr, "Allocation error in load1SeqWithoutName_realloc \n" ); + exit( 1 ); + } + fprintf( stderr, "done.\n" ); + cbuf = val + size-N; + } + b = c; + } + ungetc( c, fpp ); + *cbuf = 0; + + if( nblosum == -2 ) + { + charfilter( (unsigned char *) val ); + } + else + { + if( dorp == 'd' ) + onlyAlpha_lower( val ); + else + onlyAlpha_upper( val ); + kake2hiku( val ); + } + return( val ); +} + +int load1SeqWithoutName_new( FILE *fpp, char *cbuf ) +{ + int c, b; + char *bk = cbuf; + + b = '\n'; + while( ( c = getc( fpp ) ) != EOF && /* by T. Nishiyama */ + !( ( c == '>' || c == EOF ) && b == '\n' ) ) + { + *cbuf++ = (char)c; /* Ť¹¤®¤Æ¤â¤·¤é¤Ê¤¤ */ + b = c; + } + ungetc( c, fpp ); + *cbuf = 0; + if( dorp == 'd' ) + onlyAlpha_lower( bk ); + else + onlyAlpha_upper( bk ); + kake2hiku( bk ); + return( 0 ); +} + + +void readDataforgaln( FILE *fp, char **name, int *nlen, char **seq ) +{ + int i; + static char *tmpseq = NULL; + +#if 0 + if( !tmpseq ) + { + tmpseq = AllocateCharVec( N ); + } +#endif + + rewind( fp ); + searchKUorWA( fp ); + + for( i=0; i', stdout ); +// puts( dumname+1 ); + + + strncat( name[npos], dumname, B-1 ); + name[npos][B-1] = 0; + + if( dorp == 'd' && upperCase != -1 ) seqLower( 1, &tmpseq ); + seqlen = strlen( tmpseq ); + lpos = 0; + for( j=0; j<5; j++ ) + { + if( regtable[0][j*2] == -1 && regtable[0][j*2+1] == -1 ) continue; + + startpos = regtable[0][j*2]; + endpos = regtable[0][j*2+1]; + if( startpos > endpos ) + { + endpos = regtable[0][j*2]; + startpos = regtable[0][j*2+1]; + } + + if( startpos < 0 ) startpos = 0; + if( endpos < 0 ) endpos = 0; + if( endpos >= seqlen ) endpos = seqlen-1; + if( startpos >= seqlen ) startpos = seqlen-1; + +// fprintf( stderr, "startpos = %d, endpos = %d\n", startpos, endpos ); + + outlen = endpos - startpos+1; + if( revtable[0][j] == 'f' ) + { +// fprintf( stderr, "regtable[%d][st] = %d\n", i, regtable[0][j*2+0] ); +// fprintf( stderr, "regtable[%d][en] = %d\n", i, regtable[0][j*2+1] ); +// fprintf( stderr, "outlen = %d\n", outlen ); +// fprintf( stdout, "%.*s\n", outlen, tmpseq+regtable[0][j*2] ); + strncpy( outseq[npos] + lpos, tmpseq+startpos, outlen ); + lpos += outlen; + } + else + { + fs = AllocateCharVec( outlen+1 ); + rs = AllocateCharVec( outlen+1 ); + + fs[outlen] = 0; + strncpy( fs, tmpseq+startpos, outlen ); + sreverse( rs, fs ); +// fprintf( stdout, "%s\n", rs ); + strncpy( outseq[npos] + lpos, rs, outlen ); + lpos += outlen; + free( fs ); + free( rs ); + } + outseq[npos][lpos] = 0; + } + npos++; + } + free( tmpseq ); + } +} + +void cutData( FILE *fp, int **regtable, char **revtable, int *outtable ) +{ + int i, j; + int outlen, seqlen, startpos, endpos; + static char *tmpseq = NULL; + static char *dumname = NULL; + char *fs, *rs; + + if( dumname == NULL ) + { + dumname = AllocateCharVec( N ); + } + + rewind( fp ); + searchKUorWA( fp ); + + for( i=0; i', stdout ); + puts( dumname+1 ); + + seqlen = strlen( tmpseq ); + + if( dorp == 'd' && upperCase != -1 ) seqLower( 1, &tmpseq ); + if( outtable[i] == 2 ) + { + startpos = 0; + endpos = seqlen-1; + outlen = endpos - startpos + 1; + fprintf( stdout, "%.*s\n", outlen, tmpseq+startpos ); + } + else + { + for( j=0; j<5; j++ ) + { + if( regtable[i][j*2] == -1 && regtable[i][j*2+1] == -1 ) continue; + + startpos = regtable[i][j*2]; + endpos = regtable[i][j*2+1]; + + if( startpos > endpos ) + { + endpos = regtable[i][j*2]; + startpos = regtable[i][j*2+1]; + } + + if( startpos < 0 ) startpos = 0; + if( endpos < 0 ) endpos = 0; + if( endpos >= seqlen ) endpos = seqlen-1; + if( startpos >= seqlen ) startpos = seqlen-1; + + outlen = endpos - startpos + 1; + if( revtable[i][j] == 'f' ) + { + fprintf( stderr, "startpos = %d\n", startpos ); + fprintf( stderr, "endpos = %d\n", endpos ); + fprintf( stderr, "outlen = %d\n", outlen ); + fprintf( stdout, "%.*s\n", outlen, tmpseq+startpos ); + } + else + { + fs = AllocateCharVec( outlen+1 ); + rs = AllocateCharVec( outlen+1 ); + + fs[outlen] = 0; + strncpy( fs, tmpseq+startpos, outlen ); + sreverse( rs, fs ); + fprintf( stdout, "%s\n", rs ); + free( fs ); + free( rs ); + } + } + } + } + free( tmpseq ); + } +} + +void catData( FILE *fp ) +{ + int i; + static char *tmpseq = NULL; + static char *dumname = NULL; +// char *cptr; + + if( dumname == NULL ) + { + dumname = AllocateCharVec( N ); + } + + rewind( fp ); + searchKUorWA( fp ); + + for( i=0; i_numo_s_%08d_numo_e_", i+1 ); + } + else + { + putc( '>', stdout ); + } + puts( dumname+1 ); + tmpseq = load1SeqWithoutName_realloc( fp ); + if( dorp == 'd' && upperCase != -1 ) seqLower( 1, &tmpseq ); + puts( tmpseq ); + free( tmpseq ); + } +} + +int countATGCandN( char *s, int *countN, int *total ) +{ + int nATGC; + int nChar; + int nN; + char c; + nN = nATGC = nChar = 0; + + if( *s == 0 ) + { + *total = 0; + return( 0 ); + } + + do + { + c = tolower( *s ); + if( isalpha( c ) ) + { + nChar++; + if( c == 'a' || c == 't' || c == 'g' || c == 'c' || c == 'u' || c == 'n' ) + nATGC++; + if( c == 'n' ) + nN++; + } + } + while( *++s ); + +// reporterr( "nN = %d", nN ); + + *total = nChar; + *countN = nN; + return( nATGC ); +} + +int countATGC( char *s, int *total ) +{ + int nATGC; + int nChar; + char c; + nATGC = nChar = 0; + + if( *s == 0 ) + { + *total = 0; + return( 0 ); + } + + do + { + c = tolower( *s ); + if( isalpha( c ) ) + { + nChar++; + if( c == 'a' || c == 't' || c == 'g' || c == 'c' || c == 'u' || c == 'n' ) + nATGC++; + } + } + while( *++s ); + + *total = nChar; + return( nATGC ); +} + +double countATGCbk( char *s ) +{ + int nATGC; + int nChar; + char c; + nATGC = nChar = 0; + + do + { + c = tolower( *s ); + if( isalpha( c ) ) + { + nChar++; + if( c == 'a' || c == 't' || c == 'g' || c == 'c' || c == 'u' || c == 'n' ) + nATGC++; + } + } + while( *++s ); + return( (double)nATGC / nChar ); +} + + +int countnogaplen( char *seq ) +{ + int val = 0; + while( *seq ) + if( *seq++ != '-' ) val++; + return( val ); +} + +int countnormalletters( char *seq, char *ref ) +{ + int val = 0; + while( *seq ) + if( strchr( ref, *seq++ ) ) val++; + return( val ); +} + +void getnumlen_casepreserve( FILE *fp, int *nlenminpt ) +{ + int total; + int nsite = 0; + int atgcnum; + int i, tmp; + char *tmpseq, *tmpname; + double atgcfreq; + +#if mingw + setmode( fileno( fp ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); +#endif + + tmpname = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + *nlenminpt = 99999999; + atgcnum = 0; + total = 0; + for( i=0; i nlenmax ) nlenmax = tmp; + if( tmp < *nlenminpt ) *nlenminpt = tmp; + atgcnum += countATGC( tmpseq, &nsite ); + total += nsite; + free( tmpseq ); + } + free( tmpname ); + atgcfreq = (double)atgcnum / total; +// fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); + if( dorp == NOTSPECIFIED ) + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } +} + +void getnumlen_nogap_countn( FILE *fp, int *nlenminpt, double *nfreq ) +{ + int total; + int nsite = 0; + int atgcnum, nnum, nN; + int i, tmp; + char *tmpseq, *tmpname; + double atgcfreq; + tmpname = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + *nlenminpt = 99999999; + atgcnum = 0; + total = 0; + nnum = 0; + for( i=0; i nlenmax ) nlenmax = tmp; + if( tmp < *nlenminpt ) *nlenminpt = tmp; + atgcnum += countATGCandN( tmpseq, &nN, &nsite ); + total += nsite; + nnum += nN; + free( tmpseq ); + } + free( tmpname ); + atgcfreq = (double)atgcnum / total; + *nfreq = (double)nnum / atgcnum; +// fprintf( stderr, "##### nnum = %d\n", nnum ); +// fprintf( stderr, "##### atgcfreq = %f, *nfreq = %f\n", atgcfreq, *nfreq ); + if( dorp == NOTSPECIFIED ) + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } +} +void getnumlen_nogap( FILE *fp, int *nlenminpt ) +{ + int total; + int nsite = 0; + int atgcnum; + int i, tmp; + char *tmpseq, *tmpname; + double atgcfreq; +#if mingw // web nomi de shiyou suru node nakutemo ii + setmode( fileno( fp ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); +#endif + tmpname = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + *nlenminpt = 99999999; + atgcnum = 0; + total = 0; + for( i=0; i nlenmax ) nlenmax = tmp; + if( tmp < *nlenminpt ) *nlenminpt = tmp; + atgcnum += countATGC( tmpseq, &nsite ); + total += nsite; + free( tmpseq ); + } + free( tmpname ); + atgcfreq = (double)atgcnum / total; +// fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); + if( dorp == NOTSPECIFIED ) + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } +} + + +void getnumlen_nogap_outallreg( FILE *fp, int *nlenminpt ) +{ + int total; + int nsite = 0; + int atgcnum; + int i, tmp; + char *tmpseq, *tmpname; + double atgcfreq; +#if mingw // web nomi de shiyou suru node nakutemo ii + setmode( fileno( fp ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); +#endif + tmpname = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + *nlenminpt = 99999999; + atgcnum = 0; + total = 0; + for( i=0; i nlenmax ) nlenmax = tmp; + if( tmp < *nlenminpt ) *nlenminpt = tmp; + atgcnum += countATGC( tmpseq, &nsite ); + total += nsite; + free( tmpseq ); + } + free( tmpname ); + atgcfreq = (double)atgcnum / total; +// fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); + if( dorp == NOTSPECIFIED ) + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } +} + +static void escapehtml( char *res, char *ori, int maxlen ) +{ + char *res0 = res; + while( *ori ) + { + if( *ori == '<' ) + { + strcpy( res, "<" ); + res += 3; + } + else if( *ori == '>' ) + { + strcpy( res, ">" ); + res += 3; + } + else if( *ori == '&' ) + { + strcpy( res, "&" ); + res += 4; + } + else if( *ori == '"' ) + { + strcpy( res, """ ); + res += 5; + } + else if( *ori == ' ' ) + { + strcpy( res, " " ); + res += 5; + } + else + { + *res = *ori; + } + res++; + ori++; + + if( res - res0 -10 > N ) break; + } + *res = 0; +} + +void getnumlen_nogap_outallreg_web( FILE *fp, FILE *ofp, int *nlenminpt, int *isalignedpt ) +{ + int total; + int nsite = 0; + int atgcnum; + int alnlen = 0, alnlen_prev; + int i, tmp, lennormalchar; + char *tmpseq, *tmpname, *tmpname2; + double atgcfreq; +#if mingw // web nomi de shiyou suru node nakutemo ii + setmode( fileno( fp ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); +#endif + tmpname = AllocateCharVec( N ); + tmpname2 = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + *nlenminpt = 99999999; + atgcnum = 0; + total = 0; + alnlen_prev = -1; + *isalignedpt = 1; + for( i=0; i nlenmax ) nlenmax = tmp; + if( tmp < *nlenminpt ) *nlenminpt = tmp; + atgcnum += countATGC( tmpseq, &nsite ); + total += nsite; + + alnlen = strlen( tmpseq ); +// fprintf( stdout, "##### alnlen, alnlen_prev = %d, %d\n", alnlen, alnlen_prev ); + if( i>0 && alnlen_prev != alnlen ) *isalignedpt = 0; + alnlen_prev = alnlen; + + atgcfreq = (double)atgcnum / total; +// fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); +// if( dorp == NOTSPECIFIED ) // you kentou + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } + + if( dorp == 'd' ) lennormalchar = countnormalletters( tmpseq, "atgcuATGCU" ); + else lennormalchar = countnormalletters( tmpseq, "ARNDCQEGHILKMFPSTWYVarndcqeghilkmfpstwyv" ); + free( tmpseq ); + + fprintf( ofp, " \n", i, i, i, i, i, lennormalchar, tmpname2 ); + fprintf( ofp, "+reg", i ); + fprintf( ofp, " Begin: End:", i, i, tmp ); + if( dorp == 'd' ) fprintf( ofp, " ", i, i, i ); +// fprintf( ofp, " Sequence Length:", i, tmp ); + fprintf( ofp, "\n" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + } + free( tmpname ); + free( tmpname2 ); + atgcfreq = (double)atgcnum / total; + fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); +// if( dorp == NOTSPECIFIED ) // you kentou + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } + fprintf( ofp, "\n" ); + if( *isalignedpt ) + { + fprintf( ofp, "" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + fprintf( ofp, "" ); + } + +} + +void getnumlen( FILE *fp ) +{ + int total; + int nsite = 0; + int atgcnum; + int i, tmp; + char *tmpseq; + char *tmpname; + double atgcfreq; + +#if mingw + setmode( fileno( fp ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); +#endif + + + tmpname = AllocateCharVec( N ); + njob = countKUorWA( fp ); + searchKUorWA( fp ); + nlenmax = 0; + atgcnum = 0; + total = 0; + for( i=0; i nlenmax ) nlenmax = tmp; + atgcnum += countATGC( tmpseq, &nsite ); + total += nsite; +// fprintf( stderr, "##### total = %d\n", total ); + free( tmpseq ); + } + + + atgcfreq = (double)atgcnum / total; +// fprintf( stderr, "##### atgcfreq = %f\n", atgcfreq ); + if( dorp == NOTSPECIFIED ) + { + if( atgcfreq > 0.75 ) + { + dorp = 'd'; + upperCase = -1; + } + else + { + dorp = 'p'; + upperCase = 0; + } + } + free( tmpname ); +} + + + +void WriteGapFill( FILE *fp, int locnjob, char name[][B], int nlen[M], char **aseq ) +{ + static char b[N]; + int i, j; + int nalen[M]; + static char gap[N]; + static char buff[N]; + +#if IODEBUG + fprintf( stderr, "IMAKARA KAKU\n" ); +#endif + nlenmax = 0; + for( i=0; i%s\n", name[i]+1 ); + for( j=0; j%s\n", name[i]+1 ); + for( j=0; j%s\n", name[i]+1 ); + for( j=0; j max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + max /= INTMTXSCALE; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i max ) max = mtx[i][j]; + + fprintf( hat2p, "%5d\n", 1 ); + fprintf( hat2p, "%5d\n", locnjob ); + fprintf( hat2p, " %#6.3f\n", max * 2.5 ); + + for( i=0; i", b, 19 ) || !strncmp( " ", b, 23 ) ) break; + } + + if( !strncmp( " ", b, 19 ) ) + { + junban[count] = atoi( b+31 ); + nlocalhom = 0; + } + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 25 ) ) break; + pt = b + 25; + score = atof( pt ); + sumscore += score; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 30 ) ) break; + pt = b + 30; + qstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + qend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + tstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 26 ) ) break; + pt = b + 26; + tend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 29 ) ) break; + pt = b + 29; + len = atoi( pt ); + sumlen += len; + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( qal, al+24 ); + pt = qal; + while( *++pt != '<' ) + ; + *pt = 0; + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( tal, al+24 ); + pt = tal; + while( *++pt != '<' ) + ; + *pt = 0; + + +// fprintf( stderr, "t=%d, score = %f, qstart=%d, qend=%d, tstart=%d, tend=%d, overlapaa=%d\n", junban[count], score, qstart, qend, tstart, tend, overlapaa ); + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " :", b, 18 ) ) break; + + + fgets( b, B-1, fp ); + + + if( !strncmp( " ", b, 21 ) ) + { + dis[junban[count++]] = sumscore; + sumscore = 0.0; + fgets( b, B-1, fp ); + fgets( b, B-1, fp ); + scorepersite = sumscore / sumlen; + if( scorepersite != (int)scorepersite ) + { + fprintf( stderr, "ERROR! sumscore=%f, sumlen=%f, and scorepersite=%f\n", sumscore, sumlen, scorepersite ); + exit( 1 ); + } + + if( !strncmp( " ", b, 23 ) ) break; + } + } + + free( junban ); + + return (int)scorepersite; +} +int ReadBlastm7_scoreonly( FILE *fp, double *dis, int nin ) +{ + int count=0; + char b[B]; + char *pt; + int *junban; + int overlapaa; + double score, sumscore; + int qstart, qend, tstart, tend; + static char qal[N], tal[N], al[N]; + int nlocalhom; + + junban = calloc( nin, sizeof( int ) ); + + count = 0; + sumscore = 0.0; + score = 0.0; + while( 1 ) + { + + if( feof( fp ) ) break; + + while( fgets( b, B-1, fp ) ) + { + if( !strncmp( " ", b, 19 ) || !strncmp( " ", b, 23 ) ) break; + } + + if( !strncmp( " ", b, 19 ) ) + { + junban[count] = atoi( b+31 ); + nlocalhom = 0; + } + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 25 ) ) break; + pt = b + 25; + score = atof( pt ); + sumscore += score; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 30 ) ) break; + pt = b + 30; + qstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + qend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + tstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 26 ) ) break; + pt = b + 26; + tend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 29 ) ) break; + pt = b + 29; + overlapaa = atoi( pt ); + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( qal, al+24 ); + pt = qal; + while( *++pt != '<' ) + ; + *pt = 0; + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( tal, al+24 ); + pt = tal; + while( *++pt != '<' ) + ; + *pt = 0; + + +// fprintf( stderr, "t=%d, score = %f, qstart=%d, qend=%d, tstart=%d, tend=%d, overlapaa=%d\n", junban[count], score, qstart, qend, tstart, tend, overlapaa ); + +// nlocalhom += addlocalhom_r( qal, tal, localhomlist+junban[count], qstart, tstart, score, overlapaa, nlocalhom ); + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " :", b, 18 ) ) break; + + + fgets( b, B-1, fp ); + + + if( !strncmp( " ", b, 21 ) ) + { + dis[junban[count++]] = sumscore; + sumscore = 0.0; + fgets( b, B-1, fp ); + fgets( b, B-1, fp ); + if( !strncmp( " ", b, 23 ) ) break; + } + } + + free( junban ); + + return count; +} + +int ReadBlastm7( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ) +{ + int count=0; + char b[B]; + char *pt; + static int junban[M]; + int overlapaa; + double score, sumscore; + int qstart, qend, tstart, tend; + static char qal[N], tal[N], al[N]; + int nlocalhom; + + + + count = 0; + sumscore = 0.0; + score = 0.0; + nlocalhom = 0; + while( 1 ) + { + + if( feof( fp ) ) break; + + while( fgets( b, B-1, fp ) ) + { + if( !strncmp( " ", b, 19 ) || !strncmp( " ", b, 23 ) ) break; + } + + if( !strncmp( " ", b, 19 ) ) + { + junban[count] = atoi( b+31 ); + nlocalhom = 0; + } + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 25 ) ) break; + pt = b + 25; + score = atof( pt ); + sumscore += score; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 30 ) ) break; + pt = b + 30; + qstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + qend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 28 ) ) break; + pt = b + 28; + tstart = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 26 ) ) break; + pt = b + 26; + tend = atoi( pt ) - 1; + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " ", b, 29 ) ) break; + pt = b + 29; + overlapaa = atoi( pt ); + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( qal, al+24 ); + pt = qal; + while( *++pt != '<' ) + ; + *pt = 0; + + + while( fgets( al, N-100, fp ) ) + if( !strncmp( " ", al, 24 ) ) break; + + strcpy( tal, al+24 ); + pt = tal; + while( *++pt != '<' ) + ; + *pt = 0; + + +// fprintf( stderr, "t=%d, score = %f, qstart=%d, qend=%d, tstart=%d, tend=%d, overlapaa=%d\n", junban[count], score, qstart, qend, tstart, tend, overlapaa ); + + nlocalhom += addlocalhom_r( qal, tal, localhomlist+junban[count], qstart, tstart, score, overlapaa, nlocalhom, 'h' ); + + while( fgets( b, B-1, fp ) ) + if( !strncmp( " :", b, 18 ) ) break; + + + fgets( b, B-1, fp ); + + + if( !strncmp( " ", b, 21 ) ) + { + dis[junban[count++]] = sumscore; + sumscore = 0.0; + fgets( b, B-1, fp ); + fgets( b, B-1, fp ); + if( !strncmp( " ", b, 23 ) ) break; + } + } + return count; +} + +int ReadFasta34noalign( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ) +{ + int count=0; + char b[B]; + char *pt; + static int junban[M]; + int opt; + double z, bits; + + + count = 0; +#if 0 + for( i=0; i<10000000 && count>+==========+", b, 14 ) ) + { + break; + } + + } + if( !count ) return -1; + + count = 0; + while( 1 ) + { + if( strncmp( ">>+==========+", b, 14 ) ) + { + fgets( b, B-1, fp ); + if( feof( fp ) ) break; + continue; + } + junban[count++] = atoi( b+14 ); +// fprintf( stderr, "t = %d\n", atoi( b+14 ) ); + while( fgets( b, B-1, fp ) ) + if( !strncmp( "; fa_opt:", b, 9 ) || !strncmp( "; sw_s-w opt:", b, 13 ) ) break; + pt = strstr( b, ":" ) +1; + opt = atoi( pt ); + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_overlap:", b+4, 9 ) ) break; + pt = strstr( b, ":" ) +1; + overlapaa = atoi( pt ); + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_start:", b+4, 7 ) ) break; + pt = strstr( b, ":" ) +1; + qstart = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_stop:", b+4, 6 ) ) break; + pt = strstr( b, ":" ) +1; + qend = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_display_start:", b+4, 15 ) ) break; + pt = strstr( b, ":" ) +1; + qal_display_start = atoi( pt ) - 1; + + pt = qal; + while( (c = fgetc( fp )) ) + { + if( c == '>' ) + { + ungetc( c, fp ); + break; + } + if( isalpha( c ) || c == '-' ) + *pt++ = c; + } + *pt = 0; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_start:", b+4, 7 ) ) break; + pt = strstr( b, ":" ) + 1; + tstart = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_stop:", b+4, 6 ) ) break; + pt = strstr( b, ":" ) + 1; + tend = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_display_start:", b+4, 15 ) ) break; + pt = strstr( b, ":" ) + 1; + tal_display_start = atoi( pt ) - 1; + + pt = tal; + while( ( c = fgetc( fp ) ) ) + { + if( c == '>' ) + { + ungetc( c, fp ); + break; + } + if( isalpha( c ) || c == '-' ) + *pt++ = c; + } + *pt = 0; + +// fprintf( stderr, "(%d-%d:%d-%d)\n", qstart, qend, tstart, tend ); +// fprintf( stderr, "qal_display_start = %d, tal_display_start = %d\n", qal_display_start, tal_display_start ); + +// fprintf( stderr, "qal = %s\n", qal ); +// fprintf( stderr, "tal = %s\n", tal ); + + qal2 = cutal( qal, qal_display_start, qstart, qend ); + tal2 = cutal( tal, tal_display_start, tstart, tend ); + +// fprintf( stderr, "qal2 = %s\n", qal2 ); +// fprintf( stderr, "tal2 = %s\n", tal2 ); + +// fprintf( stderr, "putting %d - %d, opt = %d\n", qmem, junban[count-1], opt ); + putlocalhom2( qal2, tal2, localhomlist+junban[count-1], qstart, tstart, opt, overlapaa, 'h' ); + } +// fprintf( stderr, "count = %d\n", count ); + return count; +} +int ReadFasta34m10( FILE *fp, double *dis, int qmem, char **name, LocalHom *localhomlist ) +{ + int count=0; + char b[B]; + char *pt; + static int junban[M]; + int overlapaa; + int opt, qstart, qend, tstart, tend; + double z, bits; + int qal_display_start, tal_display_start; + static char qal[N], tal[N]; + char *qal2, *tal2; + int c; + + + count = 0; +#if 0 + for( i=0; i<10000000 && count>+==========+", b, 14 ) ) + { + break; + } + + } + if( !count ) return -1; + + count = 0; + while( 1 ) + { + if( strncmp( ">>+==========+", b, 14 ) ) + { + fgets( b, B-1, fp ); + if( feof( fp ) ) break; + continue; + } + junban[count++] = atoi( b+14 ); +// fprintf( stderr, "t = %d\n", atoi( b+14 ) ); + while( fgets( b, B-1, fp ) ) + if( !strncmp( "; fa_opt:", b, 9 ) || !strncmp( "; sw_s-w opt:", b, 13 ) ) break; + pt = strstr( b, ":" ) +1; + opt = atoi( pt ); + + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_overlap:", b+4, 9 ) ) break; + pt = strstr( b, ":" ) +1; + overlapaa = atoi( pt ); + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_start:", b+4, 7 ) ) break; + pt = strstr( b, ":" ) +1; + qstart = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_stop:", b+4, 6 ) ) break; + pt = strstr( b, ":" ) +1; + qend = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_display_start:", b+4, 15 ) ) break; + pt = strstr( b, ":" ) +1; + qal_display_start = atoi( pt ) - 1; + + pt = qal; + while( (c = fgetc( fp )) ) + { + if( c == '>' ) + { + ungetc( c, fp ); + break; + } + if( isalpha( c ) || c == '-' ) + *pt++ = c; + } + *pt = 0; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_start:", b+4, 7 ) ) break; + pt = strstr( b, ":" ) + 1; + tstart = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_stop:", b+4, 6 ) ) break; + pt = strstr( b, ":" ) + 1; + tend = atoi( pt ) - 1; + + while( fgets( b, B-1, fp ) ) + if( !strncmp( "_display_start:", b+4, 15 ) ) break; + pt = strstr( b, ":" ) + 1; + tal_display_start = atoi( pt ) - 1; + + pt = tal; + while( ( c = fgetc( fp ) ) ) + { + if( c == '>' ) + { + ungetc( c, fp ); + break; + } + if( isalpha( c ) || c == '-' ) + *pt++ = c; + } + *pt = 0; + +// fprintf( stderr, "(%d-%d:%d-%d)\n", qstart, qend, tstart, tend ); +// fprintf( stderr, "qal_display_start = %d, tal_display_start = %d\n", qal_display_start, tal_display_start ); + +// fprintf( stderr, "qal = %s\n", qal ); +// fprintf( stderr, "tal = %s\n", tal ); + + qal2 = cutal( qal, qal_display_start, qstart, qend ); + tal2 = cutal( tal, tal_display_start, tstart, tend ); + +// fprintf( stderr, "qal2 = %s\n", qal2 ); +// fprintf( stderr, "tal2 = %s\n", tal2 ); + +// fprintf( stderr, "putting %d - %d, opt = %d\n", qmem, junban[count-1], opt ); + putlocalhom2( qal2, tal2, localhomlist+junban[count-1], qstart, tstart, opt, overlapaa, 'h' ); + } +// fprintf( stderr, "count = %d\n", count ); + return count; +} +int ReadFasta34m10_scoreonly_nucbk( FILE *fp, double *dis, int nin ) +{ + int count=0; + char b[B]; + char *pt; + int pos; + int opt; + double z, bits; + + count = 0; + while( !feof( fp ) ) + { + fgets( b, B-1, fp ); + if( !strncmp( "+===========+", b, 13 ) ) + { + pos = atoi( b+13 ); + + if( strchr( b, 'r' ) ) continue; + +// pt = strchr( b, ')' ) + 1; + pt = strchr( b, ']' ) + 1; + sscanf( pt, "%d %lf %lf", &opt, &bits, &z ); + dis[pos] += (double)opt; + count++; +#if 0 + fprintf( stderr, "b=%s\n", b ); + fprintf( stderr, "opt=%d\n", opt ); + fprintf( stderr, "pos=%d\n", pos ); + fprintf( stderr, "dis[pos]=%f\n", dis[pos] ); +#endif + + } + else if( 0 == strncmp( ">>><<<", b, 6 ) ) + { + break; + } + + } + if( !count ) return -1; + + return count; +} + +int ReadFasta34m10_scoreonly_nuc( FILE *fp, double *dis, int nin ) +{ + int count=0; + char b[B]; + char *pt; + int pos; + int opt; + double z, bits; + int c; + int *yonda; + + + yonda = AllocateIntVec( nin ); + for( c=0; c>>", b, 3 ) ) + { + for( c=0; c>><<<", b, 6 ) ) + { + break; + } + + } + + free( yonda ); + + if( !count ) return -1; + + return count; +} + +int ReadFasta34m10_scoreonly( FILE *fp, double *dis, int nin ) +{ + int count=0; + char b[B]; + char *pt; + int pos; + int opt; + double z, bits; + int c; + int *yonda; + + + yonda = AllocateIntVec( nin ); + for( c=0; c>>", b, 3 ) ) + { + for( c=0; c>><<<", b, 6 ) ) + { + break; + } + + } + + free( yonda ); + + if( !count ) return -1; + + return count; +} +int ReadFasta34( FILE *fp, double *dis, int nseq, char name[M][B], LocalHom *localhomlist ) +{ + int count=0; + char b[B]; + char *pt; + static int junban[M]; + int overlapaa; + int opt, qstart, qend, tstart, tend; + double z, bits; + + + count = 0; +#if 0 + for( i=0; i<10000000 && count>+==========+", b, 14 ) ) + { + break; + } + + } + if( !count ) return -1; + + count = 0; + while( !feof( fp ) ) + { + if( !strncmp(">>+==========+", b, 14 ) ) + { + junban[count] = atoi( b+14 ); + count++; + fgets( b, B-1, fp ); // initn: + pt = strstr( b, "opt: " ) + 5; + localhomlist[junban[count-1]].opt = atof( pt ); + fgets( b, B-1, fp ); // Smith-Waterman score + pt = strstr( b, "ungapped) in " ) + 13; + sscanf( pt, "%d", &overlapaa ); + fprintf( stderr, "pt = %s, overlapaa = %d\n", pt, overlapaa ); + pt = strstr( b, "overlap (" ) + 8; + sscanf( pt, "(%d-%d:%d-%d)", &qstart, &qend, &tstart, &tend ); + localhomlist[junban[count-1]].overlapaa = overlapaa; + localhomlist[junban[count-1]].start1 = qstart-1; + localhomlist[junban[count-1]].end1 = qend-1; + localhomlist[junban[count-1]].start2 = tstart-1; + localhomlist[junban[count-1]].end2 = tend-1; + } + fgets( b, B-1, fp ); + } + fprintf( stderr, "count = %d\n", count ); + return count; +} + +int ReadFasta3( FILE *fp, double *dis, int nseq, char name[M][B] ) +{ + int count=0; + char b[B]; + char *pt; + int junban[M]; + int initn, init1, opt; + double z; + + count = 0; +#if 0 + for( i=0; i<10000000 && count 0 ) + { +#if 0 /* /tmp/pre ¤Î´Ø·¸¤Ç¤Ï¤º¤·¤¿ */ + if( ferror( prep_g ) ) prep_g = fopen( "pre", "w" ); + if( !prep_g ) ErrorExit( "Cannot re-open pre." ); +#endif + rewind( prep_g ); + signalSM[STATUS] = IMA_KAITERU; +#if IODEBUG + if( force ) fprintf( stderr, "FINAL " ); +#endif + if( devide ) dvWrite( prep_g, nseq, name, nlen, aseq ); + else WriteGapFill( prep_g, nseq, name, nlen, aseq ); + /* + fprintf( prep_g, '\EOF' ); + */ + fflush( prep_g ); + if( force ) signalSM[STATUS] = OSHIMAI; + else signalSM[STATUS] = KAKIOWATTA; + value = 1; + signalSM[SEMAPHORE]++; +#if IODEBUG + fprintf( stderr, "signalSM[STATUS] = %c\n", signalSM[STATUS] ); +#endif + break; + } + else + { +#if IODEBUG + fprintf( stderr, "YONDERUKARA_AKIRAMERU\n" ); +#endif + value = 0; + signalSM[SEMAPHORE]++; + if( !force ) break; +#if IODEBUG + fprintf( stderr, "MATSU\n" ); +#endif + sleep( 1 ); + } + } + if( force && !value ) ErrorExit( "xced ga pre wo hanasanai \n" ); + return( value ); +#else + if( force ) + { + rewind( prep_g ); + writeData_pointer( prep_g, nseq, name, nlen, aseq ); + } +#endif + return( 0 ); +} + + +void readOtherOptions( int *ppidptr, int *fftThresholdptr, int *fftWinSizeptr ) +{ + if( calledByXced ) + { + FILE *fp = fopen( "pre", "r" ); + char b[B]; + if( !fp ) ErrorExit( "Cannot open pre.\n" ); + fgets( b, B-1, fp ); + sscanf( b, "%d %d %d", ppidptr, fftThresholdptr, fftWinSizeptr ); + fclose( fp ); +#if IODEBUG + fprintf( stderr, "b = %s\n", b ); + fprintf( stderr, "ppid = %d\n", ppid ); + fprintf( stderr, "fftThreshold = %d\n", fftThreshold ); + fprintf( stderr, "fftWinSize = %d\n", fftWinSize ); +#endif + } + else + { + *ppidptr = 0; + *fftThresholdptr = FFT_THRESHOLD; + if( dorp == 'd' ) + *fftWinSizeptr = FFT_WINSIZE_D; + else + *fftWinSizeptr = FFT_WINSIZE_P; + } +#if 0 + fprintf( stderr, "fftThresholdptr=%d\n", *fftThresholdptr ); + fprintf( stderr, "fftWinSizeptr=%d\n", *fftWinSizeptr ); +#endif +} + +void initSignalSM( void ) +{ +// int signalsmid; + +#if IODEBUG + if( ppid ) fprintf( stderr, "PID of xced = %d\n", ppid ); +#endif + if( !ppid ) + { + signalSM = NULL; + return; + } + +#if 0 + signalsmid = shmget( (key_t)ppid, 3, IPC_ALLOC | 0666 ); + if( signalsmid == -1 ) ErrorExit( "Cannot get Shared memory for signal.\n" ); + signalSM = shmat( signalsmid, 0, 0 ); + if( (int)signalSM == -1 ) ErrorExit( "Cannot attatch Shared Memory for signal!\n" ); + signalSM[STATUS] = IMA_KAITERU; + signalSM[SEMAPHORE] = 1; +#endif +} + +void initFiles( void ) +{ + char pname[100]; + if( ppid ) + sprintf( pname, "/tmp/pre.%d", ppid ); + else + sprintf( pname, "pre" ); + prep_g = fopen( pname, "w" ); + if( !prep_g ) ErrorExit( "Cannot open pre" ); + +#if mingw + setmode( fileno( prep_g ), O_BINARY ); +#endif + trap_g = fopen( "trace", "w" ); + if( !trap_g ) ErrorExit( "cannot open trace" ); + fprintf( trap_g, "PID = %d\n", getpid() ); + fflush( trap_g ); +} + +void closeFiles( void ) +{ + fclose( prep_g ); + fclose( trap_g ); +} + + +void WriteForFasta( FILE *fp, int locnjob, char **name, int nlen[M], char **aseq ) +{ + static char b[N]; + int i, j; + int nalen[M]; + + for( i=0; i%s\n", name[i] ); + for( j=0; j 0 ) + { + tmpptr1 = localhomtable[it][j].last; +// fprintf( stderr, "reallocating, localhomtable[%d][%d].nokori = %d\n", i, j, localhomtable[i][j].nokori ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->extended = -1; + tmpptr1->next = NULL; + localhomtable[it][j].last = tmpptr1; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j].nokori ); + } + else + { + tmpptr1 = localhomtable[it]+j; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j].nokori ); + } + + tmpptr1->start1 = start1; + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + } +// else + if( jt != -1 ) + { + if( localhomtable[jt][i].nokori++ > 0 ) + { + tmpptr2 = localhomtable[jt][i].last; + tmpptr2->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr2 = tmpptr2->next; + tmpptr2->extended = -1; + tmpptr2->next = NULL; + localhomtable[jt][i].last = tmpptr2; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", j, i, localhomtable[j][i].nokori ); + } + else + { + tmpptr2 = localhomtable[jt]+i; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", j, i, localhomtable[j][i].nokori ); + } + + tmpptr2->start2 = start1; + tmpptr2->start1 = start2; + tmpptr2->end2 = end1; + tmpptr2->end1 = end2; +// tmpptr2->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr2->opt = opt; + tmpptr2->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr2->overlapaa = overlapaa; + tmpptr2->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, st1=%d, en1=%d, opt = %f\n", i, j, tmpptr1->start1, tmpptr1->end1, opt ); + } + + } +} + +void readlocalhomtable2_half( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ) +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + LocalHom *tmpptr1; + +// for( i=0; i= njob || i >= njob ) + { + reporterr( "Check hat3. The first sequence must be younger than the second one.\n" ); + exit( 1 ); + } + { + if( localhomtable[i][j-i].nokori++ > 0 ) + { + tmpptr1 = localhomtable[i][j-i].last; +// fprintf( stderr, "reallocating, localhomtable[%d][%d].nokori = %d\n", i, j, localhomtable[i][j].nokori ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->extended = -1; + tmpptr1->next = NULL; + localhomtable[i][j-i].last = tmpptr1; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j-i].nokori ); + } + else + { + tmpptr1 = localhomtable[i]+j-i; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j-i].nokori ); + } + + tmpptr1->start1 = start1; + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + } + } +} + +void readlocalhomtable2( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ) +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + LocalHom *tmpptr1, *tmpptr2; + +// for( i=0; i 0 ) + { + tmpptr1 = localhomtable[i][j].last; +// fprintf( stderr, "reallocating, localhomtable[%d][%d].nokori = %d\n", i, j, localhomtable[i][j].nokori ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->extended = -1; + tmpptr1->next = NULL; + localhomtable[i][j].last = tmpptr1; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j].nokori ); + } + else + { + tmpptr1 = localhomtable[i]+j; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", i, j, localhomtable[i][j].nokori ); + } + + tmpptr1->start1 = start1; + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + } +// else + { + if( localhomtable[j][i].nokori++ > 0 ) + { + tmpptr2 = localhomtable[j][i].last; + tmpptr2->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr2 = tmpptr2->next; + tmpptr2->extended = -1; + tmpptr2->next = NULL; + localhomtable[j][i].last = tmpptr2; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", j, i, localhomtable[j][i].nokori ); + } + else + { + tmpptr2 = localhomtable[j]+i; +// fprintf( stderr, "### i,j = %d,%d, nokori=%d\n", j, i, localhomtable[j][i].nokori ); + } + + tmpptr2->start2 = start1; + tmpptr2->start1 = start2; + tmpptr2->end2 = end1; + tmpptr2->end1 = end2; +// tmpptr2->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr2->opt = opt; + tmpptr2->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr2->overlapaa = overlapaa; + tmpptr2->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, st1=%d, en1=%d, opt = %f\n", i, j, tmpptr1->start1, tmpptr1->end1, opt ); + } + + } +} + +#if 0 +void readlocalhomtable_target( FILE*fp, int ntarget, int njob, LocalHom **localhomtable, char *kozoarivec, int *targetmap ) +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2, it, jt; + int **nlocalhom = NULL; + LocalHom *tmpptr1=NULL, *tmpptr2=NULL; // by D.Mathog, a guess + + nlocalhom = AllocateIntMtx( njob, njob ); + for( i=0; i 0 ) + { + printf( "extending %d-%d, ->%d\n", i, j, nlocalhom[it][j] ); +// fprintf( stderr, "reallocating, nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->next = NULL; + } + else + { + tmpptr1 = localhomtable[it]+j; +// fprintf( stderr, "nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + } + + tmpptr1->start1 = start1; // CHUUI!!!! + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; // CHUUI!!!! + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, opt = %f\n", i, j, opt ); + + + } +// else + + if( jt != -1 ) + { + if( nlocalhom[jt][i]++ > 0 ) + { + printf( "extending %d-%d, ->%d\n", i, j, nlocalhom[jt][i] ); + tmpptr2->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr2 = tmpptr2->next; + tmpptr2->next = NULL; + } + else + tmpptr2 = localhomtable[jt]+i; + + tmpptr2->start2 = start1; // CHUUI!!!! + tmpptr2->start1 = start2; + tmpptr2->end2 = end1; // CHUUI!!!! + tmpptr2->end1 = end2; +// tmpptr2->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr2->opt = opt; + tmpptr2->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr2->overlapaa = overlapaa; + tmpptr2->korh = *infor; + +// fprintf( stderr, "j=%d, i=%d, opt = %f\n", j, i, opt ); + } + + } + LocalHom *tmpptr; + for( tmpptr = localhomtable[1]+11; tmpptr; tmpptr=tmpptr->next ) + fprintf( stdout, "reg1=%d-%d, reg2=%d-%d, imp=%f, opt=%f, next=%p\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt / 600 * 5.8, tmpptr->next ); + FreeIntMtx( nlocalhom ); +} + +void readlocalhomtable_half( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ) +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + int **nlocalhom = NULL; + LocalHom *tmpptr1=NULL; // by D.Mathog, a guess + + nlocalhom = AllocateIntMtx( njob, njob ); + for( i=0; i 0 ) + { +// fprintf( stderr, "reallocating, nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->next = NULL; + } + else + { + tmpptr1 = localhomtable[i]+j-i; +// fprintf( stderr, "nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + } + + tmpptr1->start1 = start1; // CHUUI!!!! + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; // CHUUI!!!! + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, opt = %f\n", i, j, opt ); + } + } + FreeIntMtx( nlocalhom ); +} +#endif + +void readlocalhomtable( FILE*fp, int njob, LocalHom **localhomtable, char *kozoarivec ) +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + int **nlocalhom = NULL; + LocalHom *tmpptr1=NULL, *tmpptr2=NULL; // by D.Mathog, a guess + + nlocalhom = AllocateIntMtx( njob, njob ); + for( i=0; i 0 ) + { +// fprintf( stderr, "reallocating, nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->next = NULL; + } + else + { + tmpptr1 = localhomtable[i]+j; +// fprintf( stderr, "nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + } + + tmpptr1->start1 = start1; // CHUUI!!!! + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; // CHUUI!!!! + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, opt = %f\n", i, j, opt ); + } +// else + { + if( nlocalhom[j][i]++ > 0 ) + { + tmpptr2->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr2 = tmpptr2->next; + tmpptr2->next = NULL; + } + else + tmpptr2 = localhomtable[j]+i; + + tmpptr2->start2 = start1; // CHUUI!!!! + tmpptr2->start1 = start2; + tmpptr2->end2 = end1; // CHUUI!!!! + tmpptr2->end1 = end2; +// tmpptr2->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr2->opt = opt; + tmpptr2->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr2->overlapaa = overlapaa; + tmpptr2->korh = *infor; + +// fprintf( stderr, "j=%d, i=%d, opt = %f\n", j, i, opt ); + } + + } + FreeIntMtx( nlocalhom ); +} + + +void readlocalhomtable_two( FILE*fp, int norg, int nadd, LocalHom **localhomtable, LocalHom **localhomtablex, char *kozoarivec ) // for test only +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + int **nlocalhom = NULL; + int **nlocalhomx = NULL; + LocalHom *tmpptr1=NULL, *tmpptr2=NULL; // by D.Mathog, a guess + + nlocalhom = AllocateIntMtx( norg, nadd ); + for( i=0; i 0 ) + { +// fprintf( stderr, "reallocating, nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->next = NULL; + } + else + { + tmpptr1 = localhomtable[i]+j; +// fprintf( stderr, "nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + } + + tmpptr1->start1 = start1; // CHUUI!!!! + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; // CHUUI!!!! + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, opt = %f\n", i, j, opt ); + } + + { + if( nlocalhomx[j][i]++ > 0 ) + { + tmpptr2->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr2 = tmpptr2->next; + tmpptr2->next = NULL; + } + else + tmpptr2 = localhomtablex[j]+i; + + tmpptr2->start2 = start1+1; // CHUUI!!!! + tmpptr2->start1 = start2; + tmpptr2->end2 = end1+1; // CHUUI!!!! + tmpptr2->end1 = end2; +// tmpptr2->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr2->opt = opt; + tmpptr2->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr2->overlapaa = overlapaa; + tmpptr2->korh = *infor; + +// fprintf( stderr, "j=%d, i=%d, opt = %f\n", j, i, opt ); + } + + } + FreeIntMtx( nlocalhom ); + FreeIntMtx( nlocalhomx ); +} + +void readlocalhomtable_one( FILE*fp, int norg, int nadd, LocalHom **localhomtable, char *kozoarivec ) // for test only +{ + double opt; + static char buff[B]; + char infor[100]; + int i, j, overlapaa, start1, end1, start2, end2; + int **nlocalhom = NULL; + LocalHom *tmpptr1=NULL; // by D.Mathog, a guess + + nlocalhom = AllocateIntMtx( norg, nadd ); + for( i=0; i 0 ) + { +// fprintf( stderr, "reallocating, nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->next = NULL; + } + else + { + tmpptr1 = localhomtable[i]+j; +// fprintf( stderr, "nlocalhom[%d][%d] = %d\n", i, j, nlocalhom[i][j] ); + } + + tmpptr1->start1 = start1; // CHUUI!!!! + tmpptr1->start2 = start2; + tmpptr1->end1 = end1; // CHUUI!!!! + tmpptr1->end2 = end2; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( opt + 0.00 ) / 5.8 * 600; + tmpptr1->overlapaa = overlapaa; + tmpptr1->korh = *infor; + +// fprintf( stderr, "i=%d, j=%d, opt = %f\n", i, j, opt ); + } + + } + FreeIntMtx( nlocalhom ); +} + +void outlocalhom_part( LocalHom **localhom, int norg, int nadd ) +{ + int i, j; + LocalHom *tmpptr; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt / 600 * 5.8 ); + } + while( (tmpptr=tmpptr->next) ); + } +} + +void outlocalhom_target( LocalHom **localhom, int norg, int nadd ) +{ + int i, j; + LocalHom *tmpptr; + for( i=0; inext ) + { + fprintf( stdout, "reg1=%d-%d, reg2=%d-%d, imp=%f, opt=%f, next=%p\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt / 600 * 5.8, (void *)tmpptr->next ); + } +// while( (tmpptr=tmpptr->next) ); + } +} + +void outlocalhom_half( LocalHom **localhom, int nseq ) +{ + int i, j; + LocalHom *tmpptr; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt / 600 * 5.8, (void *)tmpptr->next ); + } + while( (tmpptr=tmpptr->next) ); + } +} + +void outlocalhom( LocalHom **localhom, int nseq ) +{ + int i, j; + LocalHom *tmpptr; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt ); + } + while( (tmpptr=tmpptr->next) ); + } +} + +void outlocalhompt( LocalHom ***localhom, int n1, int n2 ) +{ + int i, j; + LocalHom *tmpptr; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->importance, tmpptr->opt ); + } + while( (tmpptr=tmpptr->next) ); + } +} + +void initlocalhom1( LocalHom *lh ) +{ + lh->start1 = -1; + lh->end1 = -1; + lh->start2 = -1; + lh->end2 = -1; + lh->opt = -1.0; + lh->next = NULL; + lh->nokori = 0; + lh->extended = -1; + lh->last = lh; + lh->korh = 'h'; +} + +void freelocalhom1( LocalHom *lh ) +{ + if( lh == NULL ) return; + LocalHom *tmpptr = lh; + LocalHom *ppp; + for( ; tmpptr; tmpptr=ppp ) + { + ppp = tmpptr->next; + if( tmpptr!=lh ) + { + free( tmpptr ); + continue; + } + tmpptr->start1 = -1; + tmpptr->end1 = -1; + tmpptr->start2 = -1; + tmpptr->end2 = -1; + tmpptr->opt = -1.0; + tmpptr->next = NULL; + tmpptr->nokori = 0; + tmpptr->extended = -1; + tmpptr->last = tmpptr; + tmpptr->korh = 'h'; + } + +} + +void FreeLocalHomTable_part( LocalHom **localhomtable, int n, int m ) +{ + int i, j; + LocalHom *ppp, *tmpptr; + for( i=0; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } +#if DEBUG + fprintf( stderr, "freeing localhomtable\n" ); +#endif + free( localhomtable ); +#if DEBUG + fprintf( stderr, "freed\n" ); +#endif +} + +void FreeLocalHomTable_two( LocalHom **localhomtable, int n, int m ) +{ + int i, j; + LocalHom *ppp, *tmpptr; + for( i=0; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } + + for( i=n; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } +#if DEBUG + fprintf( stderr, "freeing localhomtable\n" ); +#endif + free( localhomtable ); +#if DEBUG + fprintf( stderr, "freed\n" ); +#endif +} + +void FreeLocalHomTable_one( LocalHom **localhomtable, int n, int m ) +{ + int i, j; + LocalHom *ppp, *tmpptr; + for( i=0; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } + +#if DEBUG + fprintf( stderr, "freeing localhomtable\n" ); +#endif + free( localhomtable ); +#if DEBUG + fprintf( stderr, "freed\n" ); +#endif +} + +void FreeLocalHomTable_half( LocalHom **localhomtable, int n ) +{ + int i, j; + LocalHom *ppp, *tmpptr; + for( i=0; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } +#if DEBUG + fprintf( stderr, "freeing localhomtable\n" ); +#endif + free( localhomtable ); +#if DEBUG + fprintf( stderr, "freed\n" ); +#endif +} +void FreeLocalHomTable( LocalHom **localhomtable, int n ) +{ + int i, j; + LocalHom *ppp, *tmpptr; + for( i=0; inext; + for( ; tmpptr; tmpptr=ppp ) + { +#if DEBUG + fprintf( stderr, "i=%d, j=%d\n", i, j ); +#endif + ppp = tmpptr->next; + if( tmpptr!=localhomtable[i]+j ) + { +#if DEBUG + fprintf( stderr, "freeing %p\n", tmpptr ); +#endif + free( tmpptr ); + } + } + } +#if DEBUG + fprintf( stderr, "freeing localhomtable[%d]\n", i ); +#endif + free( localhomtable[i] ); + } +#if DEBUG + fprintf( stderr, "freeing localhomtable\n" ); +#endif + free( localhomtable ); +#if DEBUG + fprintf( stderr, "freed\n" ); +#endif +} + +char *progName( char *str ) +{ + char *value; + if( ( value = strrchr( str, '/' ) ) != NULL ) + return( value+1 ); + else + return( str ); +} + +static void tabtospace( char *str ) +{ + char *p; +// fprintf( stderr, "before = %s\n", str ); + while( NULL != ( p = strchr( str , '\t' ) ) ) + { + *p = ' '; + } +// fprintf( stderr, "after = %s\n", str ); +} + +static char *extractfirstword( char *str ) +{ + char *val = str; + + tabtospace( str ); + while( *str ) + { + if( val == str && *str == ' ' ) + { + val++; str++; + } + else if( *str != ' ' ) + { + str++; + } + else if( *str == ' ' ) + { + *str = 0; + } + } + return( val ); +} + +void phylipout_pointer( FILE *fp, int nseq, int maxlen, char **seq, char **name, int *order, int namelen ) +{ + int pos, pos2, j; + if( namelen == -1 ) namelen = 10; + pos = 0; + + fprintf( fp, " %d %d\n", nseq, maxlen ); + + while( pos < maxlen ) + { + for( j=0; j%s\n", name[k]+1 ); + for( j=0; j%s\n", name[k]+1 ); + for( j=0; j 19 ) break; + } + + *rescalept = 1; + for( i=0; i<20; i++ ) raw[20][i] = -1.0; + while( !feof( mf ) ) + { + fgets( line, 999, mf ); + + sscanf( line, "%s", key ); + + if( !strcmp( key, "norescale" ) ) + { + reporterr( "no rescale\n" ); + *rescalept = 0; + break; + } +// else if( line[0] == 'f' ) + else if( !strcmp( key, "frequency" ) ) + { +// fprintf( stderr, "found! line = %s\n", line ); + ptr1 = line; + for( j=0; j<20; j++ ) + { + while( !isdigit( *ptr1 ) && *ptr1 != '-' && *ptr1 != '.' ) + ptr1++; + + raw[20][j] = atof( ptr1 ); +// fprintf( stderr, "raw[20][]=%f, %c %d\n", raw[20][j], inorder[i], j ); + ptr1 = strchr( ptr1, ' ' ); + if( ptr1 == NULL && j<19) showaamtxexample(); + } + break; + } + } + + k = 0; + for( i=0; i<20; i++ ) + { + for( j=0; j<=i; j++ ) + { + if( i != j ) + { + ii = MAX( map[i], map[j] ); + jj = MIN( map[i], map[j] ); + } + else ii = jj = map[i]; + val[k++] = raw[ii][jj]; +// fprintf( stderr, "%c-%c, %f\n", aaorder[i], aaorder[j], val[k-1] ); + } + } + for( i=0; i<20; i++ ) val[400+i] = raw[20][map[i]]; + + fprintf( stderr, "inorder = %s\n", inorder ); + fclose( mf ); + free( inorder ); + free( line ); + FreeDoubleMtx( raw ); + free( map ); + return( val ); +} + +static void tab2space( char *s ) // nen no tame +{ + while( *s ) + { + if( *s == '\t' ) *s = ' '; + s++; + } +} + +static int readasubalignment( char *s, int *t, int *preservegaps ) +{ + int v = 0; + char status = 's'; + char *pt = s; + *preservegaps = 0; + tab2space( s ); + while( *pt ) + { + if( *pt == ' ' ) + { + status = 's'; + } + else + { + if( status == 's' ) + { + if( *pt == '\n' || *pt == '#' ) break; + status = 'n'; + t[v] = atoi( pt ); + if( t[v] == 0 ) + { + fprintf( stderr, "Format error? Sequences must be specified as 1, 2, 3...\n" ); + exit( 1 ); + } + if( t[v] < 0 ) *preservegaps = 1; + t[v] = abs( t[v] ); + t[v] -= 1; + v++; + } + } + pt++; + } + t[v] = -1; + return( v ); +} + +static int countspace( char *s ) +{ + int v = 0; + char status = 's'; + char *pt = s; + tab2space( s ); + while( *pt ) + { + if( *pt == ' ' ) + { + status = 's'; + } + else + { + if( status == 's' ) + { + if( *pt == '\n' || *pt == '#' ) break; + v++; + status = 'n'; + if( atoi( pt ) == 0 ) + { + fprintf( stderr, "Format error? Sequences should be specified as 1, 2, 3...\n" ); + exit( 1 ); + } + } + } + pt++; + } + return( v ); +} + + +void readsubalignmentstable( int nseq, int **table, int *preservegaps, int *nsubpt, int *maxmempt ) +{ + FILE *fp; + char *line; + int linelen = 1000000; + int nmem; + int lpos; + int i, p; + int *tab01; + + line = calloc( linelen, sizeof( char ) ); + fp = fopen( "_subalignmentstable", "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open _subalignmentstable\n" ); + exit( 1 ); + } + if( table == NULL ) + { + *nsubpt = 0; + *maxmempt = 0; + while( 1 ) + { + fgets( line, linelen-1, fp ); + if( feof( fp ) ) break; + if( line[strlen(line)-1] != '\n' ) + { + fprintf( stderr, "too long line? \n" ); + exit( 1 ); + } + if( line[0] == '#' ) continue; + if( atoi( line ) == 0 ) continue; + nmem = countspace( line ); + if( nmem > *maxmempt ) *maxmempt = nmem; + (*nsubpt)++; + } + } + else + { + tab01 = calloc( nseq, sizeof( int ) ); + for( i=0; i nseq-1 ) + { + fprintf( stderr, "Sequence %d does not exist in the input sequence file.\n", p+1 ); + exit( 1 ); + } + } + lpos++; + } + free( tab01 ); + } + fclose( fp ); + free( line ); +} + + +void readmccaskill( FILE *fp, RNApair **pairprob, int length ) +{ + char gett[1000]; + int *pairnum; + int i; + int left, right; + double prob; + int c; + + pairnum = (int *)calloc( length, sizeof( int ) ); + for( i=0; i' || c == EOF ) + { + break; + } + fgets( gett, 999, fp ); +// fprintf( stderr, "gett = %s\n", gett ); + sscanf( gett, "%d %d %lf", &left, &right, &prob ); + + if( left >= length || right >= length ) + { + fprintf( stderr, "format error in hat4 - 2\n" ); + exit( 1 ); + } + + if( prob < 0.01 ) continue; // 080607, mafft ni dake eikyou + + if( left != right && prob > 0.0 ) + { + pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) ); + pairprob[left][pairnum[left]].bestscore = prob; + pairprob[left][pairnum[left]].bestpos = right; + pairnum[left]++; + pairprob[left][pairnum[left]].bestscore = -1.0; + pairprob[left][pairnum[left]].bestpos = -1; +// fprintf( stderr, "%d-%d, %f\n", left, right, prob ); + + pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) ); + pairprob[right][pairnum[right]].bestscore = prob; + pairprob[right][pairnum[right]].bestpos = left; + pairnum[right]++; + pairprob[right][pairnum[right]].bestscore = -1.0; + pairprob[right][pairnum[right]].bestpos = -1; +// fprintf( stderr, "%d-%d, %f\n", right, left, prob ); + } + } + free( pairnum ); +} + +void readpairfoldalign( FILE *fp, char *s1, char *s2, char *aln1, char *aln2, int q1, int q2, int *of1, int *of2, int sumlen ) +{ + char gett[1000]; + int *maptoseq1; + int *maptoseq2; + char dumc; + int dumi; + char sinseq[100], sinaln[100]; + int posinseq, posinaln; + int alnlen; + int i; + int pos1, pos2; + char *pa1, *pa2; + char qstr[1000]; + + *of1 = -1; + *of2 = -1; + + maptoseq1 = AllocateIntVec( sumlen+1 ); + maptoseq2 = AllocateIntVec( sumlen+1 ); + + posinaln = 0; // foldalign ga alingment wo kaesanaitok no tame. + + while( !feof( fp ) ) + { + fgets( gett, 999, fp ); + if( !strncmp( gett, "; ALIGNING", 10 ) ) break; + } + sprintf( qstr, "; ALIGNING %d against %d\n", q1+1, q2+1 ); + if( strcmp( gett, qstr ) ) + { + fprintf( stderr, "Error in FOLDALIGN\n" ); + fprintf( stderr, "qstr = %s, but gett = %s\n", qstr, gett ); + exit( 1 ); + } + + while( !feof( fp ) ) + { + fgets( gett, 999, fp ); + if( !strncmp( gett, "; --------", 10 ) ) break; + } + + + while( !feof( fp ) ) + { + fgets( gett, 999, fp ); + if( !strncmp( gett, "; ********", 10 ) ) break; +// fprintf( stderr, "gett = %s\n", gett ); + sscanf( gett, "%c %c %s %s %d %d", &dumc, &dumc, sinseq, sinaln, &dumi, &dumi ); + posinaln = atoi( sinaln ); + posinseq = atoi( sinseq ); +// fprintf( stderr, "posinseq = %d\n", posinseq ); +// fprintf( stderr, "posinaln = %d\n", posinaln ); + maptoseq1[posinaln-1] = posinseq-1; + } + alnlen = posinaln; + + while( !feof( fp ) ) + { + fgets( gett, 999, fp ); + if( !strncmp( gett, "; --------", 10 ) ) break; + } + + while( !feof( fp ) ) + { + fgets( gett, 999, fp ); + if( !strncmp( gett, "; ********", 10 ) ) break; +// fprintf( stderr, "gett = %s\n", gett ); + sscanf( gett, "%c %c %s %s %d %d", &dumc, &dumc, sinseq, sinaln, &dumi, &dumi ); + posinaln = atof( sinaln ); + posinseq = atof( sinseq ); +// fprintf( stderr, "posinseq = %d\n", posinseq ); +// fprintf( stderr, "posinaln = %d\n", posinaln ); + maptoseq2[posinaln-1] = posinseq-1; + } + if( alnlen != posinaln ) + { + fprintf( stderr, "Error in foldalign?\n" ); + exit( 1 ); + } + + pa1 = aln1; + pa2 = aln2; + for( i=0; i -1 ) + *pa1++ = s1[pos1]; + else + *pa1++ = '-'; + + if( pos2 > -1 ) + *pa2++ = s2[pos2]; + else + *pa2++ = '-'; + } + *pa1 = 0; + *pa2 = 0; + + *of1 = 0; + for( i=0; i -1 ) break; + } + *of2 = 0; + for( i=0; i -1 ) break; + } + +// fprintf( stderr, "*of1=%d, aln1 = :%s:\n", *of1, aln1 ); +// fprintf( stderr, "*of2=%d, aln2 = :%s:\n", *of2, aln2 ); + + free( maptoseq1 ); + free( maptoseq2 ); +} + +int myatoi( char *in ) +{ + if( in == NULL ) + { + fprintf( stderr, "Error in myatoi()\n" ); + exit( 1 ); + } + return( atoi( in ) ); +} + +unsigned long long myatoll( char *in ) +{ + if( in == NULL ) + { + fprintf( stderr, "Error in myatoi()\n" ); + exit( 1 ); + } + + unsigned long long tanni; + + if( strchr( in, 'G' ) ) tanni = 1000 * 1000 * 1000; + else if( strchr( in, 'M' ) ) tanni = 1000 * 1000; + else if( strchr( in, 'k' ) ) tanni = 1000; + else tanni = 1; + + return( tanni * atoi( in ) ); +} + + +double myatof( char *in ) +{ + if( in == NULL ) + { + fprintf( stderr, "Error in myatof()\n" ); + exit( 1 ); + } + return( atof( in ) ); +} + +void reporterr( const char *str, ... ) +{ +// static int loglen = 0; + va_list args; + + if( gmsg ) + { +# if 1 // ato de sakujo + static FILE *errtmpfp = NULL; + if( errtmpfp == NULL ) + errtmpfp = fopen( "maffterr", "w" ); + else + errtmpfp = fopen( "maffterr", "a" ); + va_start( args, str ); + vfprintf( errtmpfp, str, args ); + va_end( args ); + fclose( errtmpfp ); +#endif + +#if 0 + char *tmpptr; + tmpptr = (char *)realloc( *gmsg, (loglen+10000) * sizeof( char ) ); + if( tmpptr == NULL ) + { + fprintf( stderr, "Cannot relloc *gmsg\n" ); + exit( 1 ); + } + *gmsg = tmpptr; + va_start( args, str ); + loglen += vsprintf( *gmsg + loglen, str, args ); + va_end( args ); + + + va_start( args, str ); + loglen += vsprintf( *gmsg + loglen, str, args ); + va_end( args ); + *(*gmsg + loglen) = 0; + if( loglen > gmsglen - 100 ) loglen = 0; // tekitou +#endif + + } + else + { + va_start( args, str ); + vfprintf( stderr, str, args ); + va_end( args ); +// fflush( stderr ); // iru? + } + return; +} + + +#if !defined(mingw) && !defined(_MSC_VER) +void setstacksize(rlim_t kStackSize ) +{ +// const rlim_t kStackSize = 100 * 1024 * 1024; // min stack size = 10MB + struct rlimit rl; + int result; + rlim_t originalsize; + + result = getrlimit(RLIMIT_STACK, &rl); + if (result == 0) + { + originalsize = rl.rlim_cur; + if (rl.rlim_cur < kStackSize) + { + rl.rlim_cur = kStackSize; + reporterr( "stacksize: %d kb->%d kb\n", originalsize/1024, rl.rlim_cur/1024 ); + result = setrlimit(RLIMIT_STACK, &rl); + if (result != 0) + { + reporterr( "Warning: Failed to extend stack size. It's ok in most cases but there may be problems in --pileup and --chainedtree.\n" ); + } + } + else + reporterr( "stacksize: %d kb\n", rl.rlim_cur / 1024 ); + } + else + reporterr( "Warning: Cannot check stack size.\n" ); +} +#endif + +void treeout_bin( FILE *fp, int n, int ***topol, double **len, Treedep *dep, int *nfilesfornode ) +// dep ha nakutemo topol kara saigen dekiru. +{ + + int i; + char c = '\n'; + for( i=0; i%s\"\n", name[i]+1 ); + reporterr( "Format has to be \">n0=1000 n1=51 n2=2 sequencename\"\n" ); + exit( 1 ); + } + + //reporterr( "tmp[0] = %s\n", tmp[0] ); + //reporterr( "tmp[1] = %s\n", tmp[1] ); + //reporterr( "tmp[2] = %s\n", tmp[2] ); + + w[i] = atof( tmp[0] ); + + if( w[i] == 0.0 ) + { + reporterr( "Error in reading \">%s\". n0=0?\n", name[i]+1 ); + reporterr( "Format has to be \">n0=1000 n1=51 n2=2 sequencename\"\n" ); + exit( 1 ); + } + + w[i] = 1.0 / atof( tmp[0] ); + + if( w[i] == 0.0 || w[i] > 1.0 ) + { + reporterr( "Warning: weight for \">%s\" is %f\n", name[i]+1, w[i] ); + } + //reporterr( "w[%d] = %f\n", i, w[i] ); + } +} + +#if 0 +#include +#include + +void use_getrusage(void) +{ + struct rusage r; + if (getrusage(RUSAGE_SELF, &r) != 0) { + /*Failure*/ + } + fprintf(stderr, "\nmaxrss = %ld MB\n", r.ru_maxrss/1000); +} + +#endif + +void commongappick( int nseq, char **seq ) +{ + int i, j, count; + int len = strlen( seq[0] ); +#if 1 + + int *mapfromnewtoold; + + + mapfromnewtoold = calloc( len+1, sizeof( int ) ); + + for( i=0, count=0; i<=len; i++ ) + { + for( j=0; ji), &(((*extanch)+size)->j), &(((*extanch)+size)->starti), &(((*extanch)+size)->endi), &(((*extanch)+size)->startj), &(((*extanch)+size)->endj), &(((*extanch)+size)->score) ); +// reporterr( "i=%d, j=%d, %d-%d, %d-%d, score=%d\n", (*extanch)[size].i, (*extanch)[size].j, (*extanch)[size].starti, (*extanch)[size].endi, (*extanch)[size].startj, (*extanch)[size].endj, (*extanch)[size].score ); + + ((*extanch)+size)->i -= 1; // 1-origin -> 0-origin + ((*extanch)+size)->j -= 1; // 1-origin -> 0-origin + ((*extanch)+size)->starti -= 1; + ((*extanch)+size)->startj -= 1; + ((*extanch)+size)->endi -= 1; + ((*extanch)+size)->endj -= 1; + + if( (*extanch)[size].i >= nseq || (*extanch)[size].j >= nseq ) + { + reporterr( "\nOut of range? The input file has %d sequences but pair %d-%d was specified in line %d.\nNote that sequence IDs are counted from 1.\n", nseq, (*extanch)[size].i+1, (*extanch)[size].j+1, lineno ); + exit( 1 ); + } + if( (*extanch)[size].i >= (*extanch)[size].j ) + { + reporterr( "\nFormat problem? \"%d %d\" in line %d.\nThe sequence id of the first column must be less than the second.\n", (*extanch)[size].i+1, (*extanch)[size].j+1, lineno ); + exit( 1 ); + } + if( (*extanch)[size].starti > nogaplen[(*extanch)[size].i] ) + { + reporterr( "\nOut of range? len(seq%d)=%d, but anchor=%d in line %d.\nNote that position is counted from 1.\n", (*extanch)[size].i+1, nogaplen[(*extanch)[size].i], (*extanch)[size].starti+1, lineno ); + exit( 1 ); + } + if( (*extanch)[size].startj > nogaplen[(*extanch)[size].j] ) + { + reporterr( "\nOut of range? len(seq%d)=%d, but anchor=%d in line %d.\nNote that position is counted from 1.\n", (*extanch)[size].j, nogaplen[(*extanch)[size].j]+1, (*extanch)[size].startj+1, lineno ); + exit( 1 ); + } + + size++; + (*extanch)[size].i = (*extanch)[size].j = -1; + + } + fclose( fp ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/iteration.c b/mafft/src/mafft-7.487-with-extensions/core/iteration.c new file mode 100644 index 0000000000..f16aed99ae --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/iteration.c @@ -0,0 +1,412 @@ + /* iteration ( algorithm C ) */ +#include "mltaln.h" + +#define DEBUG 0 + +static void Writeoptions( FILE *fp ) +{ + if( scoremtx == 1 ) + fprintf( fp, "Dayhoff( ... )\n" ); + else if( scoremtx == -1 ) + fprintf( fp, "DNA\n" ); + else if( scoremtx == 2 ) + fprintf( fp, "Miyata-Yasunaga\n" ); + else + fprintf( fp, "JTT %dPAM\n", pamN ); + + if( scoremtx == 0 ) + fprintf( fp, "Gap Penalty = %+d, %+d\n", penalty, offset ); + else + fprintf( fp, "Gap Penalty = %+d\n", penalty ); + + fprintf( fp, "marginal score to search : best - %f\n", cut ); + if( scmtd == 3 ) + fprintf( fp, "score of rnd or sco\n" ); + else if( scmtd == 4 ) + fprintf( fp, "score = sigma( score for a pair of homologous amino acids ) / ( number of amino acids pairs )\n" ); + else if( scmtd == 5 ) + fprintf( fp, "score : SP\n" ); + if( mix ) + fprintf( fp, "?\n" ); + else + { + if( weight == 2 ) + fprintf( fp, "weighted, geta2 = %f\n", geta2 ); + else if( weight == 3 ) + { + if( scmtd == 4 ) + fprintf( fp, "reversely weighted in function 'align', unweighted in function 'score_calc'\n" ); + else + fprintf( fp, "weighted like ClustalW," ); + } + else + fprintf( fp, "unweighted\n" ); + } + if( weight && utree ) + { + fprintf( fp, "using tree defined by the file hat2 with simplified UPG method\n" ); + } + if( weight && !utree ) + fprintf( fp, "using temporary tree by simplified UPG method\n" ); + fprintf( fp, "Algorithm %c\n", alg ); +} + + + + +char **align0( double *wm, char **aseq, char *seq, double effarr[M], int icyc, int ex ) +{ + char **result; + + if( alg == 'B' ) + { + ErrorExit( "Sorry!" ); + /* + if( outgap == 0 ) + { + result = alignm1_o( wm, aseq, seq, scmx, effarr, icyc, ex ); + } + if( outgap == 1 ) + { + result = alignm1( wm, aseq, seq, scmx, effarr, icyc, ex ); + } + */ + } + else if( alg == 'C' ) + { + result = Calignm1( wm, aseq, seq, effarr, icyc, ex ); + } + return( result ); +} + + +double score_m_1_0( char **aseq, int locnjob, int s, double **eff, double effarr[M] ) +{ + double x; + + if( alg == 'B' ) + { + ErrorExit( "Sorry!" ); + } + if( alg == 'C' ) + { + x = Cscore_m_1( aseq, locnjob, s, eff ); + } + fprintf( stderr, "in score_m_1_0 %f\n", x ); + return( x ); +} + +int iteration( int locnjob, char name[M][B], int nlen[M], char **aseq, char **bseq, int ***topol, double **len, double **eff ) +{ + double tscore, mscore; + int identity; + static char *mseq1, **mseq2 = NULL; + static char **result; + int i, l; + static double effarr[M]; + int s; + int sss[2]; + char ou; + int alloclen; + int resultlen; + int nlenmax0 = nlenmax; + FILE *prep; + char sai[M]; + char sai1[M]; + char sai2[M]; +#if 0 + double his[2][M][MAXITERATION/locnjob+1]; +#else + double ***his; +#endif + int cyc[2]; + char shindou = 0; + double wm; + int returnvalue; + + for( i=0; i nlenmax ) + nlenmax = strlen( aseq[0] ); + + /* + s = ( int )( rnd() * locnjob ); + s++; + if( s == locnjob ) s = 0; + ou = 0; + */ + if( ou == 0 ) + { + ou = 1; + s = sss[0]; + /* + sss[0]++; + if( sss[0] == locnjob ) + { + sss[0] = 0; + cyc[0]++; + } + */ + sss[0]--; + if( sss[0] == -1 ) + { + sss[0] = locnjob-1; + cyc[0]++; + } + } + else + { + ou = 0; + s = sss[1]; + sss[1]++; + if( sss[1] == locnjob ) + { + sss[1] = 0; + cyc[1]++; + } + } + fprintf( trap_g, "%d ", weight ); + +/* + for( i=0, count=0; i alloclen ) + { + if( resultlen > nlenmax0*3 || resultlen > N ) + { + fprintf(stderr, "Error in main1\n"); + exit( 1 ); + } + FreeTmpSeqs( mseq2, mseq1 ); + alloclen = strlen( result[0] ) * 2.0; + fprintf( stderr, "\n\ntrying to allocate TmpSeqs\n\n" ); + AllocateTmpSeqs( &mseq2, &mseq1, alloclen ); + } + for( i=0; i=s; i-- ) strcpy( mseq2[i+1], mseq2[i] ); + strcpy( mseq2[s], mseq1 ); + if( checkC ) + { + tmpscore1= score_m_1_0( mseq2, locnjob, s, eff, effarr ); + fprintf( stderr, "pick up %d, before ALIGNM1 score_m_1_0 = %f\n", s+1, tmpscore ); + fprintf( stderr, "pick up %d, after ALIGNM1 score_m_1_0 = %f\n", s+1, tmpscore1 ); + if( tmpscore1 < tmpscore ) + { + fprintf( stderr, "\7" ); + fprintf( trap_g, ">>>>>>>n\n" ); + } + if( fabs( wm - tmpscore1 ) / wm > 0.001 ) + { + fprintf( stderr, "\7sorry\n" ); + exit( 1 ); + } + } + + identity = !strcmp( mseq2[s], aseq[s] ); + if( s == locnjob - 1 ) ss = 0; else ss=s+1; + + identity *= !strcmp( mseq2[ss], aseq[ss] ); + + if( !identity ) + { + tmpscore = score_calc0( mseq2, locnjob, eff, s ); + } + else tmpscore = tscore; + + if( disp ) + { + fprintf( stderr, "% 3d % 3d / the rest \n", l+1, s+1 ); + display( mseq2, locnjob ); + } + fprintf( stderr, "% 3d % 3d / the rest \n", l+1, s+1 ); + fprintf( stderr, "score = %f mscore = %f ", tmpscore, mscore ); + + fprintf( trap_g, "%#4d %#4d / the rest ", l+1, s+1 ); + fprintf( trap_g, "score = %f mscore = %f ", tmpscore, mscore ); + + if( identity ) + { + fprintf( stderr, "( identical )\n" ); + fprintf( trap_g, "( identical )\n" ); + sai[s] = 2; + } + + else if( tmpscore > mscore - cut ) + { + fprintf( stderr, "accepted\n" ); + fprintf( trap_g, "accepted\n" ); + for( i=0; i mscore ) + { + for( i=0; i %f\n", mscore ); + strcpy( sai, sai1 ); /* kokoka ? */ +#if 0 + if( !tbitr && !tbweight ) + { prep = fopen( "best", "w" ); + Write( prep, locnjob, name, nlen, bseq ); + fclose( prep ); + } +#endif + } + } + + else + { + if( tmpscore == tscore ) + { + fprintf( stderr, "occational coincidence \n" ); + fprintf( trap_g, "occational coincidence\n" ); + } + else + { + fprintf( stderr, "rejected\n" ); + fprintf( trap_g, "rejected\n" ); + } + for( i=0; i0; i-- ) + { + if( tmpscore == his[ou][s][i] ) + { + shindou = 1; + break; + } + } + fprintf( stderr, "\n" ); + if( shindou == 1 ) + { + returnvalue = -1; + fprintf( trap_g, "oscillating\n" ); + break; + } + } + if( l == MAXITERATION ) returnvalue = -2; + FreeDoubleCub( his ); + return( returnvalue ); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft-distance.c b/mafft/src/mafft-7.487-with-extensions/core/mafft-distance.c new file mode 100644 index 0000000000..c5b97f19b7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft-distance.c @@ -0,0 +1,421 @@ +#include "mltaln.h" +#include "mtxutl.h" + +#define DEBUG 0 +#define TEST 0 + +#define END_OF_VEC -1 + +static char outputformat; +#define PLENFACA 0.01 +#define PLENFACB 10000 +#define PLENFACC 10000 +#define PLENFACD 0.1 +#define DLENFACA 0.01 +#define DLENFACB 2500 +#define DLENFACC 2500 +#define DLENFACD 0.1 + +void arguments( int argc, char *argv[] ) +{ + int c; + + inputfile = NULL; + outputformat = 's'; + scoremtx = 1; + nblosum = 62; + dorp = NOTSPECIFIED; + nadd = 0; + alg = 'X'; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + nadd = myatoi(*++argv); + if( nadd == 0 ) + { + fprintf( stderr, "nadd = %d?\n", nadd ); + exit( 1 ); + } + --argc; + goto nextoption; + case 'p': + outputformat = 'p'; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( inputfile == NULL ) + { + argc--; + inputfile = *argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + } + if( argc != 0 ) + { + fprintf( stderr, "Usage: mafft-distance [-PD] [-i inputfile] inputfile > outputfile\n" ); + exit( 1 ); + } +} + +void seq_grp_nuc( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 4 ) + *grp++ = tmp; + else + fprintf( stderr, "WARNING : Unknown character %c\r", *(seq-1) ); + } + *grp = END_OF_VEC; + if( grp - grpbk < 6 ) + { + fprintf( stderr, "\n\nWARNING: Too short.\nPlease also consider use mafft-ginsi, mafft-linsi or mafft-ginsi.\n\n\n" ); +// exit( 1 ); + *grpbk = -1; + } +} + +void seq_grp( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 6 ) + *grp++ = tmp; + else + fprintf( stderr, "WARNING : Unknown character %c\r", *(seq-1) ); + } + *grp = END_OF_VEC; + if( grp - grpbk < 6 ) + { + fprintf( stderr, "\n\nWARNING: Too short.\nPlease also consider use mafft-ginsi, mafft-linsi or mafft-ginsi.\n\n\n" ); +// exit( 1 ); + *grpbk = -1; + } +} + +void makecompositiontable_p( short *table, int *pointt ) +{ + int point; + + while( ( point = *pointt++ ) != END_OF_VEC ) + table[point]++; +} + +static int localcommonsextet_p( short *table, int *pointt ) +{ + int value = 0; + short tmp; + int point; + static short *memo = NULL; + static int *ct = NULL; + static int *cp; + + if( *pointt == -1 ) + return( 0 ); + + if( !memo ) + { + memo = (short *)calloc( tsize, sizeof( short ) ); + if( !memo ) ErrorExit( "Cannot allocate memo\n" ); + ct = (int *)calloc( MIN( maxl, tsize)+1, sizeof( int ) ); + if( !ct ) ErrorExit( "Cannot allocate memo\n" ); + } + + cp = ct; + while( ( point = *pointt++ ) != END_OF_VEC ) + { + tmp = memo[point]++; + if( tmp < table[point] ) + value++; + if( tmp == 0 ) *cp++ = point; +// fprintf( stderr, "cp - ct = %d (tsize = %d)\n", cp - ct, tsize ); + } + *cp = END_OF_VEC; + + cp = ct; + while( *cp != END_OF_VEC ) + memo[*cp++] = 0; + + return( value ); +} + +void makepointtable_nuc( int *pointt, int *n ) +{ + int point; + register int *p; + + if( *n == -1 ) + { + *pointt = -1; + return; + } + + p = n; + point = *n++ * 1024; + point += *n++ * 256; + point += *n++ * 64; + point += *n++ * 16; + point += *n++ * 4; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 1024; + point *= 4; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +void makepointtable( int *pointt, int *n ) +{ + int point; + register int *p; + + if( *n == -1 ) + { + *pointt = -1; + return; + } + + p = n; + point = *n++ * 7776; + point += *n++ * 1296; + point += *n++ * 216; + point += *n++ * 36; + point += *n++ * 6; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 7776; + point *= 6; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +int main( int argc, char **argv ) +{ + int i, j, initj; + FILE *infp; + char **seq; + int *grpseq; + char *tmpseq; + int **pointt; + static char **name; + static int *nlen; + double *mtxself; + double score; + static short *table1; + double longer, shorter; + double lenfac; + double bunbo; + int norg; + + arguments( argc, argv ); + + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( infp ); +#endif + rewind( infp ); + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + tmpseq = AllocateCharVec( nlenmax+1 ); + seq = AllocateCharMtx( njob, nlenmax+1 ); + grpseq = AllocateIntVec( nlenmax+1 ); + pointt = AllocateIntMtx( njob, nlenmax+1 ); + mtxself = AllocateDoubleVec( njob ); + pamN = NOTSPECIFIED; + name = AllocateCharMtx( njob, B ); + nlen = AllocateIntVec( njob ); + +#if 0 + FRead( infp, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); +#endif + + fclose( infp ); + + constants( njob, seq ); + + + if( nadd ) outputformat = 's'; + norg = njob - nadd; + + if( dorp == 'd' ) tsize = (int)pow( 4, 6 ); + else tsize = (int)pow( 6, 6 ); + + if( dorp == 'd' ) + { + lenfaca = DLENFACA; + lenfacb = DLENFACB; + lenfacc = DLENFACC; + lenfacd = DLENFACD; + } + else + { + lenfaca = PLENFACA; + lenfacb = PLENFACB; + lenfacc = PLENFACC; + lenfacd = PLENFACD; + } + + maxl = 0; + for( i=0; i maxl ) maxl = nlen[i]; + if( dorp == 'd' ) /* nuc */ + { + seq_grp_nuc( grpseq, tmpseq ); + makepointtable_nuc( pointt[i], grpseq ); + } + else /* amino */ + { + seq_grp( grpseq, tmpseq ); + makepointtable( pointt[i], grpseq ); + } + } + fprintf( stderr, "\nCalculating i-i scores ... " ); + for( i=0; i nlen[j] ) + { + longer=(double)nlen[i]; + shorter=(double)nlen[j]; + } + else + { + longer=(double)nlen[j]; + shorter=(double)nlen[i]; + } +// lenfac = 3.0 / ( LENFACA + LENFACB / ( longer + LENFACC ) + shorter / longer * LENFACD ); + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// lenfac = 1.0; +// fprintf( stderr, "lenfac = %f (%.0f,%.0f)\n", lenfac, longer, shorter ); + score = localcommonsextet_p( table1, pointt[j] ); + bunbo = MIN( mtxself[i], mtxself[j] ); + if( outputformat == 'p' ) + { + if( bunbo == 0.0 ) + fprintf( stdout, " %8.6f", 1.0 ); + else + fprintf( stdout, " %8.6f", ( 1.0 - score / bunbo ) * lenfac ); + if( j % 7 == 6 ) fprintf( stdout, "\n" ); + } + else + { + if( bunbo == 0.0 ) + fprintf( stdout, "%d-%d d=%4.2f l=%d,%d\n", i+1, j+1, 1.0, nlen[i], nlen[j] ); + else + fprintf( stdout, "%d-%d d=%4.2f l=%d,%d\n", i+1, j+1, ( 1.0 - score / bunbo ) * lenfac, nlen[i], nlen[j] ); + } +// fprintf( stderr, "##### mtx = %f, mtx[i][0]=%f, mtx[j][0]=%f, bunbo=%f\n", mtx[i][j-i], mtx[i][0], mtx[j][0], bunbo ); +// score = (double)localcommonsextet_p( table1, pointt[j] ); +// fprintf( stdout, "%d-%d d=%4.2f l=%d,%d\n", i+1, j+1, ( 1.0 - score / MIN( mtxself[i], mtxself[j] ) ) * 3, nlen[i], nlen[j] ); + + + } + free( table1 ); + } + + fprintf( stderr, "\n" ); + if( outputformat == 'p' ) fprintf( stdout, "\n" ); + SHOWVERSION; + exit( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.1 b/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.1 new file mode 100644 index 0000000000..a9c96825df --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.1 @@ -0,0 +1,131 @@ +.\" Title: MAFFT-HOMOLOGS +.\" Author: Kazutaka Katoh +.\" Generator: DocBook XSL Stylesheets v1.72.0 +.\" Date: 2007-08-14 +.\" Manual: Mafft Manual +.\" Source: mafft-homologs 2.1 +.\" +.TH "MAFFT\-HOMOLOGS" "1" "2007\-06\-09" "mafft\-homologs 2.1" "Mafft Manual" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +.RS 0 +mafft\-homologs \- aligns sequences together with homologues automatically collected from SwissProt via NCBI BLAST +.RE +.SH "SYNOPSIS" +.RS 0 +\fBmafft\-homologs\fR [\fBoptions\fR] \fIinput\fR [>\ \fIoutput\fR] +.RE +.SH "DESCRIPTION" +.RS 0 +The accuracy of an alignment of a few distantly related sequences is considerably improved when being aligned together with their close homologs. The reason for the improvement is probably the same as that for PSI\-BLAST. That is, the positions of highly conserved residues, those with many gaps and other additional information is brought by close homologs. According to Katoh et al. (2005), the improvement by adding close homologs is 10% or so, which is comparable to the improvement by incorporating structural information of a pair of sequences. Mafft\-homologs in a mafft server works like this: +.sp +.RS 4 +\h'-04' 1.\h'+02'Collect a number (50 by default) of close homologs (E=1e\-10 by default) of the input sequences. +.RE +.sp +.RS 4 +\h'-04' 2.\h'+02'Align the input sequences and homologs all together using the L\-INS\-i strategy. +.RE +.sp +.RS 4 +\h'-04' 3.\h'+02'Remove the homologs. +.RE +.RE +.SH "OPTIONS" +.RS 0 +.PP +\fB\-a\fR \fI\fIn\fR\fR +.RS 4 +The number of collected sequences (default: 50). +.RE +.PP +\fB\-e\fR \fI\fIn\fR\fR +.RS 4 +Threshold value (default: 1e\-10). +.RE +.PP +\fB\-o\fR \fI\fIxxx\fR\fR +.RS 4 +Options for mafft (default: " \-\-op 1.53 \-\-ep 0.123 \-\-maxiterate 1000 --localpair --reorder"). +.RE +.PP +\fB\-l\fR +.RS 4 +Locally carries out BLAST searches instead of NCBI BLAST (requires locally installed BLAST and a database). +.RE +.PP +\fB\-f\fR +.RS 4 +Outputs collected homologues also (default: off). +.RE +.PP +\fB\-w\fR +.RS 4 +entire sequences are subjected to BLAST search (default: well\-aligned region only) +.RE +.RE +.SH "REQUIREMENTS" +.RS 0 +.PP +MAFFT version > 5.58. +.PP +Either of +.RS 4 +.PP +lynx (when remote BLAST server is used) +.PP +BLAST and a protein sequence database (when local BLAST is used) +.RE +.RE +.SH "REFERENCES" +.RS 0 +.PP +Katoh, Kuma, Toh and Miyata (Nucleic Acids Res. 33:511\-518, 2005) MAFFT version 5: improvement in accuracy of multiple sequence alignment. +.RE +.SH "SEE ALSO" +.RS 0 +.PP +\fBmafft\fR(1) +.RE +.SH "AUTHORS" +.RS 0 +.PP +\fBKazutaka Katoh\fR <\&katoh_at_bioreg.kyushu\-u.ac.jp.\&> +.sp -1n +.IP "" 4 +Wrote Mafft. +.PP +\fBCharles Plessy\fR <\&charles\-debian\-nospam@plessy.org\&> +.sp -1n +.IP "" 4 +Wrote this manpage in DocBook XML for the Debian distribution, using Mafft's homepage as a template. +.RE +.SH "COPYRIGHT" +.RS 0 +Copyright \(co 2002\-2007 Kazutaka Katoh (mafft) +.br +Copyright \(co 2007 Charles Plessy (this manpage) +.br +.PP +Mafft and its manpage are offered under the following conditions: +.PP +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +.sp +.RS 4 +\h'-04' 1.\h'+02'Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +.RE +.sp +.RS 4 +\h'-04' 2.\h'+02'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. +.RE +.sp +.RS 4 +\h'-04' 3.\h'+02'The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. +.RE +.PP +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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. +.br +.RE diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.tmpl b/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.tmpl new file mode 100644 index 0000000000..61623f0bfb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft-homologs.tmpl @@ -0,0 +1,505 @@ +#!/usr/bin/env ruby + +localdb = "sp" +# database name from which homologues are collected +# by locally installed blast. Leave this if you do +# not use the '-l' option. + +mafftpath = "_BINDIR/mafft" +# path of mafft. "/usr/local/bin/mafft" +# if mafft is in your command path, "mafft" is ok. + +blastpath = "psiblast" +# path of blastall. +# if blastall is in your command path, "blastall" is ok. + +# mafft-homologs.rb v. 2.1 aligns sequences together with homologues +# automatically collected from SwissProt via NCBI BLAST. +# +# mafft > 5.58 is required +# +# Usage: +# mafft-homologs.rb [options] input > output +# Options: +# -a # the number of collected sequences (default: 50) +# -e # threshold value (default: 1e-10) +# -o "xxx" options for mafft +# (default: " --op 1.53 --ep 0.123 --maxiterate 1000") +# -l locally carries out blast searches instead of NCBI blast +# (requires locally installed blast and a database) +# -f outputs collected homologues also (default: off) +# -w entire sequences are subjected to BLAST search +# (default: well-aligned region only) + +#require 'getopts' +require 'optparse' +require 'tempfile' + +if ENV["MAFFT_BLAST"] && ENV["MAFFT_BLAST"] != "" then + blastpath = ENV["MAFFT_BLAST"] +end + +if ENV["MAFFT_HOMOLOGS_MAFFT"] && ENV["MAFFT_HOMOLOGS_MAFFT"] != "" then + mafftpath = ENV["MAFFT_HOMOLOGS_MAFFT"] +end + +# mktemp +GC.disable +temp_vf = Tempfile.new("_vf").path +temp_if = Tempfile.new("_if").path +temp_pf = Tempfile.new("_pf").path +temp_af = Tempfile.new("_af").path +temp_qf = Tempfile.new("_qf").path +temp_bf = Tempfile.new("_bf").path +temp_rid = Tempfile.new("_rid").path +temp_res = Tempfile.new("_res").path + + +system( mafftpath + " --help > #{temp_vf} 2>&1" ) +pfp = File.open( "#{temp_vf}", 'r' ) +while pfp.gets + break if $_ =~ /MAFFT v/ +end +pfp.close + +if( $_ ) then + mafftversion = $_.sub( /^\D*/, "" ).split(" ").slice(0).strip.to_s +else + mafftversion = "0" +end +if( mafftversion < "5.58" ) then + STDERR.puts "" + STDERR.puts "======================================================" + STDERR.puts "Install new mafft (v. >= 5.58)" + STDERR.puts "======================================================" + STDERR.puts "" + exit +end + +srand ( 0 ) + +def readfasta( fp, name, seq ) + nseq = 0 + tmpseq = "" + while fp.gets + if $_ =~ /^>/ then + name.push( $_.sub(/>/,"").strip ) + seq.push( tmpseq ) if nseq > 0 + nseq += 1 + tmpseq = "" + else + tmpseq += $_.strip + end + end + seq.push( tmpseq ) + return nseq +end + +nadd = 600 +num_alignments = 600 +num_threads_blast = 4 +eval = 1e-1 +local = 0 +fullout = 0 +entiresearch = 1 +corewin = 50 +corethr = 0.3 +#mafftopt = " --op 1.53 --ep 0.123 --localpair --maxiterate 1000 --reorder " +mafftopt = " --op 1.53 --ep 0.0 --globalpair --maxiterate 1000 --reorder " + + +#if getopts( "s", "f", "w", "l", "h", "e:", "a:", "o:", "c:", "d:" ) == nil || ARGV.length == 0 || $OPT_h then +# puts "Usage: #{$0} [-h -l -e# -a# -o\"[options for mafft]\"] input_file" +# exit +#end +params = ARGV.getopts( "sfwlhe:a:o:c:d:n:N:" ) + + +#if $OPT_c then +if params["c"] != nil then + corewin = params["c"].to_i +end + +#if $OPT_d then +#if params["d"] != nil then +# corethr = params["d"].to_f +#end +# +if params["d"] != nil then + localdb = params["d"].to_s +end + +if params["n"] != nil then + num_alignments = params["n"].to_s +end + +if params["N"] != nil then + num_threads_blast = params["N"].to_s +end + +#if $OPT_w +if params["w"] == true then + entiresearch = 1 +end + +#if $OPT_f +if params["f"] == true then + fullout = 1 +end + +#if $OPT_s +if params["s"] == true then + fullout = 0 +end + +#if $OPT_l +if params["l"] == true then + local = 1 +end + +#if $OPT_e then +if params["e"] != nil then +# eval = $OPT_e.to_f + eval = params["e"].to_f +end + +#if $OPT_a then +if params["a"] != nil then + nadd = params["a"].to_i +end + +#if $OPT_o then +if params["o"] != nil then + mafftopt += " " + params["o"] + " " +end + +infn = ARGV[0].to_s.strip + +system "cat " + infn + " > #{temp_if}" +ar = mafftopt.split(" ") +nar = ar.length +for i in 0..(nar-1) + if ar[i] == "--seed" then + system "cat #{ar[i+1]} >> #{temp_if}" + end +end + +if fullout == 0 then + mafftopt += " --excludehomologs " +end + +nseq = 0 +ifp = File.open( "#{temp_if}", 'r' ) + while ifp.gets + nseq += 1 if $_ =~ /^>/ + end +ifp.close + +if nseq >= 10000 then + STDERR.puts "The number of input sequences must be <10000." + exit +elsif nseq == 1 then + system( "cp #{temp_if}" + " #{temp_pf}" ) +else + STDERR.puts "Performing preliminary alignment .. " + if entiresearch == 1 then +# system( mafftpath + " --maxiterate 1000 --localpair #{temp_if} > #{temp_pf}" ) + system( mafftpath + " --maxiterate 0 --retree 2 #{temp_if} > #{temp_pf}" ) + else + system( mafftpath + " --maxiterate 1000 --localpair --core --coreext --corethr #{corethr.to_s} --corewin #{corewin.to_s} #{temp_if} > #{temp_pf}" ) + end +end + +pfp = File.open( "#{temp_pf}", 'r' ) +inname = [] +inseq = [] +slen = [] +act = [] +nin = 0 +nin = readfasta( pfp, inname, inseq ) +for i in 0..(nin-1) + slen.push( inseq[i].gsub(/-/,"").length ) + act.push( 1 ) +end +pfp.close + +pfp = File.open( "#{temp_if}", 'r' ) +orname = [] +orseq = [] +nin = 0 +nin = readfasta( pfp, orname, orseq ) +pfp.close + +allen = inseq[0].length +for i in 0..(nin-2) + for j in (i+1)..(nin-1) + next if act[i] == 0 + next if act[j] == 0 + pid = 0.0 + total = 0 + for a in 0..(allen-1) + next if inseq[i][a,1] == "-" || inseq[j][a,1] == "-" + total += 1 + pid += 1.0 if inseq[i][a,1] == inseq[j][a,1] + end + pid /= total +# puts "#{i.to_s}, #{j.to_s}, #{pid.to_s}" + if pid > 0.5 then + if slen[i] < slen[j] + act[i] = 0 + else + act[j] = 0 + end + end + end +end +#p act + + +afp = File.open( "#{temp_af}", 'w' ) + +STDERR.puts "Searching .. \n" +ids = [] +add = [] +sco = [] +nblast = 0 # ato de tsukau kamo +for i in 0..(nin-1) + singleids = [] + singleadd = [] + + inseq[i].gsub!(/-/,"") + afp.puts ">" + orname[i] + afp.puts orseq[i] + +# afp.puts ">" + inname[i] +# afp.puts inseq[i] + + STDERR.puts "Query (#{i+1}/#{nin})\n" + inname[i] + if act[i] == 0 then + STDERR.puts "Skip.\n\n" + next + end + + if local == 0 then + command = "lynx -source 'https://www.ncbi.nlm.nih.gov/blast/Blast.cgi?QUERY=" + inseq[i] + "&DATABASE=swissprot&HITLIST_SIZE=" + nadd.to_s + "&FILTER=L&EXPECT='" + eval.to_s + "'&FORMAT_TYPE=TEXT&PROGRAM=blastp&SERVICE=plain&NCBI_GI=on&PAGE=Proteins&CMD=Put' > #{temp_rid}" + system command + + ridp = File.open( "#{temp_rid}", 'r' ) + while ridp.gets + break if $_ =~ / RID = (.*)/ + end + ridp.close + rid = $1.strip + STDERR.puts "Submitted to NCBI. rid = " + rid + + STDERR.printf "Waiting " + while 1 + STDERR.printf "." + sleep 10 + command = "lynx -source 'https://www.ncbi.nlm.nih.gov/blast/Blast.cgi?RID=" + rid + "&DESCRIPTIONS=500&ALIGNMENTS=" + nadd.to_s + "&ALIGNMENT_TYPE=Pairwise&OVERVIEW=no&CMD=Get&FORMAT_TYPE=XML' > #{temp_res}" + system command + resp = File.open( "#{temp_res}", 'r' ) +# resp.gets +# if $_ =~ /WAITING/ then +# resp.close +# next +# end + while( resp.gets ) + break if $_ =~ /QBlastInfoBegin/ + end + resp.gets + if $_ =~ /WAITING/ then + resp.close + next + else + resp.close + break + end + end + else +# puts "Not supported" +# exit + qfp = File.open( "#{temp_qf}", 'w' ) + qfp.puts "> " + qfp.puts inseq[i] + qfp.close + command = blastpath + " -num_iterations 2 -num_threads #{num_threads_blast} -evalue #{eval} -num_alignments #{num_alignments} -outfmt 5 -query #{temp_qf} -db #{localdb} > #{temp_res}" + system command +# system "cp #{temp_res} _res" + end + STDERR.puts " Done.\n\n" + + resp = File.open( "#{temp_res}", 'r' ) + hitnum = 0 + lasteval = "nohit" + + while resp.gets + break if $_ =~ /2<\/Iteration_iter-num>/ + end + + if $_ == nil then + STDERR.puts "no hit" + else + while 1 + while resp.gets + break if $_ =~ /(.*)<\/Hit_id>/ || $_ =~ /()/ + end + id = $1 + break if $_ =~ // + # p id + + starthit = 9999999 + endhit = -1 + startquery = 9999999 + endquery = -1 + target = "" + score = 0.0 + + while line = resp.gets + if line =~ /(.*)<\/Hsp_hit-from>/ + starthitcand=$1.to_i + elsif line =~ /(.*)<\/Hsp_hit-to>/ + endhitcand=$1.to_i + elsif line =~ /(.*)<\/Hsp_query-from>/ + startquerycand=$1.to_i + elsif line =~ /(.*)<\/Hsp_query-to>/ + endquerycand=$1.to_i + elsif $_ =~ /(.*)<\/Hsp_hseq>/ + targetcand = $1.sub( /-/, "" ).sub( /U/, "X" ) + elsif line =~ /(.*)<\/Hsp_bit-score>/ + scorecand=$1.to_f + elsif line =~ /(.*)<\/Hsp_evalue>/ + evalcand=$1.to_s + elsif line =~ /<\/Hsp>/ + if endhit == -1 then + starthit = starthitcand + endhit= endhitcand + startquery = startquerycand + endquery= endquerycand + target = targetcand + score = scorecand + lasteval = evalcand + else + # if endhit <= endhitcand && endquery <= endquerycand then + if endhit <= starthitcand && endquery <= startquerycand then + endhit = endhitcand + endquery = endquerycand + target = target + "XX" + targetcand + score = score + scorecand + end + # if starthitcand <= starthit && startquerycand <= startquery then + if endhitcand <= starthit && endquerycand <= startquery then + starthit = starthitcand + startquery = startquerycand + target = targetcand + "XX" + target + score = score + scorecand + end + end + elsif line =~ /<\/Hit>/ + hitnum = hitnum + 1 + break; + end + end + + singleids.push( id ) + singleadd.push( target ) + + known = ids.index( id ) + if known != nil then + if sco[known] >= score then + next + else + ids.delete_at( known ) + add.delete_at( known ) + sco.delete_at( known ) + end + end + ids.push( id ) + sco.push( score ) + add.push( target ) + + end + resp.close + end + + n = singleids.length + outnum = 0 + + totalprob = 0 + prob = [] + for m in 0..(n-1) +# prob[m] = 1.0 / population[eclass[m]] + prob[m] = 1.0 + totalprob += prob[m] + end +# puts "" + for m in 0..(n-1) + prob[m] /= (totalprob) + prob[m] *= (nadd.to_f / nin.to_f) + prob[m] = 1 if prob[m] > 1 + end + + + for m in 0..(n-1) + if rand( 1000000 ).to_f/1000000 < prob[m] then +# STDERR.puts "hit in " + m.to_s + afp.puts ">_addedbymaffte_" + singleids[m] + afp.puts singleadd[m] + end + end +end +afp.close + +STDERR.puts "Aligning .. " +system( mafftpath + mafftopt + "#{temp_af} > #{temp_bf}" ) +STDERR.puts "done." + +bfp = File.open( "#{temp_bf}", 'r' ) +outseq = [] +outnam = [] +readfasta( bfp, outnam, outseq ) +bfp.close + +outseq2 = [] +outnam2 = [] + +len = outseq.length +for i in 0..(len-1) +# p outnam[i] + if fullout == 0 && outnam[i] =~ /_addedbymaffte_/ then + next + end + outseq2.push( outseq[i] ) + outnam2.push( outnam[i].sub( /_addedbymaffte_/, "_ho_" ) ) +end + +nout = outseq2.length +len = outseq[0].length +p = len +while p>0 + p -= 1 + allgap = 1 + for j in 0..(nout-1) + if outseq2[j][p,1] != "-" then + allgap = 0 + break + end + end + if allgap == 1 then + for j in 0..(nout-1) + outseq2[j][p,1] = "" + end + end +end +for i in 0..(nout-1) + puts ">" + outnam2[i] + puts outseq2[i].gsub( /.{1,60}/, "\\0\n" ) +end + + +system( "rm -rf #{temp_if} #{temp_vf} #{temp_af} #{temp_bf} #{temp_pf} #{temp_qf} #{temp_res} #{temp_rid}" ) +#system( "cp #{temp_if} #{temp_vf} #{temp_af} #{temp_bf} #{temp_pf} #{temp_qf} #{temp_res} #{temp_rid} ." ) +if File.exist?( "#{temp_af}.tree" ) then + system( "sed 's/_addedbymaffte_/_ho_/' #{temp_af}.tree > #{ARGV[0].to_s}.tree" ) + system( "rm #{temp_af}.tree" ) +end diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft-profile.c b/mafft/src/mafft-7.487-with-extensions/core/mafft-profile.c new file mode 100644 index 0000000000..8bc63496a2 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft-profile.c @@ -0,0 +1,510 @@ +#include "mltaln.h" + +#define DEBUG 0 + +#if DEBUG +#include +#include +#include +double getrusage_sec() +{ + struct rusage t; + struct timeval tv; + getrusage(RUSAGE_SELF, &t); + tv = t.ru_utime; + return tv.tv_sec + (double)tv.tv_usec*1e-6; +} +#endif + + +int intcmp( int *str1, int *str2 ) +{ + while( *str1 != -1 && *str2 != -1 ) + if( *str1++ != *str2++ ) return( 1 ); + if( *str1 != *str2 ) return( 1 ); + return( 0 ); +} + +char **arguments( int argc, char *argv[] ) +{ + int c = 0; + + fmodel = 0; + nblosum = 62; + calledByXced = 0; + devide = 0; + fftscore = 1; + use_fft = 1; + nevermemsave = 0; + alg = 'A'; + weight = 0; + utree = 1; + tbutree = 0; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 0; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + scoremtx = 1; + dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + poffset = 0; // chokusetsu yobareru kara + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + TMorJTT = JTT; + treemethod = 'x'; + + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'P': + dorp = 'p'; + break; + case 'D': + dorp = 'd'; + break; + case 'F': + use_fft = 1; + break; + case 'N': + use_fft = 0; + break; + case 'n': + nevermemsave = 1; + break; + case 'e': + fftscore = 0; + break; + case 'Q': + alg = 'Q'; + break; + case 'A': + alg = 'A'; + break; + case 'M': + alg = 'M'; + break; + case 'd': + disp = 1; + break; + case 'O': + outgap = 0; + break; + case 'a': + fmodel = 1; + break; + case 'u': + tbrweight = 0; + break; + case 'U': + tbrweight = -1; + break; + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; + fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "tm %d\n", pamN ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 2 ) + { + fprintf( stderr, "options: Check source file ! %c ?\n", c ); + exit( 1 ); + } + fprintf( stderr, "tbitr = %d, tbrweight = %d, tbweight = %d\n", tbitr, tbrweight, tbweight ); +// readOtherOptions( &ppid, &fftThreshold, &fftWinSize ); + return( argv ); + +} + +void GroupAlign( int nseq1, int nseq2, char **name, int *nlen, char **seq, char **aseq, char **mseq1, char **mseq2, int ***topol, double **len, double *eff, int alloclen ) +{ + int i; + int clus1, clus2; + int s1, s2; + double pscore; + static char **name1, **name2; + double *effarr = eff; + double *effarr1 = NULL; + double *effarr2 = NULL; + static char *indication1, *indication2; +// double dumfl = 0.0; + double dumdb = 0.0; + int intdum; +#if DEBUG + double time1, time2; +#endif + + +// fprintf( stderr, "in GroupAlign fftWinSize = %d\n", fftWinSize ); +// fprintf( stderr, "in GroupAlign fftThreshold = %d\n", fftThreshold ); + + if( effarr1 == NULL ) + { + name1 = AllocateCharMtx( nseq1, B ); + name2 = AllocateCharMtx( nseq2, B ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); +#if 0 +#else +#endif + } + + for( i=0; i 0 ) pscore = AllocateDoubleMtx( njob, njob ); + eff = AllocateDoubleVec( njob ); + +#if 0 + njob=nseq2; FRead( gp2, name+nseq1, nlen+nseq1, seq2 ); + njob=nseq1; FRead( gp1, name, nlen, seq1 ); +#else + njob=nseq2; readDataforgaln( gp2, name+nseq1, nlen+nseq1, seq2 ); + njob=nseq1; readDataforgaln( gp1, name, nlen, seq1 ); +#endif + njob = nseq1 + nseq2; + + +#if 0 // CHUUI + commongappick( nseq1, seq1 ); + commongappick( nseq2, seq2 ); +#endif + + for( i=0; i 0 ) + { + for( i=0; i 0 ) + { + fprintf( stderr, "Constructing dendrogram ... " ); + if( treemethod == 'x' ) + veryfastsupg( njob, pscore, topol, len ); + else + ErrorExit( "Incorrect tree\n" ); + fprintf( stderr, "done.\n" ); + + weight = 3; + counteff_simple( njob, topol, len, eff ); +// for( i=0; i 30000 || len2 > 30000 ) ) ) +// if( len1 > 30000 || len2 > 30000 ) + { + fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); + alg = 'M'; + } + + + + reporterr( "GroupAglin..\n" ); + + GroupAlign( nseq1, nseq2, name, nlen, seq, aseq, mseq1, mseq2, topol, len, eff, alloclen ); + +#if 0 + writePre( njob, name, nlen, aseq, 1 ); +#else + writeDataforgaln( stdout, njob, name, nlen, aseq ); +#endif + + SHOWVERSION; + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft-sparsecore.tmpl b/mafft/src/mafft-7.487-with-extensions/core/mafft-sparsecore.tmpl new file mode 100644 index 0000000000..dbfc0dc790 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft-sparsecore.tmpl @@ -0,0 +1,358 @@ +#! /usr/bin/env ruby +require 'optparse' + +mafftpath = "_BINDIR/mafft" + +def cleartempfiles( filenames ) + for f in filenames + system( "rm -rf #{f}" ) + end +end + + +seed = 0 +scand = "50%" +npick = 500 +infn = "" +reorderoption = "--reorder" +pickoptions = " --retree 1 " +coreoptions = " --globalpair --maxiterate 100 " +corelastarg = " " +addoptions = " " +directionoptions = " --retree 0 --pileup " +markcore = "" +randompickup = true +outnum = false + +begin + params = ARGV.getopts('m:s:n:p:i:C:L:A:o:MhuD:') +rescue => e + STDERR.puts e + STDERR.puts "See #{$0} -h" + exit 1 +end + +#p params + +mafftpath = params["m"] if params["m"] +seed = params["s"].to_i if params["s"] +scand = params["n"].to_s if params["n"] +npick = params["p"].to_i if params["p"] +infn = params["i"] if params["i"] +#pickoptions += params["P"] if params["P"] +coreoptions += params["C"] if params["C"] # tsuikagaki! +corelastarg += params["L"] if params["L"] # tsuikagaki! +addoptions += params["A"] if params["A"] +directionoptions += params["D"] if params["D"] # tsuikagaki +markcore = "*" if params["M"] +#randompickup = false if params["S"] +reorderoption = "" if params["o"] =~ /^i/ +outnum = true if params["u"] + +if params["h"] then + STDERR.puts "Usage: #{$0} -i inputfile [options]" + STDERR.puts "Options:" + STDERR.puts " -i string Input file." + STDERR.puts " -m string Mafft command. Default: mafft" + STDERR.puts " -s int Seed. Default:0" + STDERR.puts " -n int Number of candidates for core sequences. Default: upper 50% in length" + STDERR.puts " -p int Number of core sequences. Default: 500" +# STDERR.puts " -P \"string\" Mafft options for the PICKUP stage." +# STDERR.puts " Default: \"--retree 1\"" +# STDERR.puts " -S Tree-based pickup. Default: off" + STDERR.puts " -C \"string\" Mafft options for the CORE stage." + STDERR.puts " Default: \"--globalpair --maxiterate 100\"" + STDERR.puts " -A \"string\" Mafft options for the ADD stage." + STDERR.puts " Default: \"\"" + STDERR.puts " -D \"string\" Mafft options for inferring the direction of nucleotide sequences." + STDERR.puts " Default: \"\"" + STDERR.puts " -o r or i r: Reorder the sequences based on similarity. Default" + STDERR.puts " i: Same as input." + exit 1 +end + +if infn == "" then + STDERR.puts "Give input file with -i." + exit 1 +end + + + +pid = $$.to_s +tmpdir = ENV["TMPDIR"] +tmpdir = "/tmp" if tmpdir == nil +tempfiles = [] +tempfiles.push( temp_pf = tmpdir + "/_pf" + pid ) +tempfiles.push( temp_nf = tmpdir + "/_nf" + pid ) +tempfiles.push( temp_cf = tmpdir + "/_cf" + pid ) +tempfiles.push( temp_of = tmpdir + "/_of" + pid ) + +Signal.trap(:INT){cleartempfiles( tempfiles ); exit 1} +at_exit{ cleartempfiles( tempfiles )} + +system "#{mafftpath} --version > #{temp_of} 2>&1" + +fp = File.open( temp_of, "r" ) + line = fp.gets +fp.close + + +versionnum = line.split(' ')[0].sub(/v/,"").to_f + +if versionnum < 7.210 then + STDERR.puts "\n" + STDERR.puts "Please use mafft version >= 7.210\n" + STDERR.puts "\n" + exit +end + +srand( seed ) + +def readfasta( fp, name, seq ) + nseq = 0 + tmpseq = "" + while fp.gets + if $_ =~ /^>/ then + name.push( $_.sub(/>/,"").chop ) + seq.push( tmpseq ) if nseq > 0 + nseq += 1 + tmpseq = "" + else + tmpseq += $_.strip + end + end + seq.push( tmpseq ) + return nseq +end + + + +begin + infp = File.open( infn, "r" ) +rescue => e + STDERR.puts e + exit 1 +end +infp.close + +if directionoptions =~ /--adjustdirection/ then + system( mafftpath + "#{directionoptions} #{infn} > #{temp_of}" ) +else + system( "cp #{infn} #{temp_of}" ) +end + +tname = [] +tseq = [] +infp = File.open( temp_of, "r" ) +tin = readfasta( infp, tname, tseq ) +infp.close +lenhash = {} + +if outnum then + for i in 1..(tin) + tname[i-1] = "_numo_s_0#{i}_numo_e_" + tname[i-1] + end +end + +npick = 0 if npick == 1 +npick = tin if npick > tin + + +if scand =~ /%$/ then + ncand = (tin * scand.to_f * 0.01 ).to_i +else + ncand = scand.to_i +end + +if ncand < 0 || ncand > tin then + STDERR.puts "Error. -n #{scand}?" + exit 1 +end + +ncand = npick if ncand < npick +ncand = tin if ncand > tin + +STDERR.puts "ncand = #{ncand}, npick = #{npick}" + + +sai = [] +for i in 0..(tin-1) + lenhash[i] = tseq[i].gsub(/-/,"").length +end + +i = 0 +sorted = lenhash.sort_by{|key, value| [-value, i+=1]} +#for i in 0..(ncand-1) +# sai[sorted[i][0]] = 1 +#end +#for i in ncand..(tin-1) +# sai[sorted[i][0]] = 0 +#end + +ncandres = 0 +ntsukau = 0 +for i in 0..(tin-1) + cand = sorted[i][0] + if tname[cand] =~ /^_focus_/ then + sai[cand] = 0 + ntsukau += 1 + elsif ncandres < ncand then + unless tname[cand] =~ /^_tsukawanai_/ then + sai[cand] = 1 + ncandres += 1 + else + sai[cand] = 0 + end + else + sai[cand] = 0 + end +end + +if ncandres+ntsukau < npick + STDERR.puts "ncandres = #{ncandres}" + STDERR.puts "ncand = #{ncand}" + STDERR.puts "ntsukau = #{ntsukau}" + STDERR.puts "npick = #{npick}" + STDERR.puts "Too many _tsukawanai_ sequences." + exit 1 +end + +if ntsukau > npick + STDERR.puts "ntsukau = #{ntsukau}" + STDERR.puts "npick = #{npick}" + STDERR.puts "Too many _focus_ sequences." + exit 1 +end + +#p sai +#for i in 0..(tin-1) +# puts sai[i].to_s + " " + tname[i] +#end + +npickrand = npick - ntsukau + +if randompickup + pick = [] + for i in 0..(npickrand-1) + pick[i] = 1 + end + for i in npickrand..(ncandres-1) + pick[i] = 0 + end + pick2 = pick.sort_by{rand} + pick = pick2 +# p pick +# p sai + + ipick = 0 + for i in 0..(tin-1) + if sai[i] == 1 then + if pick[ipick] == 0 then + sai[i] = 0 + end + ipick += 1 + end + end +# p sai + + for i in 0..(tin-1) + if tname[i] =~ /^_focus_/ then + sai[i] = 1 + end + end +# p sai + + pfp = File.open( temp_pf, 'w' ) + nfp = File.open( temp_nf, 'w' ) + + i = 0 + while i < tin + if sai[i] == 1 then + pfp.puts ">" + i.to_s + " " + ">" + markcore + tname[i] + pfp.puts tseq[i] + else + nfp.puts ">" + i.to_s + " " + ">" + tname[i] + nfp.puts tseq[i] + end + i += 1 + end + + nfp.close + pfp.close + +else # yamerukamo + STDERR.puts "Not supported in this version" + exit 1 +end + +if npick > 1 then + if npick < tin then + system( mafftpath + " #{coreoptions} #{temp_pf} #{corelastarg} > #{temp_cf}" ) # add de sort + else + system( mafftpath + " #{coreoptions} #{reorderoption} #{temp_pf} #{corelastarg} > #{temp_cf}" ) # ima sort + end + res = ( File::stat(temp_cf).size == 0 ) +else + system( "cat /dev/null > #{temp_cf}" ) + res = false +end + +if res == true then + STDERR.puts "\n\nError in the core alignment stage.\n\n" + exit 1 +end + + +if npick < tin + system( mafftpath + " #{addoptions} #{reorderoption} --add #{temp_nf} #{temp_cf} > #{temp_of}" ) + res = ( File::stat(temp_of).size == 0 ) +else + system( "cp #{temp_cf} #{temp_of}" ) + res = false +end + +if res == true then + STDERR.puts "\n\nError in the add stage.\n\n" + exit 1 +end + +resname = [] +resseq = [] +resfp = File.open( temp_of, "r" ) +nres = readfasta( resfp, resname, resseq ) +resfp.close + +if reorderoption =~ /--reorder/ then + for i in 0..(nres-1) + puts ">" + resname[i].sub(/^[0-9]* >/,"") + puts resseq[i] + end +else + seqhash = {} + namehash = {} + seqlast = [] + namelast = [] + nlast = 0 + for i in 0..(nres-1) + if resname[i] =~ /^[0-9]* >/ + key = resname[i].split(' ')[0] + seqhash[key] = resseq[i] + namehash[key] = resname[i] + else + seqlast.push( resseq[i] ) + namelast.push( resname[i] ) + nlast += 1 + end + end + for i in 0..(nlast-1) + puts ">" + namelast[i] + puts seqlast[i] + end + for i in 0..(nres-nlast-1) + key = i.to_s + puts ">" + namehash[key].sub(/^[0-9]* >/,"") + puts seqhash[key] + end +end + + diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.1 b/mafft/src/mafft-7.487-with-extensions/core/mafft.1 new file mode 100644 index 0000000000..b5344c5721 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.1 @@ -0,0 +1,479 @@ +.\" Title: MAFFT +.\" Author: Kazutaka Katoh +.\" Generator: DocBook XSL Stylesheets v1.72.0 +.\" Date: 2007-08-14 +.\" Manual: Mafft Manual +.\" Source: mafft 6.240 +.\" +.TH "MAFFT" "1" "2007\-06\-09" "mafft 6.240" "Mafft Manual" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "THIS MANUAL IS FOR V6.2XX (2007)" +Recent versions (v7.1xx; 2013 Jan.) have more features than those described below. +See also the tips page at +http://mafft.cbrc.jp/alignment/software/tips0.html +.SH "NAME" +.RS 0 +.sp +mafft \- Multiple alignment program for amino acid or nucleotide sequences +.RE +.SH "SYNOPSIS" +.RS 0 +.HP 6 +\fBmafft\fR [\fBoptions\fR] \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBlinsi\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBginsi\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBeinsi\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 7 +\fBfftnsi\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBfftns\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 5 +\fBnwns\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBnwnsi\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 14 +\fBmafft\-profile\fR \fIgroup1\fR \fIgroup2\fR [>\ \fIoutput\fR] +.HP +.sp +\fIinput\fR, \fIgroup1\fR and \fIgroup2\fR must be in FASTA format. +.RE +.SH "DESCRIPTION" +.RS 0 +\fBMAFFT\fR is a multiple sequence alignment program for unix\-like operating systems. It offers a range of multiple alignment methods. +.SS "Accuracy\-oriented methods:" +.sp +.RS 4 +\h'-04'\(bu\h'+03'L\-INS\-i (probably most accurate; recommended for <200 sequences; iterative refinement method incorporating local pairwise alignment information): +.HP 6 +\fBmafft\fR \fB\-\-localpair\fR \fB\-\-maxiterate\fR\ \fI1000\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBlinsi\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'G\-INS\-i (suitable for sequences of similar lengths; recommended for <200 sequences; iterative refinement method incorporating global pairwise alignment information): +.HP 6 +\fBmafft\fR \fB\-\-globalpair\fR \fB\-\-maxiterate\fR\ \fI1000\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBginsi\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'E\-INS\-i (suitable for sequences containing large unalignable regions; recommended for <200 sequences): +.HP 6 +\fBmafft\fR \fB\-\-ep\fR\ \fI0\fR \fB\-\-genafpair\fR \fB\-\-maxiterate\fR\ \fI1000\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBeinsi\fR \fIinput\fR [>\ \fIoutput\fR] +.br + +For E\-INS\-i, the +\fB\-\-ep\fR +\fI0\fR +option is recommended to allow large gaps. +.RE +.SS "Speed\-oriented methods:" +.sp +.RS 4 +\h'-04'\(bu\h'+03'FFT\-NS\-i (iterative refinement method; two cycles only): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI2\fR \fB\-\-maxiterate\fR\ \fI2\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 7 +\fBfftnsi\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'FFT\-NS\-i (iterative refinement method; max. 1000 iterations): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI2\fR \fB\-\-maxiterate\fR\ \fI1000\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'FFT\-NS\-2 (fast; progressive method): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI2\fR \fB\-\-maxiterate\fR\ \fI0\fR \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBfftns\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'FFT\-NS\-1 (very fast; recommended for >2000 sequences; progressive method with a rough guide tree): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI1\fR \fB\-\-maxiterate\fR\ \fI0\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'NW\-NS\-i (iterative refinement method without FFT approximation; two cycles only): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI2\fR \fB\-\-maxiterate\fR\ \fI2\fR \fB\-\-nofft\fR\ \fIinput\fR [>\ \fIoutput\fR] +.HP 7 +\fBnwnsi\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'NW\-NS\-2 (fast; progressive method without the FFT approximation): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI2\fR \fB\-\-maxiterate\fR\ \fI0\fR \fB\-\-nofft\fR\ \fIinput\fR [>\ \fIoutput\fR] +.HP 6 +\fBnwns\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'NW\-NS\-PartTree\-1 (recommended for ~10,000 to ~50,000 sequences; progressive method with the PartTree algorithm): +.HP 6 +\fBmafft\fR \fB\-\-retree\fR\ \fI1\fR \fB\-\-maxiterate\fR\ \fI0\fR \fB\-\-nofft\fR\ \fB\-\-parttree\fR \fIinput\fR [>\ \fIoutput\fR] +.RE +.SS "Group\-to\-group alignments" +.HP 6 +.RS 4 +\fBmafft\-profile\fR \fIgroup1\fR \fIgroup2\fR [>\ \fIoutput\fR] +.sp +or: +.sp +\fBmafft\fR \fB\-\-maxiterate\fR\ \fI1000\fR \fB\-\-seed\fR\ \fIgroup1\fR \fB\-\-seed\fR\ \fIgroup2\fR /dev/null [>\ \fIoutput\fR] +.RE +.RE +.RE +.SH "OPTIONS" +.SS "Algorithm" +.RS 0 +.PP +\fB\-\-auto\fR +.RS 4 +Automatically selects an appropriate strategy from L\-INS\-i, FFT\-NS\-i and FFT\-NS\-2, according to data +size. Default: off (always FFT\-NS\-2) +.RE +.PP +\fB\-\-6merpair\fR +.RS 4 +Distance is calculated based on the number of shared 6mers. Default: on +.RE +.PP +\fB\-\-globalpair\fR +.RS 4 +All pairwise alignments are computed with the Needleman\-Wunsch +algorithm. More accurate but slower +than \-\-6merpair. Suitable for a set of +globally alignable sequences. Applicable to +up to ~200 sequences. A combination with \-\-maxiterate 1000 is recommended (G\-INS\-i). Default: off (6mer distance is used) +.RE +.PP +\fB\-\-localpair\fR +.RS 4 +All pairwise alignments are computed with the Smith\-Waterman +algorithm. More accurate but slower +than \-\-6merpair. Suitable for a set of +locally alignable sequences. Applicable to +up to ~200 sequences. A combination with \-\-maxiterate 1000 is recommended (L\-INS\-i). Default: off (6mer distance is used) +.RE +.PP +\fB\-\-genafpair\fR +.RS 4 +All pairwise alignments are computed with a local +algorithm with the generalized affine gap cost +(Altschul 1998). More accurate but slower +than \-\-6merpair. Suitable when large internal gaps +are expected. Applicable to +up to ~200 sequences. A combination with \-\-maxiterate 1000 is recommended (E\-INS\-i). Default: off (6mer distance is used) +.RE +.\".PP +.\"\fB\-\-fastswpair\fR +.\".RS 4 +.\"Distance is calculated based on a FASTA alignment. +.\"FASTA is required. Default: off (6mer distance is used) +.\".RE +.PP +\fB\-\-fastapair\fR +.RS 4 +All pairwise alignments are computed with FASTA (Pearson and Lipman 1988). +FASTA is required. Default: off (6mer distance is used) +.RE +.\".PP +.\"\fB\-\-blastpair\fR +.\".RS 4 +.\"Distance is calculated based on a BLAST alignment. BLAST is +.\"required. Default: off (6mer distance is used) +.\".RE +.PP +\fB\-\-weighti\fR \fInumber\fR +.RS 4 +Weighting factor for the consistency term calculated from pairwise alignments. Valid when +either of \-\-globalpair, \-\-localpair, \-\-genafpair, \-\-fastapair or +\-\-blastpair is selected. Default: 2.7 +.RE +.PP +\fB\-\-retree\fR \fInumber\fR +.RS 4 +Guide tree is built \fInumber\fR times in the +progressive stage. Valid with 6mer distance. Default: 2 +.RE +.PP +\fB\-\-maxiterate\fR \fInumber\fR +.RS 4 +\fInumber\fR cycles of iterative refinement are performed. Default: 0 +.RE +.PP +\fB\-\-fft\fR +.RS 4 +Use FFT approximation in group\-to\-group alignment. Default: on +.RE +.PP +\fB\-\-nofft\fR +.RS 4 +Do not use FFT approximation in group\-to\-group alignment. Default: off +.RE +.PP +\fB\-\-noscore\fR +.RS 4 +Alignment score is not checked in the iterative refinement stage. Default: off (score is checked) +.RE +.PP +\fB\-\-memsave\fR +.RS 4 +Use the Myers\-Miller (1988) algorithm. Default: automatically turned on when the alignment length exceeds 10,000 (aa/nt). +.RE +.PP +\fB\-\-parttree\fR +.RS 4 +Use a fast tree\-building method (PartTree, Katoh and Toh 2007) with +the 6mer distance. Recommended for a large number (> ~10,000) +of sequences are input. Default: off +.RE +.PP +\fB\-\-dpparttree\fR +.RS 4 +The PartTree algorithm is used with distances based on DP. Slightly +more accurate and slower than \-\-parttree. Recommended for a large +number (> ~10,000) of sequences are input. Default: off +.RE +.PP +\fB\-\-fastaparttree\fR +.RS 4 +The PartTree algorithm is used with distances based on FASTA. Slightly more accurate and slower than \-\-parttree. Recommended for a large number (> ~10,000) of sequences are input. FASTA is required. Default: off +.RE +.PP +\fB\-\-partsize\fR \fInumber\fR +.RS 4 +The number of partitions in the PartTree algorithm. Default: 50 +.RE +.PP +\fB\-\-groupsize\fR \fInumber\fR +.RS 4 +Do not make alignment larger than \fInumber\fR sequences. Valid only with the \-\-*parttree options. Default: the number of input sequences +.RE +.RE +.SS "Parameter" +.RS 0 +.PP +\fB\-\-op\fR \fInumber\fR +.RS 4 +Gap opening penalty at group\-to\-group alignment. Default: 1.53 +.RE +.PP +\fB\-\-ep\fR \fInumber\fR +.RS 4 +Offset value, which works like gap extension penalty, for +group\-to\-group alignment. Default: 0.123 +.RE +.PP +\fB\-\-lop\fR \fInumber\fR +.RS 4 +Gap opening penalty at local pairwise +alignment. Valid when +the \-\-localpair or \-\-genafpair option is selected. Default: \-2.00 +.RE +.PP +\fB\-\-lep\fR \fInumber\fR +.RS 4 +Offset value at local pairwise alignment. Valid when +the \-\-localpair or \-\-genafpair option is selected. Default: 0.1 +.RE +.PP +\fB\-\-lexp\fR \fInumber\fR +.RS 4 +Gap extension penalty at local pairwise alignment. Valid when +the \-\-localpair or \-\-genafpair option is selected. Default: \-0.1 +.RE +.PP +\fB\-\-LOP\fR \fInumber\fR +.RS 4 +Gap opening penalty to skip the alignment. Valid when the +\-\-genafpair option is selected. Default: \-6.00 +.RE +.PP +\fB\-\-LEXP\fR \fInumber\fR +.RS 4 +Gap extension penalty to skip the alignment. Valid when the +\-\-genafpair option is selected. Default: 0.00 +.RE +.PP +\fB\-\-bl\fR \fInumber\fR +.RS 4 +BLOSUM \fInumber\fR matrix (Henikoff and Henikoff 1992) is used. \fInumber\fR=30, 45, 62 or 80. Default: 62 +.RE +.PP +\fB\-\-jtt\fR \fInumber\fR +.RS 4 +JTT PAM \fInumber\fR (Jones et al. 1992) matrix is used. \fInumber\fR>0. Default: BLOSUM62 +.RE +.PP +\fB\-\-tm\fR \fInumber\fR +.RS 4 +Transmembrane PAM \fInumber\fR (Jones et al. 1994) matrix is used. \fInumber\fR>0. Default: BLOSUM62 +.RE +.PP +\fB\-\-aamatrix\fR \fImatrixfile\fR +.RS 4 +Use a user\-defined AA scoring matrix. The format of \fImatrixfile\fR is +the same to that of BLAST. Ignored when nucleotide sequences are input. Default: BLOSUM62 +.RE +.PP +\fB\-\-fmodel\fR +.RS 4 +Incorporate the AA/nuc composition information into +the scoring matrix. Default: off +.RE +.RE +.SS "Output" +.RS 0 +.PP +\fB\-\-clustalout\fR +.RS 4 +Output format: clustal format. Default: off (fasta format) +.RE +.PP +\fB\-\-inputorder\fR +.RS 4 +Output order: same as input. Default: on +.RE +.PP +\fB\-\-reorder\fR +.RS 4 +Output order: aligned. Default: off (inputorder) +.RE +.PP +\fB\-\-treeout\fR +.RS 4 +Guide tree is output to the \fIinput\fR.tree file. Default: off +.RE +.PP +\fB\-\-quiet\fR +.RS 4 +Do not report progress. Default: off +.RE +.RE +.SS "Input" +.RS 0 +.PP +\fB\-\-nuc\fR +.RS 4 +Assume the sequences are nucleotide. Default: auto +.RE +.PP +\fB\-\-amino\fR +.RS 4 +Assume the sequences are amino acid. Default: auto +.RE +.PP +\fB\-\-seed\fR \fIalignment1\fR [\fB--seed\fR \fIalignment2\fR \fB--seed\fR \fIalignment3\fR ...] +.RS 4 +Seed alignments given in \fIalignment_n\fR (fasta format) are aligned with +sequences in \fIinput\fR. The alignment within every seed is preserved. +.RE +.RE +.SH "FILES" +.RS 0 +.PP +Mafft stores the input sequences and other files in a temporary directory, which by default is located in +\fI/tmp\fR. +.RE +.SH "ENVIONMENT" +.RS 0 +.PP +\fBMAFFT_BINARIES\fR +.RS 4 +Indicates the location of the binary files used by mafft. By default, they are searched in +\fI/usr/local/lib/mafft\fR, but on Debian systems, they are searched in +\fI/usr/lib/mafft\fR. +.RE +.PP +\fBFASTA_4_MAFFT\fR +.RS 4 +This variable can be set to indicate to mafft the location to the fasta34 program if it is not in the PATH. +.RE +.RE +.SH "SEE ALSO" +.RS 0 +.PP + +\fBmafft\-homologs\fR(1) +.RE +.SH "REFERENCES" +.RS 0 +.SS "In English" +.sp +.RS 4 +\h'-04'\(bu\h'+03'Katoh and Toh (Bioinformatics 23:372\-374, 2007) PartTree: an algorithm to build an approximate tree from a large number of unaligned sequences (describes the PartTree algorithm). +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'Katoh, Kuma, Toh and Miyata (Nucleic Acids Res. 33:511\-518, 2005) MAFFT version 5: improvement in accuracy of multiple sequence alignment (describes [ancestral versions of] the G\-INS\-i, L\-INS\-i and E\-INS\-i strategies) +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'Katoh, Misawa, Kuma and Miyata (Nucleic Acids Res. 30:3059\-3066, 2002) MAFFT: a novel method for rapid multiple sequence alignment based on fast Fourier transform (describes the FFT\-NS\-1, FFT\-NS\-2 and FFT\-NS\-i strategies) +.RE +.SS "In Japanese" +.sp +.RS 4 +\h'-04'\(bu\h'+03'Katoh and Misawa (Seibutsubutsuri 46:312\-317, 2006) Multiple Sequence Alignments: the Next Generation +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'Katoh and Kuma (Kagaku to Seibutsu 44:102\-108, 2006) Jissen\-teki Multiple Alignment +.RE +.RE +.SH "AUTHORS" +.RS 0 +.PP +\fBKazutaka Katoh\fR <\&kazutaka.katoh_at_aist.go.jp\&> +.sp -1n +.IP "" 4 +Wrote Mafft. +.PP +\fBCharles Plessy\fR <\&charles\-debian\-nospam_at_plessy.org\&> +.sp -1n +.IP "" 4 +Wrote this manpage in DocBook XML for the Debian distribution, using Mafft's homepage as a template. +.RE +.SH "COPYRIGHT" +.RS 0 +Copyright \(co 2002\-2007 Kazutaka Katoh (mafft) +.br +Copyright \(co 2007 Charles Plessy (this manpage) +.br +.PP +Mafft and its manpage are offered under the following conditions: +.PP +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +.sp +.RS 4 +\h'-04' 1.\h'+02'Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +.RE +.sp +.RS 4 +\h'-04' 2.\h'+02'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. +.RE +.sp +.RS 4 +\h'-04' 3.\h'+02'The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. +.RE +.PP +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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. +.br +.RE diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.bat b/mafft/src/mafft-7.487-with-extensions/core/mafft.bat new file mode 100644 index 0000000000..c674ca6079 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.bat @@ -0,0 +1,33 @@ +@echo off +setlocal enabledelayedexpansion +cls; 1>&2 +chcp 65001 1>&2 +for /f "usebackq tokens=*" %%i IN (`cd`) DO @set current_dir=%%i +if /i "%current_dir%" == "%systemroot%" ( + set mafft_working_dir="%~dp0" +) else ( + set mafft_working_dir="%current_dir%" +) +pushd "%mafft_working_dir%" + +echo; 1>&2 +echo Preparing environment to run MAFFT on Windows. 1>&2 +echo This may take a while, if real-time scanning by anti-virus software is on. 1>&2 + +set ROOTDIR=%~d0%~p0 +set PATH=/usr/bin/:%PATH% +set MAFFT_BINARIES=/usr/lib/mafft +set TMPDIR=%TMP% +set MAFFT_TMPDIR=%TMPDIR% + +REM set TMPDIR=%ROOTDIR%/tmp +REM set MAFFT_TMPDIR=%TMPDIR% +REM If you do not have write permission for Windows temporary folder +REM (typically C:\Users\username\AppData\Local\Temp\), then +REM uncomment (remove REM) the above two lines to use an alternative +REM temporary folder. + +"%ROOTDIR%\usr\bin\bash" "/usr/bin/mafft" %* + +popd +exit /b diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.bat.win10 b/mafft/src/mafft-7.487-with-extensions/core/mafft.bat.win10 new file mode 100644 index 0000000000..33511df234 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.bat.win10 @@ -0,0 +1,12 @@ +@echo off + +setlocal + +set ROOTDIR="%~d0%~p0\ms" +set PATH=/bin/:%PATH% +set MAFFT_BINARIES=/lib/mafft +set TMPDIR=%~d0%~p0/ms/tmp + +%ROOTDIR%\bin\sh %ROOTDIR%\bin\mafft %* + +:EOF diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.h b/mafft/src/mafft-7.487-with-extensions/core/mafft.h new file mode 100644 index 0000000000..90eeaa8478 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.h @@ -0,0 +1,4 @@ +extern int disttbfast( int ngui, int lgui, char **namegui, char **seqgui, int argc, char **argv, int (*callback)(int, int, char*)); +#define GUI_ERROR 1 +#define GUI_LENGTHOVER 2 +#define GUI_CANCEL 3 diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.ps1 b/mafft/src/mafft-7.487-with-extensions/core/mafft.ps1 new file mode 100644 index 0000000000..0e7704c7f2 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.ps1 @@ -0,0 +1,21 @@ +Write-Host; +Write-Host Preparing environment to run MAFFT on Windows. +Write-Host This may take a while, if real-time scanning by anti-virus software is on. + +Set-Item Env:Path "/usr/bin;$Env:Path" +Set-Item Env:MAFFT_BINARIES "/usr/lib/mafft" +Set-Item Env:TMPDIR "$Env:TMP" +Set-Item Env:MAFFT_TMPDIR "$Env:TMP" +Set-Item Env:mafft_working_dir "$PWD" + +#Set-Item Env:TMPDIR "/tmp" +#Set-Item Env:MAFFT_TMPDIR "/tmp" +# If you do not have write permission for standard temporary folder +# (typically C:\Users\username\AppData\Local\Temp\), then +# uncomment (remove #) the above two lines to use an alternative +# temporary folder. + +#$ROOTDIR=$PSScriptRoot # not supported by powershell versions <= 2 +$ROOTDIR=Split-Path -Parent $MyInvocation.MyCommand.Path +$proc = Start-Process -Wait -NoNewWindow -PassThru -FilePath "$ROOTDIR\usr\bin\bash.exe" -ArgumentList "'/usr/bin/mafft' $args" +exit $proc.ExitCode diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafft.tmpl b/mafft/src/mafft-7.487-with-extensions/core/mafft.tmpl new file mode 100644 index 0000000000..ae841298e9 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafft.tmpl @@ -0,0 +1,2978 @@ +#! /bin/bash +er=0; +myself=`dirname "$0"`/`basename "$0"`; export myself +version="v7.487 (2021/Jul/25)"; export version +LANG=C; export LANG +os=`uname` +progname=`basename "$0"` +windows="no" +if [ `echo $os | grep -i cygwin` ]; then + os="cygwin" + windows="yes" +elif [ `echo $os | grep -i msys` ]; then + os="msys" + windows="yes" +elif [ `echo $os | grep -i mingw` ]; then + os="mingw" + windows="yes" +elif [ `echo $os | grep -i darwin` ]; then + os="darwin" +elif [ `echo $os | grep -i sunos` ]; then + os="sunos" +elif [ `echo $os | grep -i linux` ]; then + os="linux" +else + os="unix" +fi +#export os # iranai +if [ "$windows" = "yes" ]; then + echo "" 1>&2 + echo "It may take a while before the calculation starts" 1>&2 + echo "if being scanned by anti-virus software." 1>&2 + echo "Also consider using a faster version for Windows 10:" 1>&2 + echo "https://mafft.cbrc.jp/alignment/software/wsl.html" 1>&2 +fi + +if [ "$MAFFT_BINARIES" ]; then + prefix="$MAFFT_BINARIES" +else + prefix=_LIBDIR +fi +export prefix # iranai + +if [ $# -gt 0 ]; then + if [ "$1" = "--man" ]; then + man "$prefix/mafft.1" + exit 0; + fi +fi + +if [ -x "$prefix/version" ]; then +# versionbin=`"$prefix/version" | awk '{print $1}'` # for cygwin + versionbin=`"$prefix/version"` # for cygwin 2.7 + else + versionbin="0.000" +fi + +if ! expr "$version" : v"$versionbin" > /dev/null ; then + echo "" 1>&2 + echo "v$versionbin != $version" 1>&2 + echo "" 1>&2 + echo "There is a problem in the configuration of your shell." 1>&2 + echo "Check the MAFFT_BINARIES environmental variable by" 1>&2 + echo "$ echo \$MAFFT_BINARIES" 1>&2 + echo "" 1>&2 + echo "This variable must be *unset*, unless you have installed MAFFT" 1>&2 + echo "with a special configuration. To unset this variable, type" 1>&2 + echo "$ unset MAFFT_BINARIES" 1>&2 + echo "or" 1>&2 + echo "% unsetenv MAFFT_BINARIES" 1>&2 + echo "Then retry" 1>&2 + echo "$ mafft input > output" 1>&2 + echo "" 1>&2 + echo "To keep this change permanently, edit setting files" 1>&2 + echo "(.bash_profile, .profile, .cshrc, etc) in your home directory" 1>&2 + echo "to delete the MAFFT_BINARIES line." 1>&2 + echo "On MacOSX, also edit or remove the .MacOSX/environment.plist file" 1>&2 + echo "and then re-login (MacOSX 10.6) or reboot (MacOSX 10.7)." 1>&2 + echo "" 1>&2 + echo "Please send a problem report to katoh@ifrec.osaka-u.ac.jp," 1>&2 + echo "if this problem remains." 1>&2 + echo "" 1>&2 + exit 1 + er=1 +fi + +defaultiterate=0 +defaultcycle=2 +defaultgop="1.53" +#defaultaof="0.123" +defaultaof="0.000" +defaultlaof="0.100" +defaultlgop="-2.00" +defaultfft=1 +defaultrough=0 +defaultdistance="ktuples" +#defaultdistance="local" +defaultweighti="2.7" +defaultweightr="0.0" +defaultweightm="1.0" +defaultdafs=0 +defaultmccaskill=0 +defaultcontrafold=0 +defaultalgopt=" " +defaultalgoptit=" " +defaultsbstmodel=" -b 62 " +defaultfmodel=" " +defaultkappa=" " +if [ $progname = "xinsi" -o $progname = "mafft-xinsi" ]; then + defaultfft=1 + defaultcycle=1 + defaultiterate=1000 + defaultdistance="scarna" + defaultweighti="3.2" + defaultweightr="8.0" + defaultweightm="2.0" + defaultmccaskill=1 + defaultcontrafold=0 + defaultdafs=0 + defaultalgopt=" -A " + defaultalgoptit=" -AB " ## chui + defaultaof="0.0" + defaultsbstmodel=" -b 62 " + defaultkappa=" " + defaultfmodel=" " # 2013/06/18 +elif [ $progname = "qinsi" -o $progname = "mafft-qinsi" ]; then + defaultfft=1 + defaultcycle=1 + defaultiterate=1000 + defaultdistance="global" + defaultweighti="3.2" + defaultweightr="8.0" + defaultweightm="2.0" + defaultmccaskill=1 + defaultcontrafold=0 + defaultdafs=0 + defaultalgopt=" -A " + defaultalgoptit=" -AB " ## chui + defaultaof="0.0" + defaultsbstmodel=" -b 62 " + defaultkappa=" " + defaultfmodel=" " # 2013/06/18 +elif [ $progname = "linsi" -o $progname = "mafft-linsi" ]; then + defaultfft=0 + defaultcycle=1 + defaultiterate=1000 + defaultdistance="local" +elif [ $progname = "ginsi" -o $progname = "mafft-ginsi" ]; then + defaultfft=1 + defaultcycle=1 + defaultiterate=1000 + defaultdistance="global" +elif [ $progname = "einsi" -o $progname = "mafft-einsi" ]; then + defaultfft=0 + defaultcycle=1 + defaultiterate=1000 + defaultdistance="localgenaf" +elif [ $progname = "fftns" -o $progname = "mafft-fftns" ]; then + defaultfft=1 + defaultcycle=2 + defaultdistance="ktuples" +elif [ $progname = "fftnsi" -o $progname = "mafft-fftnsi" ]; then + defaultfft=1 + defaultcycle=2 + defaultiterate=2 + defaultdistance="ktuples" +elif [ $progname = "nwns" -o $progname = "mafft-nwns" ]; then + defaultfft=0 + defaultcycle=2 + defaultdistance="ktuples" +elif [ $progname = "nwnsi" -o $progname = "mafft-nwnsi" ]; then + defaultfft=0 + defaultcycle=2 + defaultiterate=2 + defaultdistance="ktuples" +fi +outputfile="" +namelength=-1 +anysymbol=0 +parallelizationstrategy="BAATARI2" +kappa=$defaultkappa +sbstmodel=$defaultsbstmodel +fmodel=$defaultfmodel +nmodel=" " +gexp=0 +gop=$defaultgop +gopdist=$defaultgop +aof=$defaultaof +cycle=$defaultcycle +iterate=$defaultiterate +fft=$defaultfft +rough=$defaultrough +distance=$defaultdistance +forcefft=0 +memopt=" " +weightopt=" " +GGOP="-6.00" +LGOP="-6.00" +LEXP="-0.000" +GEXP="-0.000" +lgop=$defaultlgop +lexp="-0.100" +laof=$defaultlaof +pggop="-2.00" +pgexp="-0.10" +pgaof="0.10" +rgop="-1.530" +rgep="-0.000" +seqtype=" " +weighti=$defaultweighti +weightr=$defaultweightr +weightm=$defaultweightm +rnaalifold=0 +dafs=$defaultdafs +mccaskill=$defaultmccaskill +contrafold=$defaultcontrafold +progressfile="/dev/stderr" +anchorfile="/dev/null" +anchoropt="" +maxanchorseparation=1000 +debug=0 +sw=0 +algopt=$defaultalgopt +algoptit=$defaultalgoptit +#algspecified=0 +pairspecified=0 +scorecalcopt=" " +coreout=0 +corethr="0.5" +corewin="100" +coreext=" " +outputformat="pir" +f2clext="-N" +outorder="input" +seed="x" +seedtable="x" +auto=0 +groupsize=-1 +partsize=50 +partdist="ktuples" +partorderopt=" -x " +treeout=0 +nodeout=0 +distout=0 +treein=0 +topin=0 +treeinopt=" " +seedfiles="/dev/null" +seedtablefile="/dev/null" +pdblist="/dev/null" +ownlist="/dev/null" +strdir="$PWD" +scorematrix="/dev/null" +textmatrix="/dev/null" +treeinfile="/dev/null" +rnascoremtx=" " +laraparams="/dev/null" +foldalignopt=" " +treealg=" -X 0.1 " +sueff="1.0" +maxambiguous="1.0" +scoreoutarg=" " +numthreads=0 +numthreadsit=-1 +numthreadstb=-1 +randomseed=0 +addfile="/dev/null" +addarg0=" " +addarg=" " +addsinglearg=" " +add2ndhalfarg=" " +mapoutfile="/dev/null" +fragment=0 +legacygapopt=" " +mergetable="/dev/null" +mergearg=" " +seedoffset=0 +outnum=" " +last_e=5000 +last_m=3 +last_subopt=" " +last_once=" " +adjustdirection=0 +tuplesize=6 +termgapopt=" -O " +#termgapopt=" " # gap/gap ga kakenai node +similarityoffset="0.0" +unalignlevel="0.0" +unalignspecified=0 +spfactor="100.0" +shiftpenaltyspecified=0 +opdistspecified=0 +allowshift=0 +enrich=0 # ato de kezuru +enrichseq=0 # ato de kezuru +enrichstr=0 # ato de kezuru +seektarget="" # ato de kezuru +dashserver="https://sysimm.org/dash/REST1.0/" +newdash=0 +newdash_originalsequenceonly=0 +exclude_ho=0 +fixthreshold="0.0" +bunkatsuopt=" " +npickup=0 +minimumweight="0.00001" # 2016/Mar +usenaivepairscore=" " +oldgenafparam=0 +sprigorous=0 +treeext="none" +initialramusage="20GB" +focusarg=" " +lhlimit=" " +mpiscript="/dev/null" +if [ $# -gt 0 ]; then + if [ "$1" = "--version" ]; then + echo "$version" 1>&2 + exit 0; + elif [ "$1" = "--help" -o "$1" = "--info" ]; then + shift + er=1; + fi + while [ $# -gt 1 ]; + do + if [ "$1" = "--auto" ]; then + auto=1 + elif [ "$1" = "--anysymbol" ]; then + anysymbol=1 + elif [ "$1" = "--preservecase" ]; then + anysymbol=1 + elif [ "$1" = "--clustalout" ]; then + outputformat="clustal" + elif [ "$1" = "--phylipout" ]; then + outputformat="phylip" + elif [ "$1" = "--reorder" ]; then + outorder="aligned" + partorderopt=" " + elif [ "$1" = "--inputorder" ]; then + outorder="input" + partorderopt=" -x " + elif [ "$1" = "--unweight" ]; then + weightopt=" -u " + elif [ "$1" = "--termgappenalty" ]; then + termgapopt=" " + elif [ "$1" = "--alga" ]; then + algopt=" " + algoptit=" " +# algspecified=1 + elif [ "$1" = "--algq" ]; then + algopt=" -Q " + algoptit=" " + echo "" 1>&2 + echo "--algq is no longer supported!" 1>&2 + echo "" 1>&2 + exit 1; +# algspecified=1 + elif [ "$1" = "--namelength" ]; then + shift + namelength=`expr "$1" - 0` + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify the length of name in clustal format output!" 1>&2 + exit + fi + elif [ "$1" = "--groupsize" ]; then + shift + groupsize=`expr "$1" - 0` + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify groupsize!" 1>&2 + exit + fi + elif [ "$1" = "--partsize" ]; then + shift + partsize=`expr "$1" - 0` + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify partsize!" 1>&2 + exit + fi + elif [ "$1" = "--parttree" ]; then + distance="parttree" + partdist="ktuples" + elif [ "$1" = "--dpparttree" ]; then + distance="parttree" + partdist="localalign" + elif [ "$1" = "--fastaparttree" ]; then + distance="parttree" + partdist="fasta" + elif [ "$1" = "--treeout" ]; then + treeout=1 + elif [ "$1" = "--nodeout" ]; then + nodeout=1 + treeout=1 + elif [ "$1" = "--distout" ]; then + distout=1 + elif [ "$1" = "--fastswpair" ]; then + distance="fasta" + pairspecified=1 + sw=1 + elif [ "$1" = "--fastapair" ]; then + distance="fasta" + pairspecified=1 + sw=0 + elif [ "$1" = "--averagelinkage" ]; then + treealg=" -X 1.0 " + sueff="1.0" + elif [ "$1" = "--minimumlinkage" ]; then + treealg=" -X 0.0 " + sueff="0.0" + elif [ "$1" = "--mixedlinkage" ]; then + shift + sueff="$1" + treealg=" -X $1" + elif [ "$1" = "--maxambiguous" ]; then + shift + maxambiguous="$1" + elif [ "$1" = "--noscore" ]; then + scorecalcopt=" -Z " + elif [ "$1" = "--6mermultipair" ]; then + distance="ktuplesmulti" + tuplesize=6 + pairspecified=1 + elif [ "$1" = "--10mermultipair" ]; then + distance="ktuplesmulti" + tuplesize=10 + pairspecified=1 + elif [ "$1" = "--6merpair" ]; then + distance="ktuples" + tuplesize=6 + pairspecified=1 + elif [ "$1" = "--10merpair" ]; then + distance="ktuples" + tuplesize=10 + pairspecified=1 + elif [ "$1" = "--blastpair" ]; then + distance="blast" + pairspecified=1 + elif [ "$1" = "--lastmultipair" ]; then + distance="lastmulti" + pairspecified=1 + elif [ "$1" = "--globalpair" ]; then + distance="global" + pairspecified=1 + elif [ "$1" = "--shortlongpair" ]; then + distance="local" + usenaivepairscore="-Z" + laof=0.0 # addfull no tokini tsukawareru. + lexp=0.0 # addfull no tokini tsukawareru. + pgaof=0.0 # local nara iranai + pgexp=0.0 # local nara iranai + pairspecified=1 + elif [ "$1" = "--longshortpair" ]; then + distance="local" + usenaivepairscore="-Z" + laof=0.0 # addfull no tokini tsukawareru. + lexp=0.0 # addfull no tokini tsukawareru. + pgaof=0.0 # local nara iranai + pgexp=0.0 # local nara iranai + pairspecified=1 + elif [ "$1" = "--localpair" ]; then + distance="local" + pairspecified=1 + elif [ "$1" = "--lastpair" ]; then + distance="last" + pairspecified=1 + elif [ "$1" = "--multipair" ]; then + distance="multi" + pairspecified=1 + elif [ "$1" = "--hybridpair" ]; then + distance="hybrid" + pairspecified=1 + elif [ "$1" = "--scarnapair" ]; then + distance="scarna" + pairspecified=1 + elif [ "$1" = "--dafspair" ]; then + distance="dafs" + pairspecified=1 + elif [ "$1" = "--larapair" ]; then + distance="lara" + pairspecified=1 + elif [ "$1" = "--slarapair" ]; then + distance="slara" + pairspecified=1 + elif [ "$1" = "--foldalignpair" ]; then + distance="foldalignlocal" + pairspecified=1 + elif [ "$1" = "--foldalignlocalpair" ]; then + distance="foldalignlocal" + pairspecified=1 + elif [ "$1" = "--foldalignglobalpair" ]; then + distance="foldalignglobal" + pairspecified=1 + elif [ "$1" = "--globalgenafpair" ]; then + distance="globalgenaf" + pairspecified=1 + echo "" 1>&2 + echo "--globalgenaf is no longer supported!" 1>&2 + echo "" 1>&2 + exit 1; + elif [ "$1" = "--localgenafpair" ]; then + distance="localgenaf" + pairspecified=1 + elif [ "$1" = "--genafpair" ]; then + distance="localgenaf" + pairspecified=1 + elif [ "$1" = "--oldgenafpair" ]; then + distance="localgenaf" + pairspecified=1 + oldgenafparam=1 + elif [ "$1" = "--memsave" ]; then + memopt=" -M -B " # -B (bunkatsunashi no riyu ga omoidasenai) + elif [ "$1" = "--nomemsave" ]; then + memopt=" -N " + elif [ "$1" = "--nuc" ]; then + seqtype="-D" # Deleted space, 2018/Dec + elif [ "$1" = "--amino" ]; then + seqtype="-P" # Deleted space, 2018/Dec + elif [ "$1" = "--fft" ]; then + fft=1 + forcefft=1 + elif [ "$1" = "--nofft" ]; then + fft=0 + elif [ "$1" = "--quiet" ]; then +# if [ $os = "msys" ]; then +# progressfile="nul" +# else + progressfile="/dev/null" +# fi + elif [ "$1" = "--debug" ]; then + debug=1 + elif [ "$1" = "--coreext" ]; then + coreext=" -c " + elif [ "$1" = "--core" ]; then + coreout=1 + elif [ "$1" = "--adjustdirection" ]; then + adjustdirection=1 + elif [ "$1" = "--adjustdirectionaccurately" ]; then + adjustdirection=2 + elif [ "$1" = "--oneiteration" ]; then + oneiterationopt=" -r " + elif [ "$1" = "--progress" ]; then + shift + progressfile="$1" + if ! ( expr "$progressfile" : "\/" > /dev/null || expr "$progressfile" : "[A-Za-z]\:" > /dev/null ) ; then + echo "Specify a progress file name with the absolute path!" 1>&2 + exit + fi + elif [ "$1" = "--out" ]; then + shift + outputfile="$1" + elif [ "$1" = "--skipanchorsremoterthan" ]; then + shift + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify maximum gap length between anchors." 1>&2 + exit + fi + maxanchorseparation=`expr "$1" - 0` + elif [ "$1" = "--anchors" ]; then + shift + anchorfile="$1" + anchoropt=" -l " +# memopt=" -M -B " # ato de kentou +# memopt=" -N " # no memsave + if [ ! -e "$anchorfile" ]; then + echo "Cannot open $anchorfile" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--thread" ]; then + shift + if ! expr "$1" : "[0-9\-]" > /dev/null ; then + echo "Specify the number of threads. Or, use --thread -1" 1>&2 + exit + fi + numthreads=`expr "$1" - 0` + elif [ "$1" = "--threadtb" ]; then + shift + if ! expr "$1" : "[0-9\-]" > /dev/null ; then + echo "Check the argument after --threadtb, the number of threads for the progressive step." 1>&2 + exit + fi + numthreadstb=`expr "$1" - 0` + elif [ "$1" = "--threadit" ]; then + shift + if ! expr "$1" : "[0-9\-]" > /dev/null ; then + echo "Check the argument after --threadit, the number of threads for the iterative step." 1>&2 + exit + fi + numthreadsit=`expr "$1" - 0` + elif [ "$1" = "--last_subopt" ]; then + last_subopt="-S" + elif [ "$1" = "--last_once" ]; then + last_once="-U" + elif [ "$1" = "--last_m" ]; then + shift + last_m=`expr "$1" - 0` + elif [ "$1" = "--last_e" ]; then + shift + last_e=`expr "$1" - 0` + elif [ "$1" = "--randomseed" ]; then + shift + randomseed=`expr "$1" - 0` + elif [ "$1" = "--bestfirst" ]; then + parallelizationstrategy="BESTFIRST" + elif [ "$1" = "--adhoc0" ]; then + parallelizationstrategy="BAATARI0" + elif [ "$1" = "--adhoc1" ]; then + parallelizationstrategy="BAATARI1" + elif [ "$1" = "--adhoc2" ]; then + parallelizationstrategy="BAATARI2" + elif [ "$1" = "--simplehillclimbing" ]; then + parallelizationstrategy="BAATARI2" + elif [ "$1" = "--scoreout" ]; then + scoreoutarg="-S -B" + elif [ "$1" = "--outnum" ]; then + outnum="-n" + elif [ "$1" = "--leavegappyregion" ]; then + legacygapopt="-L" + elif [ "$1" = "--legacygappenalty" ]; then + legacygapopt="-L" + elif [ "$1" = "--merge" ]; then + shift + mergetable="$1" + if [ ! -e "$mergetable" ]; then + echo "Cannot open $mergetable" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--addprofile" ]; then + shift + addarg0="-I" + addfile="$1" + elif [ "$1" = "--add" ]; then + shift + addarg0="-K -I" + addfile="$1" + elif [ "$1" = "--addfragments" ]; then + shift + addarg0="-K -I" + addfile="$1" + fragment=1 + elif [ "$1" = "--addfull" ]; then + shift + addarg0="-K -I" + addfile="$1" + fragment=-1 + elif [ "$1" = "--addlong" ]; then + shift + addarg0="-K -I" + addfile="$1" + fragment=-2 + elif [ "$1" = "--smoothing" ]; then + add2ndhalfarg=$add2ndhalfarg" -p " + elif [ "$1" = "--keeplength" ]; then + add2ndhalfarg=$add2ndhalfarg" -Y " + elif [ "$1" = "--mapout" ]; then + add2ndhalfarg=$add2ndhalfarg" -Z -Y " + elif [ "$1" = "--mapoutfile" ]; then + shift + add2ndhalfarg=$add2ndhalfarg" -Z -Y " + mapoutfile="$1" + elif [ "$1" = "--maxiterate" ]; then + shift + iterate=`expr "$1" - 0` + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify the number of iterations!" 1>&2 + exit + fi + elif [ "$1" = "--retree" ]; then + shift + cycle=`expr "$1" - 0` + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify the number of tree rebuilding!" 1>&2 + exit + fi + elif [ "$1" = "--aamatrix" ]; then + shift + f2clext="-N" + sbstmodel=" -b -1 " + scorematrix="$1" + if [ ! -e "$scorematrix" ]; then + echo "Cannot open $scorematrix" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--textmatrix" ]; then + shift + f2clext="-E" + seqtype="-P" + fft=0 + sbstmodel=" -b -2 -a " + scorematrix="$1" + if [ ! -e "$scorematrix" ]; then + echo "Cannot open $scorematrix" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--text" ]; then + f2clext="-E" + seqtype="-P" + fft=0 + sbstmodel=" -b -2 -a " + elif [ "$1" = "--treein" ]; then + shift + treeinopt=" -U " + treein=1 + treeinfile="$1" + if [ ! -e "$treeinfile" ]; then + echo "Cannot open $treeinfile" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--pileup" ]; then +# treeinopt=" -U " +# treein=1 + treeext="pileup" + elif [ "$1" = "--randomchain" ]; then +# treeinopt=" -U " +# treein=1 +# pileuporshuffle="s" + treeext="randomchain" + elif [ "$1" = "--topin" ]; then + shift + treeinopt=" -V " + treein=1 + treeinfile="$1" + echo "The --topin option has been disabled." 1>&2 + echo "There was a bug in version < 6.530." 1>&2 + echo "This bug has not yet been fixed." 1>&2 + exit 1 + elif [ "$1" = "--mpi" ]; then + mpiscript="$prefix/mpiscript" + elif [ "$1" = "--large" ]; then + treeext="memsavetree" + elif [ "$1" = "--memsavetree" ]; then + treeext="memsavetree" + elif [ "$1" = "--memsavetreex" ]; then + treeext="memsavetreex" + elif [ "$1" = "--stepadd" ]; then + treeext="stepadd" + elif [ "$1" = "--youngestlinkage" ]; then + treeext="youngestlinkage" + elif [ "$1" = "--kappa" ]; then + shift + kappa=" -k $1 " + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify kappa value!" 1>&2 + exit + fi + elif [ "$1" = "--fmodel" ]; then + fmodel=" -a " + elif [ "$1" = "--nwildcard" ]; then + nmodel=" -: " + elif [ "$1" = "--nzero" ]; then + nmodel=" " + elif [ "$1" = "--jtt" ]; then + shift + f2clext="-N" + sbstmodel=" -j $1" +# if ! expr "$1" : "[0-9]" > /dev/null ; then +# echo "Specify pam value!" 1>&2 +# exit +# fi + elif [ "$1" = "--kimura" ]; then + shift + f2clext="-N" + sbstmodel=" -j $1" +# if ! expr "$1" : "[0-9]" > /dev/null ; then +# echo "Specify pam value!" 1>&2 +# exit +# fi + elif [ "$1" = "--tm" ]; then + shift + f2clext="-N" + sbstmodel=" -m $1" +# if ! expr "$1" : "[0-9]" > /dev/null ; then +# echo "Specify pam value!" 1>&2 +# exit +# fi + elif [ "$1" = "--bl" ]; then + shift + f2clext="-N" + sbstmodel=" -b $1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "blosum $1?" 1>&2 + exit + fi + elif [ "$1" = "--weighti" ]; then + shift + weighti="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify weighti value!" 1>&2 + exit + fi + elif [ "$1" = "--weightr" ]; then + shift + weightr="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify weightr value!" 1>&2 + exit + fi + elif [ "$1" = "--weightm" ]; then + shift + weightm="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify weightm value!" 1>&2 + exit + fi + elif [ "$1" = "--rnaalifold" ]; then + rnaalifold=1 + elif [ "$1" = "--mccaskill" ]; then + mccaskill=1 + contrafold=0 + dafs=0 + elif [ "$1" = "--contrafold" ]; then + mccaskill=0 + contrafold=1 + dafs=0 + elif [ "$1" = "--dafs" ]; then + mccaskill=0 + contrafold=0 + dafs=1 + elif [ "$1" = "--ribosum" ]; then + rnascoremtx=" -s " + elif [ "$1" = "--op" ]; then + shift + gop="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify op!" 1>&2 + exit + fi + elif [ "$1" = "--opdist" ]; then + shift + gopdist="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify opdist!" 1>&2 + exit + fi + opdistspecified=1 + elif [ "$1" = "--allowshift" ]; then + allowshift=1 + elif [ "$1" = "--shiftpenalty" ]; then + shift + spfactor="$1" + if ! expr "$1" : "[0-9]" > /dev/null ; then + echo "Specify sf!" 1>&2 + exit + fi + shiftpenaltyspecified=1 + elif [ "$1" = "--exp" ]; then + shift +# gexp="$1" + tmpval="$1" + gexp=`awk "BEGIN{ print -1.0 * \"$tmpval\"}"` + if ! expr "$gexp" : "[0-9\-]" > /dev/null ; then + printf "\nSpecify a number for exp, like --exp 0.1\n" 1>&2 + printf "'$1' cannot be interpreted as a number..\n\n" 1>&2 + exit + fi + elif [ "$1" = "--ep" ]; then + shift +# aof="$1" + tmpval="$1" + aof=`awk "BEGIN{ print -1.0 * \"$tmpval\"}"` + if ! expr "$aof" : "[0-9\-]" > /dev/null ; then + printf "\nSpecify a number for ep, like --ep 0.1\n" 1>&2 + printf "'$1' cannot be interpreted as a number..\n\n" 1>&2 + exit + fi + elif [ "$1" = "--rop" ]; then + shift + rgop="$1" +# Atode check + elif [ "$1" = "--rep" ]; then + shift + rgep="$1" + elif [ "$1" = "--lop" ]; then + shift + lgop="$1" + elif [ "$1" = "--LOP" ]; then + shift + LGOP="$1" + elif [ "$1" = "--lep" ]; then + shift + laof="$1" + elif [ "$1" = "--lexp" ]; then + shift + lexp="$1" + elif [ "$1" = "--LEXP" ]; then + shift + LEXP="$1" + elif [ "$1" = "--GEXP" ]; then + shift + GEXP="$1" + elif [ "$1" = "--GOP" ]; then + shift + GGOP="$1" + elif [ "$1" = "--gop" ]; then + shift + pggop="$1" + elif [ "$1" = "--gep" ]; then + shift + pgaof="$1" + elif [ "$1" = "--gexp" ]; then + shift + pgexp="$1" + elif [ "$1" = "--laraparams" ]; then + shift + laraparams="$1" + elif [ "$1" = "--corethr" ]; then + shift + corethr="$1" + elif [ "$1" = "--corewin" ]; then + shift + corewin="$1" + elif [ "$1" = "--strdir" ]; then + shift + strdir="$1" + elif [ "$1" = "--pdbidlist" ]; then + echo "--pdbidlist is temporarily unavailable, 2018/Dec." 1>&2 + echo "" 1>&2 + exit + shift + pdblist="$1" + if [ ! -e "$pdblist" ]; then + echo "Cannot open $pdblist" 1>&2 + echo "" 1>&2 + exit + fi + elif [ "$1" = "--pdbfilelist" ]; then + echo "--pdbfilelist is temporarily unavailable, 2018/Dec." 1>&2 + echo "" 1>&2 + exit + shift + ownlist="$1" + if [ ! -e "$ownlist" ]; then + echo "Cannot open $ownlist" 1>&2 + echo "" 1>&2 + exit + fi +# elif [ "$1" = "--enrich" ]; then +# enrich=1 +# enrichseq=1 +# enrichstr=1 +# seektarget="" +# elif [ "$1" = "--enrichseq" ]; then +# enrich=1 +# enrichseq=1 +# enrichstr=0 +# seektarget="-seq" +# elif [ "$1" = "--enrichstr" ]; then +# enrich=1 +# enrichseq=0 +# enrichstr=1 +# seektarget="-str" + elif [ "$1" = "--dash" ]; then + newdash=1 + distance="global" # can be override + iterate=3 # can be override + elif [ "$1" = "--dashserver" ]; then + shift + dashserver="$1" + elif [ "$1" = "--originalseqonly" ]; then + newdash_originalsequenceonly=1 + elif [ "$1" = "--excludehomologs" ]; then # works with --dash only + exclude_ho=1 + elif [ "$1" = "--seedtable" ]; then + shift + seedtable="y" + seedtablefile="$1" + elif [ "$1" = "--seed" ]; then + shift + seed="m" + seedfiles="$seedfiles $1" + elif [ "$1" = "--minimumweight" ]; then + shift + minimumweight="$1" + elif [ "$1" = "--similaritylevel" ]; then + shift + similarityoffset="$1" + elif [ "$1" = "--unalignlevel" ]; then + shift + unalignlevel="$1" + unalignspecified=1 + elif [ "$1" = "--skipiterate" ]; then + shift + fixthreshold="$1" + elif [ "$1" = "--bunkatsunashi" ]; then + bunkatsuopt=" -B " + elif [ "$1" = "--sp" ]; then + sprigorous=1 + elif [ "$1" = "--focus" ]; then + focusarg=" -= " + elif [ "$1" = "--lhlimit" ]; then # atode namae henkou + shift + lhlimit=" -q $1 " + elif [ "$1" = "--sparsepickup" ]; then + shift + npickup="$1" + elif [ $progname = "fftns" -o $progname = "nwns" ]; then + if [ "$1" -gt 0 ]; then + cycle=`expr "$1" - 0` + fi + else + echo "Unknown option: $1" 1>&2 + er=1; +# exit 1; + fi + shift + done; + + +# echo "" 1>"$progressfile" + + if [ $treeext = "memsavetree" ] || [ $treeext = "stepadd" ]; then + if [ $distance != "ktuples" ]; then +# auto -> memsave && globalpair ha erabarenai node, +# ~/maffttmp wo tsukau noha meijiteki ni shitei saretatoki dake. + if [ ! "$MAFFT_TMPDIR" ]; then # space is acceptable, 2018/Mar/17 + MAFFT_TMPDIR="$HOME/maffttmp" + mkdir -p "$MAFFT_TMPDIR" || exit + fi + fi + fi + + + if [ ! "$MAFFT_TMPDIR" ]; then + MAFFT_TMPDIR="$TMPDIR" + fi + + TMPFILE=`env TMPDIR="$MAFFT_TMPDIR" mktemp -dt "$progname.XXXXXXXXXX"` + if [ $? -ne 0 ]; then + echo "mktemp seems to be obsolete. Re-trying without -t" 1>&2 + mkdir -p "$MAFFT_TMPDIR/tmp" 1>&2 + TMPFILE=`mktemp -d "$MAFFT_TMPDIR/tmp/$progname.XXXXXXXXXX"` + fi + +# lfs getstripe $TMPFILE 2>/dev/null && lfs setstripe -c 1 $TMPFILE # 2017/Oct + lfs getstripe "$TMPFILE" > /dev/null 2>&1 && lfs setstripe -c 1 "$TMPFILE" > /dev/null 2>&1 # 2018/Feb + + if [ $os = "cygwin" ]; then + TMPFILE=`cygpath -w "$TMPFILE"` # necessary to pass path to f2cl on cyswin, somehow unnecessary in msys. + fi + +# umask 077 # 2021/Jan +# mkdir "$TMPFILE" || er=1 + + +function removetmpfile() { # for MPI + while true + do + rm -rf "$TMPFILE" && break + echo Retrying to remove "$TMPFILE". It may take several seconds. 1>&2 + sleep 2 + done +} + + if [ $debug -eq 1 ]; then +# trap "tar cfvz debuginfo.tgz $TMPFILE; rm -rf $TMPFILE " 0 # does not work in msys +# trap "tar cfv - $TMPFILE | gzip -c > debuginfo.tgz; rm -rf $TMPFILE " 0 15 + trap "popd > /dev/null 2>&1; tar cfv - \"$TMPFILE\" | gzip -c > debuginfo.tgz; removetmpfile" 0 15 + else +# trap "rm -rf $TMPFILE" 0 15 + trap "removetmpfile" 0 15 + fi + if [ $# -eq 1 ]; then + if [ -r "$1" -o "$1" = - ]; then + + if [ -r "$addfile" ]; then + printf ''; + else + echo "$0": Cannot open "$addfile". 1>&2 + echo "" 1>&2 + exit 1; + fi + + + cat "$1" | tr "\r" "\n" > "$TMPFILE/infile" + echo "" >> "$TMPFILE/infile" + cat "$addfile" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_addfile" + + if [ $maxambiguous != "1.0" ]; then + mv "$TMPFILE/infile" "$TMPFILE/_tofilter" + "$prefix/filter" -m $maxambiguous $seqtype -i "$TMPFILE/_tofilter" > "$TMPFILE/infile" 2>>"$progressfile" || exit 1 + mv "$TMPFILE/_addfile" "$TMPFILE/_tofilter" + "$prefix/filter" -m $maxambiguous $seqtype -i "$TMPFILE/_tofilter" > "$TMPFILE/_addfile" 2>>"$progressfile" || exit 1 + fi + cat "$TMPFILE/_addfile" >> "$TMPFILE/infile" + + cat "$scorematrix" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_aamtx" + cat "$mergetable" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_subalignmentstable" + cat "$treeinfile" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_guidetree" + cat "$seedtablefile" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_seedtablefile" + cat "$laraparams" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_lara.params" + cat "$pdblist" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/pdblist" + cat "$ownlist" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/ownlist" + cat "$anchorfile" | tr "\r" "\n" | grep -v "^$" > "$TMPFILE/_externalanchors" + + SAVEIFS=$IFS +# Fixed a bug: 'n' was misinterpreted as delimiter, 2020/Jun/19 + IFS=$'\n' + filelist="$1 +$addfile +$scorematrix +$mergetable +$treeinfile +$seedtablefile +$laraparams +$pdblist +$ownlist" + for f in $filelist; do + file "$f" 2>/dev/null | grep -e 'UTF-16' -e 'UTF-32' >& /dev/null && printf "$f: UTF-16 or UTF-32? Convert this file to ASCII\n\n" 1>&2 && exit 1; + done + IFS=$SAVEIFS + +# echo $seedfiles + infilename="$1" + seedfilesintmp="/dev/null" + seednseq="0" + set $seedfiles > /dev/null + while [ $# -gt 1 ]; + do + shift + if [ -r "$1" ]; then + cat "$1" | tr "\r" "\n" > "$TMPFILE/seed$#" + file "$1" | grep -e 'UTF-16' -e 'UTF-32' >& /dev/null && printf "$1: UTF-16 or UTF-32? Convert this file to ASCII\n\n" 1>&2 && exit 1; + else + echo "$0": Cannot open "$1". 1>&2 + echo "" 1>&2 + exit 1; + fi + seednseq=$seednseq" "`grep -c '^[>|=]' "$TMPFILE/seed$#"` + seedfilesintmp=$seedfilesintmp" "seed$# + done +# ls $TMPFILE +# echo $seedfilesintmp +# echo $seednseq + + + else + echo "$0": Cannot open "$1". 1>&2 + echo "" 1>&2 + er=1 +# exit 1; + fi + else +# echo '$#'"=$#" 1>&2 + er=1 + fi + + + if [ $numthreads -lt 0 ]; then + if [ $os = "linux" ]; then + nlogicalcore=`cat /proc/cpuinfo | grep "^processor" | uniq | wc -l` + ncoresinacpu=`cat /proc/cpuinfo | grep 'cpu cores' | uniq | awk '{print $4}'` + nphysicalcpu=`cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l` + if [ $nlogicalcore -eq 0 ]; then + echo "Cannot get the number of processors from /proc/cpuinfo" 1>>"$progressfile" + exit 1 + fi + if [ ${#ncoresinacpu} -gt 0 -a $nphysicalcpu -gt 0 ]; then + numthreads=`expr $ncoresinacpu '*' $nphysicalcpu` +# if [ $nlogicalcore -gt $numthreads ]; then # Hyperthreading +# numthreads=`expr $numthreads '+' 1` +# fi + else + numthreads=$nlogicalcore + fi + elif [ $os = "darwin" ]; then + numthreads=`sysctl -n hw.physicalcpu` + if [ -z $numthreads ]; then + echo "Cannot get the number of physical cores from sysctl" 1>>"$progressfile" + exit 1 + fi +# nlogicalcore=`sysctl -n hw.logicalcpu` +# if [ $nlogicalcore -gt $numthreads ]; then # Hyperthreading +# numthreads=`expr $numthreads '+' 1` +# fi + elif [ "$windows" = "yes" ]; then +# numthreads=`wmic cpu get NumberOfCores | head -2 | tail -1 | awk '{print $1}'` + numthreads=`wmic cpu get NumberOfCores | awk 'BEGIN{n=0} {n+=$1} END{print n}'` + + else + echo "Cannot count the number of physical cores." 1>>"$progressfile" + exit 1 + fi + echo "OS = "$os 1>>"$progressfile" + echo "The number of physical cores = " $numthreads 1>>"$progressfile" + fi + + if [ $numthreadstb -lt 0 ]; then + if [ $numthreads -lt 16 -o "$mpiscript" != "/dev/null" ]; then # mpi: museigen, multithread: 16 made +# if [ $numthreads -lt 31 ]; then + numthreadstb=$numthreads + else + numthreadstb=16 + fi + fi + + if [ $numthreadsit -lt 0 ]; then + if [ $numthreads -lt 8 ]; then + numthreadsit=$numthreads + else + numthreadsit=8 + fi + fi + + if [ $numthreadsit -eq 0 -a $parallelizationstrategy = "BESTFIRST" ]; then + echo 'Impossible' 1>&2; + exit 1; + fi + + + if [ "$addarg0" != " " ]; then + +# iterate=0 # 2013/03/23 -> commented out, 2017/12 + "$prefix/countlen" < "$TMPFILE/_addfile" > "$TMPFILE/addsize" 2>>"$progressfile" + nadd=`awk '{print $1}' "$TMPFILE/addsize"` + if [ $nadd -eq "0" ]; then + echo Check $addfile 1>&2 + exit 1; + fi + if [ $seed != "x" -o $seedtable != "x" ]; then + echo 'Impossible' 1>&2; + echo 'Use either ONE of --seed, --seedtable, --addprofile and --add.' 1>&2 + exit 1; + fi + else + nadd="0" + fi + + if [ $auto -eq 1 ]; then + "$prefix/countlen" < "$TMPFILE/infile" > "$TMPFILE/size" 2>>"$progressfile" + nseq=`awk '{print $1}' "$TMPFILE/size"` + nlen=`awk '{print $3}' "$TMPFILE/size"` + + if [ $nlen -lt 3000 -a $nseq -lt 100 ]; then + distance="local" + iterate=1000 + cycle=1 + treeext="none" + elif [ $nlen -lt 1000 -a $nseq -lt 200 ]; then + distance="local" + iterate=2 + cycle=1 + treeext="none" + elif [ $nlen -lt 10000 -a $nseq -lt 500 ]; then + distance="ktuples" + iterate=2 + cycle=2 + treeext="none" + elif [ $nseq -lt 20000 ]; then # changed from 10000 2014/Oct/4 + distance="ktuples" + iterate=0 + cycle=2 + treeext="none" + elif [ $nseq -lt 100000 ]; then # changed from 50000 2017/Nov/24 + distance="ktuples" + iterate=0 + cycle=2 + if [ $fragment -eq 0 -a "$mergetable" = "/dev/null" ]; then + treeext="memsavetree" + fi + elif [ $nseq -lt 200000 ]; then # changed from 90000 2017/Nov/24 + distance="ktuples" + iterate=0 + cycle=1 + if [ $fragment -eq 0 -a "$mergetable" = "/dev/null" ]; then + treeext="memsavetree" + fi + elif [ $nlen -lt 3000 ]; then + distance="parttree" + partdist="localalign" + algopt=" " + algoptit=" " +# algspecified=1 + cycle=1 + else + distance="parttree" + partdist="ktuples" + algopt=" " + algoptit=" " +# algspecified=1 + cycle=1 + fi + + +# if [ $nlen -lt 3000 -a $nseq -lt 100 ]; then +# distance="local" +# iterate=1000 +# cycle=1 +# elif [ $nlen -lt 1000 -a $nseq -lt 200 ]; then +# distance="local" +# iterate=2 +# cycle=1 +# elif [ $nlen -lt 10000 -a $nseq -lt 500 ]; then +# distance="ktuples" +# iterate=2 +# cycle=2 +# elif [ $nseq -lt 200000 ]; then +# distance="ktuples" +# iterate=0 +# treeinopt=" -U " +# treein=1 +# pileuporshuffle="a" +# elif [ $nlen -lt 3000 ]; then +# distance="parttree" +# partdist="localalign" +# algopt=" " +# algoptit=" " +## algspecified=1 +# cycle=1 +# else +# distance="parttree" +# partdist="ktuples" +# algopt=" " +# algoptit=" " +## algspecified=1 +# cycle=1 +# fi + + + if [ $fragment -ne 0 ]; then + norg=`expr $nseq '-' $nadd` + npair=`expr $norg '*' $nadd` + echo "nadd = " $nadd 1>>"$progressfile" + echo "npair = " $npair 1>>"$progressfile" + echo "nseq = " $nseq 1>>"$progressfile" + echo "nlen = " $nlen 1>>"$progressfile" + + if [ $norg -eq 0 ]; then + echo "" 1>>"$progressfile" + echo "The reference sequence was removed because of ambiguous letters?" 1>>"$progressfile" + echo "" 1>>"$progressfile" + exit 1; + fi +# nagasa check! +# + if [ $npair -gt 10000000 -o $nlen -gt 5000 ]; then # 2017/Oct + distance="ktuples" + echo "use ktuples, size=$tuplesize!" 1>>"$progressfile" + elif [ $npair -gt 3000000 -o $nlen -gt 5000 ]; then # 2017/Oct + distance="multi" + weighti="0.0" + echo "use multipair, weighti=0.0!" 1>>"$progressfile" + else + distance="multi" + echo "use multipair, weighti=$weighti!" 1>>"$progressfile" + fi + pairspecified=1 + fi + fi + + if [ `awk "BEGIN {print( 0.0+\"$sueff\" < 0.0 || 0.0+\"$sueff\" > 1.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "The argument of --mixedlinkage must be between 0.0 and 1.0" 1>>"$progressfile" + exit 1; + fi + + if [ `awk "BEGIN {print( 0.0+\"$maxambiguous\" < 0.0 || 0.0+\"$maxambiguous\" > 1.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "The argument of --maxambiguous must be between 0.0 and 1.0" 1>>"$progressfile" + exit 1; + fi + + if [ $allowshift -eq 1 ]; then + if [ $unalignspecified -ne 1 ]; then + unalignlevel="0.8" + fi + if [ $shiftpenaltyspecified -ne 1 ]; then + spfactor="2.00" + fi + fi + + if [ $opdistspecified -ne 1 ]; then + gopdist=$gop + fi + + if [ $unalignlevel != "0.0" -o `awk "BEGIN {print( 0.0+\"$spfactor\" < 100.0 )}"` -gt 0 ]; then + nmodel=" -: " + termgapopt=" " + if [ $distance = "localgenaf" ]; then + printf "\n%s\n" "The combination of --allowshift and --genafpair (E-INS-i/-1) is not supported." 1>>"$progressfile" + printf "%s\n" "Instead, please try --allowshift --globalpair (G-INS-i/-1 in the web version)," 1>>"$progressfile" + printf "%s\n\n" "which covers the situation for --genafpair (E-INS-i/-1), too." 1>>"$progressfile" + exit 1; + fi + if [ $distance != "global" -o `awk "BEGIN {print( 0.0+\"$weighti\" < 1.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "At present, --unalignlevel # or --allowshift is supported only with the --globalpair option." 1>>"$progressfile" + exit 1; + fi + if [ $fragment -ne 0 ]; then + printf "\n%s\n\n" "At present, --unalignlevel # or --allowshift is not supported with the --addfragments option." 1>>"$progressfile" + exit 1; + fi + fi + + if [ `awk "BEGIN {print( 0.0+\"$spfactor\" < 1.0 )}"` -gt 0 ]; then + printf "\n%s\n" "shiftpenalty must be >1." 1>>"$progressfile" + exit 1; + fi + + if [ `awk "BEGIN {print( 0.0+\"$fixthreshold\" < 0.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "The 'fix' parameter must be >= 0.0" 1>>"$progressfile" + exit 1; + fi + + if [ `awk "BEGIN {print( 0.0+\"$unalignlevel\" < 0.0 || 0.0+\"$unalignlevel\" > 1.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "The 'unalignlevel' parameter must be between 0.0 and 1.0" 1>>"$progressfile" + exit 1; + fi + if [ `awk "BEGIN {print( 0.0+\"$unalignlevel\" > 0.0 )}"` -gt 0 ]; then + laof="0" + lexp="0" + pgaof="0" + pgexp="0" + LEXP="0" + GEXP="0" + termgapopt=" " +# if [ $auto -eq 1 -o $fragment -ne 0 -o $iterate -gt 0 ]; then + if [ $fragment -ne 0 ]; then + printf "\n%s\n\n" "At present, the 'unalignlevel > 0' mode is not supported with the --addfragments option." 1>>"$progressfile" + exit 1; + fi + if [ $distance = "parttree" ]; then + printf "\n%s\n\n" "At present, the 'unalignlevel > 0' mode is not supported in the (dp)parttree option." 1>>"$progressfile" + exit 1; + fi + if [ $distance = "localgenaf" ]; then + printf "\n%s\n" "The --genafpair is not supported in the 'unalignlevel > 0' mode." 1>>"$progressfile" + printf "%s\n" "Instead, please try --unalignlevel xx --globalpair," 1>>"$progressfile" + printf "%s\n\n" "which covers the situation for --genafpair (E-INS-i), too." 1>>"$progressfile" + exit 1; + fi +# if [ $distance != "ktuples" -a `awk "BEGIN {print( 0.0+\"$weighti\" > 0.0 )}"` -gt 0 -a $iterate -gt 0 ]; then +# printf "\n%s\n\n" "Please add --weighti 0.0, for now." 1>>"$progressfile" +# exit 1; +# fi + fi + + if [ `awk "BEGIN {print( 0.0+\"$similarityoffset\" != 0.0 && 0.0+\"$unalignlevel\" != 0.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "Do not simultaneously specify --similaritylevel and --unalignlevel" 1>>"$progressfile" + exit 1; + fi + + if [ `awk "BEGIN {print( 0.0+\"$similarityoffset\" < -1.0 || 0.0+\"$similarityoffset\" > 1.0 )}"` -gt 0 ]; then + printf "\n%s\n\n" "Similarity must be between -1.0 and +1.0" 1>>"$progressfile" + exit 1; + fi + aof=`awk "BEGIN{print 0.0 + \"$similarityoffset\" + $aof}"` + laof=`awk "BEGIN{print 0.0 + \"$similarityoffset\" + $laof}"` + pgaof=`awk "BEGIN{print 0.0 + \"$similarityoffset\" + $pgaof}"` + + + if [ $parallelizationstrategy = "BESTFIRST" -o $parallelizationstrategy = "BAATARI0" ]; then + iteratelimit=254 + else + iteratelimit=16 + fi + if [ $iterate -gt $iteratelimit ]; then #?? + iterate=$iteratelimit + fi + + if [ $rnaalifold -eq 1 ]; then + rnaopt=" -e $rgep -o $rgop -c $weightm -r $weightr -R $rnascoremtx " +# rnaoptit=" -o $rgop -BT -c $weightm -r $weightr -R " + rnaoptit=" -o $rgop -F -c $weightm -r $weightr -R " + elif [ $mccaskill -eq 1 -o $dafs -eq 1 -o $contrafold -eq 1 ]; then + rnaopt=" -o $rgop -c $weightm -r $weightr " +# rnaoptit=" -e $rgep -o $rgop -BT -c $weightm -r $weightr $rnascoremtx " + rnaoptit=" -e $rgep -o $rgop -F -c $weightm -r $weightr $rnascoremtx " + else + rnaopt=" " + rnaoptit=" -F " + fi + +# if [ $algspecified -eq 0 ]; then +# if [ $distance = "parttree" ]; then +# algopt=" -Q " +# algoptit=" " +# else +# algopt=" " +# algoptit=" " +# fi +# fi + + if [ $sprigorous -eq 1 ]; then + algopt=" -@ " + if [ $iterate -gt 0 ]; then + if [ $numthreadsit -eq 0 ]; then + algoptit=" -@ -B -Z -z 1000 " + else + echo "" 1>>"$progressfile" + echo "At present, the combination of --sp and iterative refinement is supported only in a single thread." 1>>"$progressfile" + echo "Please try \"--thread -1 --threadit 0\", which runs the iterative refinment calculation on a single thread." 1>>"$progressfile" + echo "" 1>>"$progressfile" + exit 1; +# algoptit=" -@ -B -z 1000 " + fi + fi + termgapopt=" " + fft=0 + memopt=" -N " + fi + + model="$sbstmodel $kappa $fmodel $nmodel" + + if [ $er -eq 1 ]; then + echo "------------------------------------------------------------------------------" 1>&2 + echo " MAFFT" $version 1>&2 +# echo "" 1>&2 +# echo " Input format: fasta" 1>&2 +# echo "" 1>&2 +# echo " Usage: `basename $0` [options] inputfile > outputfile" 1>&2 + echo " https://mafft.cbrc.jp/alignment/software/" 1>&2 + echo " MBE 30:772-780 (2013), NAR 30:3059-3066 (2002)" 1>&2 +# echo "------------------------------------------------------------------------------" 1>&2 +# echo " % mafft in > out" 1>&2 + echo "------------------------------------------------------------------------------" 1>&2 +# echo "" 1>&2 + echo "High speed:" 1>&2 + echo " % mafft in > out" 1>&2 + echo " % mafft --retree 1 in > out (fast)" 1>&2 + echo "" 1>&2 + echo "High accuracy (for <~200 sequences x <~2,000 aa/nt):" 1>&2 + echo " % mafft --maxiterate 1000 --localpair in > out (% linsi in > out is also ok)" 1>&2 + echo " % mafft --maxiterate 1000 --genafpair in > out (% einsi in > out)" 1>&2 + echo " % mafft --maxiterate 1000 --globalpair in > out (% ginsi in > out)" 1>&2 + echo "" 1>&2 + echo "If unsure which option to use:" 1>&2 + echo " % mafft --auto in > out" 1>&2 + echo "" 1>&2 +# echo "Other options:" 1>&2 + echo "--op # : Gap opening penalty, default: 1.53" 1>&2 + echo "--ep # : Offset (works like gap extension penalty), default: 0.0" 1>&2 + echo "--maxiterate # : Maximum number of iterative refinement, default: 0" 1>&2 + echo "--clustalout : Output: clustal format, default: fasta" 1>&2 + echo "--reorder : Outorder: aligned, default: input order" 1>&2 + echo "--quiet : Do not report progress" 1>&2 + echo "--thread # : Number of threads (if unsure, --thread -1)" 1>&2 + echo "--dash : Add structural information (Rozewicki et al, submitted)" 1>&2 +# echo "" 1>&2 +# echo " % mafft --maxiterate 1000 --localpair in > out (L-INS-i)" 1>&2 +# echo " most accurate in many cases, assumes only one alignable domain" 1>&2 +# echo "" 1>&2 +# echo " % mafft --maxiterate 1000 --genafpair in > out (E-INS-i)" 1>&2 +# echo " works well if many unalignable residues exist between alignable domains" 1>&2 +# echo "" 1>&2 +# echo " % mafft --maxiterate 1000 --globalpair in > out (G-INS-i)" 1>&2 +# echo " suitable for globally alignable sequences " 1>&2 +# echo "" 1>&2 +# echo " % mafft --maxiterate 1000 in > out (FFT-NS-i)" 1>&2 +# echo " accurate and slow, iterative refinement method " 1>&2 +# echo "" 1>&2 +# echo "If the input sequences are long (~1,000,000nt)," 1>&2 +# echo " % mafft --retree 1 --memsave --fft in > out (FFT-NS-1-memsave, new in v5.8)" 1>&2 +# echo "" 1>&2 +# echo "If many (~5,000) sequences are to be aligned," 1>&2 +# echo "" 1>&2 +# echo " % mafft --retree 1 [--memsave] --nofft in > out (NW-NS-1, new in v5.8)" 1>&2 +# echo "" 1>&2 +# echo " --localpair : All pairwise local alignment information is included" 1>&2 +# echo " to the objective function, default: off" 1>&2 +# echo " --globalpair : All pairwise global alignment information is included" 1>&2 +# echo " to the objective function, default: off" 1>&2 +# echo " --op # : Gap opening penalty, default: $defaultgop " 1>&2 +# echo " --ep # : Offset (works like gap extension penalty), default: $defaultaof " 1>&2 +# echo " --bl #, --jtt # : Scoring matrix, default: BLOSUM62" 1>&2 +# echo " Alternatives are BLOSUM (--bl) 30, 45, 62, 80, " 1>&2 +# echo " or JTT (--jtt) # PAM. " 1>&2 +# echo " --nuc or --amino : Sequence type, default: auto" 1>&2 +# echo " --retree # : The number of tree building in progressive method " 1>&2 +# echo " (see the paper for detail), default: $defaultcycle " 1>&2 +# echo " --maxiterate # : Maximum number of iterative refinement, default: $defaultiterate " 1>&2 +# if [ $defaultfft -eq 1 ]; then +# echo " --fft or --nofft: FFT is enabled or disabled, default: enabled" 1>&2 +# else +# echo " --fft or --nofft: FFT is enabled or disabled, default: disabled" 1>&2 +# fi +# echo " --memsave: Memory saving mode" 1>&2 +# echo " (for long genomic sequences), default: off" 1>&2 +# echo " --clustalout : Output: clustal format, default: fasta" 1>&2 +# echo " --reorder : Outorder: aligned, default: input order" 1>&2 +# echo " --quiet : Do not report progress" 1>&2 +# echo "-----------------------------------------------------------------------------" 1>&2 + exit 1; + fi + if [ $sw -eq 1 ]; then + swopt=" -A " + else + swopt=" " + fi + + if [ $distance = "fasta" -o $partdist = "fasta" ]; then + if [ ! "$FASTA_4_MAFFT" ]; then + FASTA_4_MAFFT=`which fasta34` + fi + + if [ ! -x "$FASTA_4_MAFFT" ]; then + echo "" 1>&2 + echo "== Install FASTA ========================================================" 1>&2 + echo "This option requires the fasta34 program (FASTA version x.xx or higher)" 1>&2 + echo "installed in your PATH. If you have the fasta34 program but have renamed" 1>&2 + echo "(like /usr/local/bin/myfasta), set the FASTA_4_MAFFT environment variable" 1>&2 + echo "to point your fasta34 (like setenv FASTA_4_MAFFT /usr/local/bin/myfasta)." 1>&2 + echo "=========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $distance = "last" -o $distance = "lastmulti" ]; then + if [ ! -x "$prefix/lastal" -o ! -x "$prefix/lastdb" ]; then + echo "" 1>&2 + echo "== Install LAST ============================================================" 1>&2 + echo "LAST (Kielbasa, Wan, Sato, Horton, Frith 2011 Genome Res. 21:487) is required." 1>&2 + echo "http://last.cbrc.jp/" 1>&2 + echo "http://mafft.cbrc.jp/alignment/software/xxxxxxx.html " 1>&2 + echo "============================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $distance = "lara" -o $distance = "slara" ]; then + if [ ! -x "$prefix/mafft_lara" ]; then + echo "" 1>&2 + echo "== Install LaRA =========================================================" 1>&2 + echo "This option requires LaRA (Bauer et al. http://www.planet-lisa.net/)." 1>&2 + echo "The executable have to be renamed to 'mafft_lara' and installed into " 1>&2 + echo "the $prefix directory. " 1>&2 + echo "A configuration file of LaRA also have to be given" 1>&2 + echo "mafft-xinsi --larapair --laraparams parameter_file" 1>&2 + echo "mafft-xinsi --slarapair --laraparams parameter_file" 1>&2 + echo "=========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + if [ ! -s "$laraparams" ]; then + echo "" 1>&2 + echo "== Configure LaRA =======================================================" 1>&2 + echo "A configuration file of LaRA have to be given" 1>&2 + echo "mafft-xinsi --larapair --laraparams parameter_file" 1>&2 + echo "mafft-xinsi --slarapair --laraparams parameter_file" 1>&2 + echo "=========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $distance = "foldalignlocal" -o $distance = "foldalignglobal" ]; then + if [ ! -x "$prefix/foldalign210" ]; then + echo "" 1>&2 + echo "== Install FOLDALIGN ====================================================" 1>&2 + echo "This option requires FOLDALIGN (Havgaard et al. http://foldalign.ku.dk/)." 1>&2 + echo "The executable have to be renamed to 'foldalign210' and installed into " 1>&2 + echo "the $prefix directory. " 1>&2 + echo "=========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $distance = "scarna" -o $mccaskill -eq 1 ]; then + if [ ! -x "$prefix/mxscarnamod" ]; then + echo "" 1>&2 + echo "== Install MXSCARNA ======================================================" 1>&2 + echo "MXSCARNA (Tabei et al. BMC Bioinformatics 2008 9:33) is required." 1>&2 + echo "Please 'make' at the 'extensions' directory of the MAFFT source package," 1>&2 + echo "which contains the modified version of MXSCARNA." 1>&2 + echo "http://mafft.cbrc.jp/alignment/software/source.html " 1>&2 + echo "==========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $distance = "dafs" -o $dafs -eq 1 ]; then + if [ ! -x "$prefix/dafs" ]; then + echo "" 1>&2 + echo "== Install DAFS===========================================================" 1>&2 + echo "DAFS (Sato et al. Journal 2012 issue:page) is required." 1>&2 + echo "http://www.ncrna.org/ " 1>&2 + echo "==========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + if [ $contrafold -eq 1 ]; then + if [ ! -x "$prefix/contrafold" ]; then + echo "" 1>&2 + echo "== Install CONTRAfold ===================================================" 1>&2 + echo "This option requires CONTRAfold" 1>&2 + echo "(Do et al. http://contra.stanford.edu/contrafold/)." 1>&2 + echo "The executable 'contrafold' have to be installed into " 1>&2 + echo "the $prefix directory. " 1>&2 + echo "=========================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + fi + +#old +# if [ $treeout -eq 1 ]; then +# parttreeoutopt="-t" +# if [ $cycle -eq 0 ]; then +# treeoutopt="-t -T" +# groupsize=1 +# iterate=0 +# if [ $distance = "global" -o $distance = "local" -o $distance = "localgenaf" -o $distance = "globalgenaf" ]; then +# distance="distonly" +# fi +# else +# treeoutopt="-t" +# fi +# else +# parttreeoutopt=" " +# if [ $cycle -eq 0 ]; then +# treeoutopt="-t -T" +# iterate=0 +# if [ $distance = "global" -o $distance = "local" -o $distance = "localgenaf" -o $distance = "globalgenaf" ]; then +# distance="distonly" +# fi +# else +# treeoutopt=" " +# fi +# fi + +#new + if [ $cycle -eq 0 ]; then + if [ $nodeout -eq 1 ]; then + treeoutopt="-^ -T" + else + treeoutopt="-t -T" + fi + iterate=0 + weighti="0.0" # 2016Jul31, tbfast.c kara idou +# if [ $distance = "global" -o $distance = "local" -o $distance = "localgenaf" -o $distance = "globalgenaf" ]; then # 2012/04, localpair --> local alignment distance +# if [ $distance = "global" ]; then +# distance="distonly" +# fi + if [ $treeout -eq 1 ]; then + parttreeoutopt="-t" + groupsize=1 + else + parttreeoutopt=" " + fi + if [ $distout -eq 1 ]; then + distoutopt="-y -T" + if [ $treeout -eq 0 ]; then + treeoutopt="" + fi + fi + else + if [ $nodeout -eq 1 ]; then + if [ $iterate -gt 0 ]; then + echo "The --nodeout option supports only progressive method (--maxiterate 0) for now." 1>&2 + exit 1 + fi + parttreeoutopt="-t" + treeoutopt="-^" + elif [ $treeout -eq 1 ]; then + parttreeoutopt="-t" + treeoutopt="-t" + else + parttreeoutopt=" " + treeoutopt=" " + fi + if [ $distout -eq 1 ]; then + distoutopt="-y" + fi + fi +# + + formatcheck=`grep -c '^[[:blank:]]\+>' "$TMPFILE/infile" | head -1 ` + if [ $formatcheck -gt 0 ]; then + echo "The first character of a description line must be " 1>&2 + echo "the greater-than (>) symbol, not a blank." 1>&2 + echo "Please check the format around the following line(s):" 1>&2 + grep -n '^[[:blank:]]\+>' "$TMPFILE/infile" 1>&2 + exit 1 + fi + + nseq=`grep -c '^[>|=]' "$TMPFILE/infile" | head -1 ` + if [ $nseq -eq 2 ]; then + cycle=1 + fi + if [ $cycle -gt 3 ]; then + cycle=3 + fi + + if [ $nseq -gt 60000 -a $iterate -gt 1 ]; then # 2014/Oct/22, test + echo "Too many sequences to perform iterative refinement!" 1>&2 + echo "Please use a progressive method." 1>&2 + exit 1 + fi + if [ $distance = "lastmulti" -o $distance = "multi" ]; then + if [ $fragment -eq 0 ]; then + echo 'Specify --addfragments too' 1>&2 + exit 1 + fi + fi + + if [ $fragment -ne 0 ]; then + if [ $pairspecified -eq 0 ]; then + distance="multi" + fi + if [ $distance != "multi" -a $distance != "hybrid" -a $distance != "lastmulti" -a $distance != "local" -a $distance != "last" -a $distance != "ktuples" -a $distance != "ktuplesmulti" ]; then + echo 'Specify --multipair, --lastmultipair, --lastpair, --localpair, --6merpair, --6mermultipair or --hybridpair' 1>&2 + exit 1 + fi + fi + + if [ "$memopt" = " -M -B " -a "$distance" != "ktuples" ]; then + echo "Impossible" 1>&2 + exit 1 + fi + + if [ $distance = "parttree" ]; then + if [ "$mergetable" != "/dev/null" ]; then + echo "The combination of (dp)parttree and merge is Impossible. " 1>&2 + exit 1 + fi + if [ $addfile != "/dev/null" ]; then + echo "The combination of (dp)parttree and add(fragments) is Impossible. " 1>&2 + exit 1 + fi + if [ $seed != "x" -o $seedtable != "x" ]; then + echo "Impossible" 1>&2 + exit 1 + fi + if [ $iterate -gt 1 ]; then + echo "Impossible" 1>&2 + exit 1 + fi + if [ $outorder = "aligned" ]; then + outorder="input" + fi + outorder="input" # partorder ga kiku + if [ $partdist = "localalign" ]; then + splitopt=" -U " # -U -l -> fast + cycle=1 + elif [ $partdist = "fasta" ]; then + splitopt=" -S " + cycle=1 + else + splitopt=" " + fi + fi + + + if [ \( $distance = "ktuples" -o $distance = "ktuplesmulti" \) -a \( $seed = "x" -a $seedtable = "x" -a $ownlist = "/dev/null" -a $pdblist = "/dev/null" -a $enrichstr -eq 0 -a $newdash -eq 0 \) ]; then + localparam="" + weighti="0.0" + elif [ \( $distance = "ktuples" -o $distance = "ktuplesmulti" \) -a \( $seed != "x" -o $seedtable != "x" -o $ownlist != "/dev/null" -o $pdblist != "/dev/null" -o $enrichstr -eq 1 -o $newdash -eq 1 \) ]; then + if [ $cycle -lt 2 ]; then + cycle=2 # disttbfast ha seed hi-taiou # chuui 2014Aug21 + fi + if [ $iterate -lt 2 ]; then + echo "############################################################################" 1>&2 + echo "# Warning:" 1>&2 + echo "# Progressive alignment method is incompatible with the --seed option." 1>&2 + echo "# Automatically switched to the iterative refinement method." 1>&2 + echo "# " 1>&2 + echo "# Also consider using the '--add' option, which is compatible with" 1>&2 + echo "# the progressive method and FASTER than the '--seed' option." 1>&2 + echo "# Usage is:" 1>&2 + echo "# % mafft --add newSequences existingAlignment > output" 1>&2 + echo "############################################################################" 1>&2 + iterate=2 + fi + localparam="-l "$weighti + elif [ $distance = "parttree" ]; then + localparam="" + weighti="0.0" + if [ $groupsize -gt -1 ]; then + cycle=1 + fi + else +# localparam="-B -l "$weighti # weighti=0 demo bunkatsu nashi + localparam="-l "$weighti # -B (bunkatsunashi) ha dvtditr.c de taiou (17/Jan/15) + if [ $cycle -gt 1 ]; then # 09/01/08 + cycle=1 + fi + fi + + + if [ $distance = "localgenaf" -o $distance = "globalgenaf" ]; then + aof="0.000" + if [ $oldgenafparam -ne 1 ]; then + laof="0.0" + lexp="0.0" +# LEXP="0.0" # default = 0.0 + usenaivepairscore="-Z" + fi + fi + + +# if [ $nseq -gt 5000 ]; then +# fft=0 +# fi + if [ $forcefft -eq 1 ]; then + param_fft=" -G " + fft=1 + elif [ $fft -eq 1 ]; then + param_fft=" -F " + else + param_fft=" " + fi + + if [ $seed != "x" -a $seedtable != "x" ]; then + echo 'Use either one of seedtable and seed. Not both.' 1>&2 + exit 1 + fi + if [ $f2clext = "-E" -a $anysymbol -gt 0 ]; then + echo '' 1>&2 + echo 'The combination of --text and ( --anysymbol or --preservecase ) is impossible.' 1>&2 + echo '' 1>&2 + exit 1 + fi + +# if [ $f2clext = "-E" -a $scorematrix != "/dev/null" ]; then +# echo '' 1>&2 +# echo 'At present, the combination of --text and (--aamatrix) is impossible.' 1>&2 +# echo '' 1>&2 +# exit 1 +# fi + + memsavetree=0 + if [ $treeext != "none" ]; then + if [ $distance == "ktuples" ]; then + treein=1 + treeinopt=" -U " + if [ $treeext == "randomchain" ]; then + echo "shuffle $randomseed" > "$TMPFILE/_guidetree" + cycle=1 # disttbfast.c dem shitei + elif [ $treeext == "pileup" ]; then + echo "pileup" > "$TMPFILE/_guidetree" + cycle=1 # disttbfast. shitei + elif [ $treeext == "memsavetree" ]; then + echo "very compact" > "$TMPFILE/_guidetree" + memsavetree=1 + elif [ $treeext == "memsavetreex" ]; then + echo "compact " "$initialramusage" > "$TMPFILE/_guidetree" + memsavetree=1 + elif [ $treeext == "stepadd" ]; then + echo "stepadd" > "$TMPFILE/_guidetree" + memsavetree=1 + elif [ $treeext == "youngestlinkage" ]; then + echo "youngestlinkage" > "$TMPFILE/_guidetree" + memsavetree=1 + else + echo "error in mafft.tmpl" + exit + fi + else # globalpair, localpair, genafpair, oldgenafpair +# treein, treeinopt ha kimaranai + if [ $treeext == "memsavetree" -o $treeext == "stepadd" ]; then + memsavetree=1 + else + echo "With globalpair, localpair or genafpair," 1>>"$progressfile" + echo "Use --large, --minimumlinkage, --averagelinkage or --mixedlinkage." 1>>"$progressfile" + echo "--$treeext is supported only with --6merpair." 1>>"$progressfile" + echo '' 1>>"$progressfile" + exit + fi + fi + if [ $iterate -gt 0 ]; then + echo 'Iterative refinment is not supported for --large or --'$treeext 1>>"$progressfile" + echo '' 1>>"$progressfile" + exit 1 + fi + if [ $fragment -ne 0 ]; then + echo '--addfragments, --addfull or --addlong is not yet supported for --large or --'$treeext 1>>"$progressfile" + echo "Use --add newsequences --$treeext" 1>>"$progressfile" + echo "Or, --addfragments (long, full) newsequences, without --"$treeext 1>>"$progressfile" + echo '' 1>>"$progressfile" + exit 1 + fi + if [ "$mergetable" != "/dev/null" ]; then # 2018/Mar/2 + echo '--merge is not yet supported for --large or --'$treeext 1>>"$progressfile" + echo "Use --merge without --"$treeext 1>>"$progressfile" + echo '' 1>>"$progressfile" + exit 1 + fi + fi + + + + if [ $nadd -gt "0" ]; then + if [ $fragment -eq "1" ]; then + addarg="$addarg0 $nadd -g -0.01" + addsinglearg="" + cycle=1 # chuui 2014Aug25 + iterate=0 + elif [ $fragment -eq "-1" ]; then + addarg="$addarg0 $nadd" + addsinglearg="-V" # allowlongadds, 2014/04/02 + cycle=1 # chuui 2014Aug25 + iterate=0 + elif [ $fragment -eq "-2" ]; then + addarg="$addarg0 $nadd" + addsinglearg="-V" # allowlongadds + smoothing + add2ndhalfarg=$add2ndhalfarg" -p " + cycle=1 # chuui 2014Aug25 + usenaivepairscore="-Z" # 2015Jun01 + laof=0.0 # 2015Jun01 + lexp=0.0 # 2015Jun01 + iterate=0 + else + addarg="$addarg0 $nadd" + addsinglearg="" +# iterate=1 # iterate ha shitei dori + bunkatsuopt=" -B " # fftnsi demo bunktasu shinai + if [ "$add2ndhalfarg" != " " ]; then + if [ $auto -eq 1 -o $iterate -gt 0 ]; then +# echo '' 1>>"$progressfile" +# echo 'The --keeplength and --mapout options are not supported' 1>>"$progressfile" +# echo 'with the --auto or --maxiterate >0 options.' 1>>"$progressfile" +# echo 'Use the --maxiterate 0 option (= progressive method).' 1>>"$progressfile" +# echo '' 1>>"$progressfile" +# exit 1 + iterate=0 + fi + fi + fi + + +# cycle=1 # chuui 2014Aug19 +# iterate=0 +# treealg=" -q " ## 2012/01/24 ## removed 2012/02/06 + else + if [ "$add2ndhalfarg" != " " ]; then + echo '' 1>>"$progressfile" + echo 'The --keeplength and --mapout options are supported' 1>>"$progressfile" + echo 'only with --add, --addfragments or --addlong.' 1>>"$progressfile" + echo '' 1>>"$progressfile" + exit 1 + fi + fi + + + if [ -z "$localparam" -a $fragment -eq 0 -a $distance != "parttree" ]; then +# echo "use disttbfast" +# echo cycle = $cycle + cycletbfast=1 # tbfast wo jikkou shinai + cycledisttbfast=$cycle # disttbfast ni -E cycle wo watasu + if [ $cycledisttbfast -eq 0 ]; then # --treeout de tsukau + cycledisttbfast=1 + fi + else +# echo "use tbfast" +# echo cycle = $cycle + cycletbfast=$cycle # 1 ijou nara jikkou + cycledisttbfast=1 # disttbfast ha ikkai dake + fi + +# echo localparam= +# echo $localparam +# echo cycletbfast= +# echo $cycletbfast +# echo cycledisttbfast= +# echo $cycledisttbfast + +#exit + + if [ $adjustdirection -gt 0 -a $seed != "x" ]; then + echo '' 1>&2 + echo 'The combination of --adjustdirection(accurately) and --seed is not supported.' 1>&2 + echo '' 1>&2 + exit 1 + fi + + + if [ $mccaskill -eq 1 -o $dafs -eq 1 -o $rnaalifold -eq 1 -o $contrafold -eq 1 ]; then + if [ $distance = "ktuples" ]; then + echo 'Not supported.' 1>&2 + echo 'Please add --globalpair, --localpair, --scarnapair, --dafspair' 1>&2 + echo '--larapair, --slarapair, --foldalignlocalpair or --foldalignglobalpair' 1>&2 + exit 1 + fi + if [ $f2clext = "-E" ]; then + echo '' 1>&2 + echo 'For RNA alignment, the --text mode is impossible.' 1>&2 + echo '' 1>&2 + exit 1 + fi + fi + +# cycle ga atode henkou sareru node koko de strategy no namae wo kimeru. +# kokokara + if [ $treeext = "pileup" ]; then + strategy="Pileup-" + elif [ $treeext = "randomchain" ]; then + strategy="Randomchain-" + elif [ $mccaskill -eq 1 -o $dafs -eq 1 -o $rnaalifold -eq 1 -o $contrafold -eq 1 ]; then + if [ $distance = "scarna" -o $distance = "dafs" -o $distance = "lara" -o $distance = "slara" -o $distance = "foldalignlocal" -o $distance = "foldalignglobal" ]; then + strategy="X-" + elif [ $distance = "global" -o $distance = "local" -o $distance = "localgenaf" -o "globalgenaf" ]; then + strategy="Q-" + fi + elif [ $distance = "fasta" -a $sw -eq 0 ]; then + strategy="F-" + elif [ $distance = "fasta" -a $sw -eq 1 ]; then + strategy="H-" + elif [ $distance = "blast" ]; then + strategy="B-" + elif [ $distance = "global" -o $distance = "distonly" ]; then + strategy="G-" + elif [ $distance = "local" ]; then + strategy="L-" + elif [ $distance = "last" ]; then + strategy="Last-" + elif [ $distance = "hybrid" ]; then + strategy="Hybrid-" + elif [ $distance = "multi" ]; then + strategy="Multi-" + elif [ $distance = "lastmulti" ]; then + strategy="LastMulti-" + elif [ $distance = "localgenaf" ]; then + strategy="E-" + elif [ $distance = "globalgenaf" ]; then + strategy="K-" + elif [ $fft -eq 1 ]; then + strategy="FFT-" + else + strategy="NW-" + fi + if [ $memsavetree -eq 1 ]; then + strategy=$strategy"large-" + fi +# if [ `echo "$weighti>0.0" | bc` -gt 0 ]; then + if [ `awk "BEGIN {print(0.0+\"$weighti\">0.0)}"` -gt 0 ]; then + strategy=$strategy"I" + fi + strategy=$strategy"NS-" + if [ $iterate -gt 0 ]; then + strategy=$strategy"i" + elif [ $distance = "parttree" ]; then + if [ $partdist = "fasta" ]; then + strategy=$strategy"FastaPartTree-"$cycle + elif [ $partdist = "localalign" ]; then + strategy=$strategy"DPPartTree-"$cycle + else + strategy=$strategy"PartTree-"$cycle + fi + elif [ $fragment -eq 1 ]; then + strategy=$strategy"fragment" + elif [ $fragment -eq -1 ]; then + strategy=$strategy"full" + elif [ $fragment -eq -2 ]; then + strategy=$strategy"long" + else + strategy=$strategy$cycle + fi + + explanation='?' + performance='Not tested.' + if [ $strategy = "F-INS-i" ]; then + explanation='Iterative refinement method (<'$iterate') with LOCAL pairwise alignment information' + performance='Most accurate, but very slow' + elif [ $strategy = "L-INS-i" ]; then + explanation='Iterative refinement method (<'$iterate') with LOCAL pairwise alignment information' + performance='Probably most accurate, very slow' + elif [ $strategy = "E-INS-i" ]; then + explanation='Iterative refinement method (<'$iterate') with LOCAL pairwise alignment with generalized affine gap costs (Altschul 1998)' + performance='Suitable for sequences with long unalignable regions, very slow' + elif [ $strategy = "G-INS-i" ]; then + explanation='Iterative refinement method (<'$iterate') with GLOBAL pairwise alignment information' + performance='Suitable for sequences of similar lengths, very slow' + elif [ $strategy = "X-INS-i" ]; then + explanation='RNA secondary structure information is taken into account.' + performance='For short RNA sequences only, extremely slow' + elif [ $strategy = "F-INS-1" ]; then + explanation='Progressive method incorporating LOCAL pairwise alignment information' + elif [ $strategy = "L-INS-1" ]; then + explanation='Progressive method incorporating LOCAL pairwise alignment information' + elif [ $strategy = "G-INS-1" ]; then + explanation='Progressive method incorporating GLOBAL pairwise alignment information' + elif [ $strategy = "FFT-NS-i" -o $strategy = "NW-NS-i" ]; then + explanation='Iterative refinement method (max. '$iterate' iterations)' + if [ $iterate -gt 2 ]; then + performance='Accurate but slow' + else + performance='Standard' + fi + elif [ $strategy = "FFT-NS-2" -o $strategy = "NW-NS-2" ]; then + explanation='Progressive method (guide trees were built '$cycle' times.)' + performance='Fast but rough' + elif [ $strategy = "FFT-NS-1" -o $strategy = "NW-NS-1" ]; then + explanation='Progressive method (rough guide tree was used.)' + performance='Very fast but very rough' + fi + + if [ $outputformat = "clustal" -a $outorder = "aligned" ]; then + outputopt=" -c $strategy -r $TMPFILE/order $f2clext " + elif [ $outputformat = "clustal" -a $outorder = "input" ]; then + outputopt=" -c $strategy $f2clext " + elif [ $outputformat = "phylip" -a $outorder = "aligned" ]; then + outputopt=" -y -r $TMPFILE/order " + elif [ $outputformat = "phylip" -a $outorder = "input" ]; then + outputopt=" -y " + elif [ $outputformat = "pir" -a $outorder = "aligned" ]; then + outputopt=" -f -r $TMPFILE/order " + else + outputopt="-f" + fi + + if [ $newdash_originalsequenceonly -eq 1 ]; then + outputopt="$outputopt -d " + fi +# kokomade + + + + pushd "$TMPFILE" > /dev/null + + cat /dev/null > pre + +# echo "nseq = " $nseq 1>>"$progressfile" +# echo "distance = " $distance 1>>"$progressfile" +# echo "iterate = " $iterate 1>>"$progressfile" +# echo "cycle = " $cycle 1>>"$progressfile" + + + if [ $anysymbol -eq 1 ]; then + mv infile orig + "$prefix/replaceu" $seqtype -i orig > infile 2>>"$progressfile" || exit 1 + fi + + if [ $mergetable != "/dev/null" ]; then + if [ $nadd -gt "0" ]; then + echo "Impossible" 1>&2 + exit 1 + fi +# if [ $seed != "x" -o $seedtable != "x" ]; then +# echo "This version does not support the combination of merge and seed." 1>&2 +# exit 1 +# fi +# iterate=0 # 2013/04/16 + mergearg="-H $seedoffset" + fi + + if [ $adjustdirection -gt 0 ]; then + if [ $fragment -ne 0 ]; then + fragarg="-F" # + else + fragarg="-F" # 2014/02/06, do not consider other additional sequences, even in the case of --add + fi + if [ $adjustdirection -eq 1 ]; then + "$prefix/makedirectionlist" $fragarg -C $numthreads -m -I $nadd -i infile -t 0.00 -r 5000 -o a > _direction 2>>"$progressfile" + elif [ $adjustdirection -eq 2 ]; then + "$prefix/makedirectionlist" $fragarg -C $numthreads -m -I $nadd -i infile -t 0.00 -r 100 -o a -d > _direction 2>>"$progressfile" + fi + "$prefix/setdirection" $mergearg -d _direction -i infile > infiled 2>>"$progressfile" || exit + mv infiled infile + if [ $anysymbol -eq 1 ]; then + "$prefix/setdirection" $mergearg -d _direction -i orig -r > origd 2>>"$progressfile" || exit + mv origd orig + fi + fi + + if [ $seed != "x" -o $seedtable != "x" ]; then + if [ $pdblist != "/dev/null" -o $ownlist != "/dev/null" ]; then + echo "The combination of --seed and (--pdbidlist or --pdbfilelist) is impossible." 1>>"$progressfile" + exit 1 + fi +# if [ $enrich -eq 1 ]; then +# echo "The combination of --seed and (--enrich, --enrichseq or --enrichstr) is impossible at present." 1>>"$progressfile" +# exit 1 +# fi + + if [ $newdash -eq 1 ]; then + echo "The combination of --seed and --dash is impossible at present." 1>>"$progressfile" + exit 1 + fi + fi + + +# if [ $enrich -eq 1 ]; then +# if [ $ownlist != "/dev/null" ]; then +# echo "Warning: Sequence homologs of the structures given with the --pdbfilelist option cannot be collected.\n" 1>>"$progressfile" +# fi +# echo "SEEKQUENCER (http://sysimm.ifrec.osaka-u.ac.jp/seekquencer/) is" 1>>"$progressfile" +# if [ $pdblist != "/dev/null" ]; then +# echo "collecting homoplogs of the input sequences and the structures given with the --pdbidlist option." 1>>"$progressfile" +# perl "$prefix/seekquencer_premafft.pl" $seektarget -run thread -trd 2 -seqd uniref90 -blim 1000 -noin -seqf infile -idf pdblist -out seekout -mod mafftash-split 2>>"seekerr" +# seekres="$?" +# else +# echo "collecting homologs of the input sequences." 1>>"$progressfile" +# perl "$prefix/seekquencer_premafft.pl" $seektarget -run thread -trd 2 -seqd uniref90 -blim 1000 -noin -seqf infile -out seekout -mod mafftash-split 2>>"seekerr" +# seekres="$?" +# fi +# cat seekerr 1>>"$progressfile" +# +# if [ $seekres -ne "0" ]; then +# echo "Error in SEEKQUENCER" 1>>"$progressfile" +# exit 1; +# fi +# echo "Done." 1>>"$progressfile" +# +# if [ $enrichseq -eq 1 ]; then +## cat seekout.seq >> infile +# if [ $anysymbol -eq 1 ]; then +# "$prefix/replaceu" $seqtype -i seekout.seq -o $nseq >> infile +# cat seekout.seq >> orig +# else +# "$prefix/replaceu" $seqtype -i seekout.seq | sed 's/_os_[0-9]*_oe_//' >> infile +# fi +# +# fi +# if [ $enrichstr -eq 1 ]; then +# nseekstr=`wc -l < seekout.str` +# if [ $nseekstr -gt 1 ]; then +# cat seekout.str >> pdblist +# pdblist="tsukaimasu" +# fi +# fi +# fi + + if [ $seed != "x" ]; then + mv infile infile2 + if [ $anysymbol -eq 1 ]; then + mv orig orig2 + cat /dev/null > orig + fi + cat /dev/null > infile + cat /dev/null > hat3.seed + seedoffset=0 +# echo "seednseq="$seednseq +# echo "seedoffset="$seedoffset + set $seednseq >> "$progressfile" +# echo $# + while [ $# -gt 1 ] + do + shift +# echo "num="$# + + if [ $anysymbol -eq 1 ]; then + cat seed$# >> orig + "$prefix/replaceu" $seqtype -i seed$# -o $seedoffset > clean 2>>"$progressfile" || exit 1 + mv clean seed$# + fi + "$prefix/multi2hat3s" -t $nseq -o $seedoffset -i seed$# >> infile 2>>"$progressfile" || exit 1 + cat hat3 >> hat3.seed +# echo "$1" + seedoffset=`expr $seedoffset + $1` +# echo "$1" +# echo "seedoffset="$seedoffset + done; +# echo "seedoffset="$seedoffset + if [ $anysymbol -eq 1 ]; then + "$prefix/replaceu" $seqtype -i orig2 -o $seedoffset >> infile 2>>"$progressfile" || exit 1 # yarinaoshi + cat orig2 >> orig + else + cat infile2 >> infile + fi + elif [ $seedtable != "x" ]; then + cat _seedtablefile > hat3.seed + elif [ $newdash -eq 1 ]; then + seemstobe=`"$prefix/countlen" -i infile | awk '{print $6}'` + if [ $seemstobe = "d" -a "x$seqtype" != "x-P" ]; then + echo "" 1>>"$progressfile" + echo "Error: This data seems to be nucleotide sequences." 1>>"$progressfile" + echo "Add the --amino flag if this is surely protein." 1>>"$progressfile" + echo "" 1>>"$progressfile" + exit 1; + fi + if [ $anysymbol -eq 1 ]; then + mv orig infile # replaceu wo mukouka + fi + sed 's/-//g' infile > dashin # gap nozoku + + if [ ! -x "$prefix/dash_client" -o ! -x "$prefix/dash_client" ]; then + echo "" 1>&2 + echo "== Install DASH client =====================================================" 1>&2 + echo "To use this feature, uncomment the following line in Makefile" 1>&2 + echo "DASH_CLIENT = dash_client" 1>&2 + echo "and re-compile the source." 1>&2 + echo "Note that it requires the 'Go' compiler." 1>&2 + echo "============================================================================" 1>&2 + echo "" 1>&2 + exit 1 + fi + + echo "Calling DASH (https://sysimm.org/dash/)" 1>>"$progressfile" + "$prefix/dash_client" -url "$dashserver" -i dashin -sequences dashsequences -hat3 hat3.seed 1>>"$progressfile" + dashres="$?" + if [ $dashres -ne "0" ]; then + echo "Error in DASH" 1>>"$progressfile" + echo "To enable this feature, compile with DASH_CLIENT=dash_client. Go compiler is necessary." 1>>"$progressfile" + exit 1; + fi + + if [ $exclude_ho -eq 1 ]; then # amari yokunai + awk 'BEGIN{out=1} !/^>_addedbymaffte_/{if(out) print; out=1} /^>_addedbymaffte_/{out=0}' dashsequences | sed 's/>DASH_/>DASH|/' > ho_excluded + mv ho_excluded dashsequences + fi + + if [ "$mergetable" != "/dev/null" ]; then # 2020/Apr/30 + ndash=`grep -c '>DASH_' dashsequences | head -1` +# echo "ndash = " $ndash + awk "{for( i=1;i<=NF;i++){if(0+\$i==0)break; printf( \"%d \", $ndash+\$i); } print \"\" }" _subalignmentstable > _subalignmentstableshifted + mv _subalignmentstableshifted _subalignmentstable + cp dashsequences dashsequences.bk + awk "BEGIN{nout=0} {if(\$1~/^>/) nout++; if( nout <= $ndash ) print;}" dashsequences > infile2 + cat infile >> infile2 + cp infile2 dashsequences + fi + + sed 's/>DASH_/>DASH|/' dashsequences > renamed + mv renamed dashsequences + echo "Done." 1>>"$progressfile" +# cat hat3.seed + seedoffset=`grep -c '^[>|=]' dashsequences | head -1 ` + echo "# of structures = " 1>>"$progressfile" + echo $seedoffset 1>>"$progressfile" + if [ $anysymbol -eq 1 ]; then + cat dashsequences >> orig + "$prefix/replaceu" $seqtype -i dashsequences -o 0 > clean 2>>"$progressfile" || exit 1 + mv clean infile + +# "$prefix/replaceu" $seqtype -i orig2 -o $seedoffset >> infile 2>>"$progressfile" || exit 1 # yarinaoshi +# cat orig2 >> orig + else + cat dashsequences > infile +# cat infile2 >> infile + fi + else + cat /dev/null > hat3.seed + fi +# cat hat3.seed + + if [ $mccaskill -eq 1 ]; then + "$prefix/mccaskillwrap" -s -C $numthreads -d "$prefix" -i infile > hat4 2>>"$progressfile" || exit 1 + elif [ $dafs -eq 1 ]; then + "$prefix/mccaskillwrap" -G -C $numthreads -d "$prefix" -i infile > hat4 2>>"$progressfile" || exit 1 + elif [ $contrafold -eq 1 ]; then + "$prefix/contrafoldwrap" -d "$prefix" -i infile > hat4 2>>"$progressfile" || exit 1 + fi + if [ $distance = "fasta" ]; then + "$prefix/dndfast7" $swopt < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "blast" ]; then + "$prefix/dndblast" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "foldalignlocal" ]; then + "$prefix/pairlocalalign" -C $numthreads $seqtype $foldalignopt $model -g $lexp -f $lgop -Q $spfactor -h $laof -H -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "foldalignglobal" ]; then + "$prefix/pairlocalalign" -C $numthreads $seqtype $foldalignopt $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -H -o -global -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "slara" ]; then + "$prefix/pairlocalalign" -C $numthreads -p $laraparams $seqtype $model -f $lgop -Q $spfactor -T -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "lara" ]; then + "$prefix/pairlocalalign" -C $numthreads -p $laraparams $seqtype $model -f $lgop -Q $spfactor -B -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "scarna" ]; then +# "$prefix/pairlocalalign" -C $numthreads $seqtype $model -f $pggop -Q $spfactor -s -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 +# cat hat3.seed hat3 > hatx +# mv hatx hat3 +# "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + "$prefix/tbfast" _ -C $numthreads $seqtype $model -f $pggop -Q $spfactor -s -d "$prefix" _ -+ $iterate -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "dafs" ]; then + "$prefix/pairlocalalign" -C $numthreads $seqtype $model -f $pggop -Q $spfactor -G -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "global" -a $memsavetree -eq 1 ]; then + if [ "$mpiscript" != "/dev/null" ]; then + sh $mpiscript "$prefix/nodepair_mpi" $lhlimit -u $unalignlevel $localparam $seqtype $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -A $usenaivepairscore $focusarg $treeinopt $treeoutopt -i infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/nodepair" $lhlimit -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -A $usenaivepairscore $focusarg $treeinopt $treeoutopt -i infile > /dev/null 2>>"$progressfile" || exit 1 + fi + echo 'nodepair' > _guidetree + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt -U $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "local" -a $memsavetree -eq 1 ]; then + if [ "$mpiscript" != "/dev/null" ]; then + sh $mpiscript "$prefix/nodepair_mpi" $lhlimit -u $unalignlevel $localparam $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -L $usenaivepairscore $focusarg $treeinopt $treeoutopt -i infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/nodepair" $lhlimit -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -L $usenaivepairscore $focusarg $treeinopt $treeoutopt -i infile > /dev/null 2>>"$progressfile" || exit 1 + fi + + echo 'nodepair' > _guidetree + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt -U $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "localgenaf" -a $memsavetree -eq 1 ]; then + "$prefix/nodepair" $lhlimit -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -O $LGOP -E $LEXP -N $usenaivepairscore $focusarg $treeinopt $treeoutopt -i infile > /dev/null 2>>"$progressfile" || exit 1 + echo 'nodepair' > _guidetree + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt -U $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "global" -a $memsavetree -eq 0 ]; then + "$prefix/tbfast" _ -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -A $usenaivepairscore $focusarg _ -+ $iterate -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + + elif [ $distance = "local" -a $memsavetree -eq 0 ]; then + if [ $fragment -ne 0 ]; then + "$prefix/pairlocalalign" $localparam $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -L $usenaivepairscore < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/addsingle" -Q 100 $legacygapopt -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/tbfast" _ -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -L $usenaivepairscore $focusarg _ -+ $iterate -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + fi + elif [ $distance = "globalgenaf" ]; then + "$prefix/pairlocalalign" -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -O $GGOP -E $GEXP -K $usenaivepairscore < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "localgenaf" -a $memsavetree -eq 0 ]; then + "$prefix/tbfast" _ -u $unalignlevel $localparam -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -O $LGOP -E $LEXP -N $usenaivepairscore $focusarg _ -+ $iterate -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg $focusarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "last" ]; then + if [ $fragment -ne 0 ]; then + "$prefix/pairlocalalign" $addarg -C $numthreads $seqtype $model -e $last_e -w $last_m -g $lexp -f $lgop -Q $spfactor -h $laof -R $last_subopt $last_once -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/addsingle" -Q 100 $legacygapopt -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/pairlocalalign" -C $numthreads $seqtype $model -e $last_e -w $last_m -g $lexp -f $lgop -Q $spfactor -h $laof -R $last_subopt $last_once -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 +# addarg wo watasanai + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + fi + elif [ $distance = "lastmulti" ]; then + "$prefix/dndpre" $model -M 2 $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof < infile > /dev/null 2>>"$progressfile" || exit 1 + mv hat2 hat2i + "$prefix/pairlocalalign" $addarg -C $numthreads $seqtype $model -e $last_e -w $last_m -g $lexp -f $lgop -Q $spfactor -h $laof -r $last_subopt $last_once -d "$prefix" < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hat2 hat2n + mv hatx hat3 + if [ $fragment -ne 0 ]; then + "$prefix/addsingle" -Q 100 $legacygapopt -d -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + echo "Impossible" 1>&2 + exit 1 + fi + elif [ $distance = "multi" ]; then + "$prefix/dndpre" $model -M 2 $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -h $laof $usenaivepairscore < infile > /dev/null 2>>"$progressfile" || exit 1 + mv hat2 hat2i + "$prefix/pairlocalalign" $localparam $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -Y $usenaivepairscore < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hat2 hat2n + mv hatx hat3 + if [ $fragment -ne 0 ]; then + "$prefix/addsingle" -Q 100 $legacygapopt -d -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + echo "Impossible" 1>&2 + exit 1 + fi + elif [ $distance = "hybrid" ]; then + "$prefix/pairlocalalign" $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -Q $spfactor -h $laof -Y < infile > /dev/null 2>>"$progressfile" || exit 1 + cat hat3.seed hat3 > hatx + mv hatx hat3 + "$prefix/disttbfast" -E 1 -s $unalignlevel $legacygapopt -W $tuplesize $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreads-$numthreadstb $memopt $weightopt $treeinopt $treeoutopt -T -y $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + if [ $fragment -ne 0 ]; then + "$prefix/addsingle" -Q 100 $legacygapopt -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + fi +# elif [ $distance = "distonly" ]; then +# "$prefix/pairlocalalign" -C $numthreads $seqtype $model -g $pgexp -f $pggop -Q $spfactor -h $pgaof -t < infile > /dev/null 2>>"$progressfile" || exit 1 +# "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $outnum $addarg $add2ndhalfarg -C $numthreadstb $rnaopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + elif [ $distance = "parttree" ]; then + "$prefix/splittbfast" $legacygapopt $algopt $splitopt $partorderopt $parttreeoutopt $memopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof -p $partsize -s $groupsize $treealg $outnum -i infile > pre 2>>"$progressfile" || exit 1 + mv hat3.seed hat3 + elif [ $distance = "ktuplesmulti" ]; then +# "$prefix/dndpre" $model -M 1 $addarg -C $numthreads $seqtype $model -g $lexp -f $lgop -h $laof < infile > /dev/null 2>>"$progressfile" || exit 1 +# mv hat2 hat2i +# "$prefix/disttbfast" -E 1 -s $unalignlevel $legacygapopt -W $tuplesize $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreads-$numthreadstb $memopt $weightopt $treeinopt $treeoutopt -T -y $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 +# mv hat2 hat2n + if [ $fragment -ne 0 ]; then + "$prefix/addsingle" -Q 100 $legacygapopt -d -W $tuplesize -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 +# "$prefix/addsingle" -Q 100 $legacygapopt -d -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + echo "Impossible" 1>&2 + exit 1 + fi + else + if [ $fragment -ne 0 ]; then + "$prefix/addsingle" -Q 100 $legacygapopt -W $tuplesize -O $outnum $addsinglearg $addarg $add2ndhalfarg -C $numthreads $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -f "-"$gop -h $aof $param_fft $localparam $algopt $treealg $scoreoutarg < infile > /dev/null 2>>"$progressfile" || exit 1 + else + "$prefix/disttbfast" -q $npickup -E $cycledisttbfast -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg -W $tuplesize $termgapopt $outnum $addarg $add2ndhalfarg -C $numthreads-$numthreadstb $memopt $weightopt $treeinopt $treeoutopt $distoutopt $seqtype $model -g $gexp -f "-"$gop -Q $spfactor -h $aof $param_fft $algopt $treealg $scoreoutarg $anchoropt -x $maxanchorseparation $oneiterationopt < infile > pre 2>>"$progressfile" || exit 1 + mv hat3.seed hat3 + fi + fi + while [ $cycletbfast -gt 1 ] + do + if [ $distance = "parttree" ]; then + mv pre infile + "$prefix/splittbfast" $legacygapopt -Z $algopt $splitopt $partorderopt $parttreeoutopt $memopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof -p $partsize -s $groupsize $treealg $outnum -i infile > pre 2>>"$progressfile" || exit 1 + else + "$prefix/tbfast" -W $minimumweight -V "-"$gopdist -s $unalignlevel $legacygapopt $mergearg $termgapopt $outnum -C $numthreadstb $rnaopt $weightopt $treeoutopt $distoutopt $memopt $seqtype $model -f "-"$gop -Q $spfactor -h $aof $param_fft $localparam $algopt -J $treealg $scoreoutarg < pre > /dev/null 2>>"$progressfile" || exit 1 +# fragment>0 no baai, nanimoshinai +# seed youchuui!! + fi + cycletbfast=`expr $cycletbfast - 1` + done + if [ $iterate -gt 0 ]; then + if [ $distance = "ktuples" ]; then + "$prefix/dndpre" $seqtype $model -M 2 -C $numthreads < pre > /dev/null 2>>"$progressfile" || exit 1 + fi + "$prefix/dvtditr" -W $minimumweight $bunkatsuopt -E $fixthreshold -s $unalignlevel $legacygapopt $mergearg $outnum -C $numthreadsit -t $randomseed $rnaoptit $memopt $scorecalcopt $localparam -z 50 $seqtype $model -f "-"$gop -Q $spfactor -h $aof -I $iterate $weightopt $treeinopt $algoptit $treealg -p $parallelizationstrategy $scoreoutarg -K $nadd < pre > /dev/null 2>>"$progressfile" || exit 1 + fi + if [ $coreout -eq 1 ]; then + "$prefix/setcore" -w $corewin -i $corethr $coreext < pre > pre2 + mv pre2 pre + elif [ $anysymbol -eq 1 ]; then + "$prefix/restoreu" $add2ndhalfarg -a pre -i orig > restored || exit 1 + mv restored pre + fi + + + + + echo '' 1>>"$progressfile" + if [ $mccaskill -eq 1 ]; then + echo "RNA base pairing probaility was calculated by the McCaskill algorithm (1)" 1>>"$progressfile" + echo "implemented in Vienna RNA package (2) and MXSCARNA (3), and then" 1>>"$progressfile" + echo "incorporated in the iterative alignment process (4)." 1>>"$progressfile" + echo "(1) McCaskill, 1990, Biopolymers 29:1105-1119" 1>>"$progressfile" + echo "(2) Hofacker et al., 2002, J. Mol. Biol. 319:3724-3732" 1>>"$progressfile" + echo "(3) Tabei et al., 2008, BMC Bioinformatics 9:33" 1>>"$progressfile" + echo "(4) Katoh and Toh, 2008, BMC Bioinformatics 9:212" 1>>"$progressfile" + echo "" 1>>"$progressfile" + elif [ $contrafold -eq 1 ]; then + echo "RNA base pairing probaility was calculated by the CONTRAfold algorithm (1)" 1>>"$progressfile" + echo "and then incorporated in the iterative alignment process (4)." 1>>"$progressfile" + echo "(1) Do et al., 2006, Bioinformatics 22:e90-98" 1>>"$progressfile" + echo "(2) Katoh and Toh, 2008, BMC Bioinformatics 9:212" 1>>"$progressfile" + echo "" 1>>"$progressfile" + fi + if [ $pdblist != "/dev/null" -o $ownlist != "/dev/null" ]; then + echo "Input structures are decomposed into structural domains using" 1>>"$progressfile" + echo "Protein Domain Parser (Alexandrov & Shindyalov 2003)." 1>>"$progressfile" + echo "Domain pairs are aligned using the rash function in" 1>>"$progressfile" + echo "the ASH structural alignment package (Standley et al. 2007)." 1>>"$progressfile" + fi + if [ $pdblist != "/dev/null" ]; then + echo "Pre-computed alignments stored in " 1>>"$progressfile" + echo "DASH (http://sysimm.ifrec.osaka-u.ac.jp/dash/) are used. " 1>>"$progressfile" + fi + if [ $distance = "fasta" -o $partdist = "fasta" ]; then + echo "Pairwise alignments were computed by FASTA" 1>>"$progressfile" + echo "(Pearson & Lipman, 1988, PNAS 85:2444-2448)" 1>>"$progressfile" + fi + if [ $distance = "blast" ]; then + echo "Pairwise alignments were computed by BLAST" 1>>"$progressfile" + echo "(Altschul et al., 1997, NAR 25:3389-3402)" 1>>"$progressfile" + fi + if [ $distance = "last" -o $distance = "lastmulti" ]; then + echo "Pairwise alignments were computed by LAST" 1>>"$progressfile" + echo "http://last.cbrc.jp/" 1>>"$progressfile" + echo "Kielbasa, Wan, Sato, Horton, Frith 2011 Genome Res. 21:487" 1>>"$progressfile" + fi + if [ $distance = "scarna" ]; then + echo "Pairwise alignments were computed by MXSCARNA" 1>>"$progressfile" + echo "(Tabei et al., 2008, BMC Bioinformatics 9:33)." 1>>"$progressfile" + fi + if [ $distance = "dafs" ]; then + echo "Pairwise alignments were computed by DAFS" 1>>"$progressfile" + echo "(Sato et al., 2012,,,,)." 1>>"$progressfile" + fi + if [ $distance = "lara" -o $distance = "slara" ]; then + echo "Pairwise alignments were computed by LaRA" 1>>"$progressfile" + echo "(Bauer et al., 2007, BMC Bioinformatics 8:271)." 1>>"$progressfile" + fi + if [ $distance = "foldalignlocal" ]; then + echo "Pairwise alignments were computed by FOLDALIGN (local)" 1>>"$progressfile" + echo "(Havgaard et al., 2007, PLoS Computational Biology 3:e193)." 1>>"$progressfile" + fi + if [ $distance = "foldalignglobal" ]; then + echo "Pairwise alignments were computed by FOLDALIGN (global)" 1>>"$progressfile" + echo "(Havgaard et al., 2007, PLoS Computational Biology 3:e193)." 1>>"$progressfile" + fi +# printf "\n" 1>>"$progressfile" + echo 'Strategy:' 1>>"$progressfile" + printf ' '$strategy 1>>"$progressfile" + echo ' ('$performance')' 1>>"$progressfile" + echo ' '$explanation 1>>"$progressfile" + echo '' 1>>"$progressfile" + echo "If unsure which option to use, try 'mafft --auto input > output'." 1>>"$progressfile" + echo "For more information, see 'mafft --help', 'mafft --man' and the mafft page." 1>>"$progressfile" + echo "" 1>>"$progressfile" + echo "The default gap scoring scheme has been changed in version 7.110 (2013 Oct)." 1>>"$progressfile" + echo "It tends to insert more gaps into gap-rich regions than previous versions." 1>>"$progressfile" + echo "To disable this change, add the --leavegappyregion option." 1>>"$progressfile" +# echo "If long gaps are expected, try 'mafft --ep 0.0 --auto input > output'." 1>>"$progressfile" +# echo "If the possibility of long gaps can be excluded, add '--ep 0.123'." 1>>"$progressfile" + if [ $distance = "localgenaf" -o $distance = "globalgenaf" ]; then + echo "" 1>>"$progressfile" + if [ $oldgenafparam -eq 1 ]; then + echo "Obsolete parameters used for this calculation." 1>>"$progressfile" + echo "Also try the new parameters for E-INS-i, by not specifying --oldgenafpair." 1>>"$progressfile" + else + echo "Parameters for the E-INS-i option have been changed in version 7.243 (2015 Jun)." 1>>"$progressfile" + echo "To switch to the old parameters, use --oldgenafpair, instead of --genafpair." 1>>"$progressfile" + fi + fi + echo '' 1>>"$progressfile" + + + if [ $pdblist != "/dev/null" -o $ownlist != "/dev/null" ]; then +# cat dasherr >>"$progressfile" + echo '' >>"$progressfile" + fi + + popd > /dev/null + + if [ "$outputopt" != "-f" -o "$windows" = "yes" ]; then # Windows deha kaigyo code wo f2cl de modosu. +# ln -s "$TMPFILE/order" _order$$ # f2cl ga space ari filename ni taiou shiteinainode +# cp "$TMPFILE/order" _order$$ # ln -s no error wo sakeru + if [ "$outputfile" = "" ]; then + "$prefix/f2cl" -n $namelength $outputopt < "$TMPFILE/pre" 2>"/dev/null" || exit 1 + else + "$prefix/f2cl" -n $namelength $outputopt < "$TMPFILE/pre" > "$outputfile" 2>"/dev/null" || exit 1 + fi +# rm _order$$ + else + if [ "$outputfile" = "" ]; then + cat < "$TMPFILE/pre" || exit 1 + else + cat < "$TMPFILE/pre" > "$outputfile" || exit 1 + fi + fi + + if [ $treeout -eq 1 ]; then + cp "$TMPFILE/infile.tree" "$infilename.tree" + fi + + if [ -s "$TMPFILE/GuideTree" ]; then # --merge no toki dake + cp "$TMPFILE/GuideTree" . + fi + + if [ $distout -eq 1 ]; then + cp "$TMPFILE/hat2" "$infilename.hat2" + fi + + if [ $npickup -ne 0 ]; then + cp "$TMPFILE/notused" "$infilename.notused" + fi + + if [ -s "$TMPFILE/_deletemap" ]; then + if [ "$mapoutfile" = "/dev/null" ]; then + cp "$TMPFILE/_deletemap" "$addfile.map" + else + cp "$TMPFILE/_deletemap" "$mapoutfile" + fi + fi + + exit 0; +fi + +prog="awk" + +#tmpawk=`which nawk 2>/dev/null | awk '{print $1}'` +#if [ -x "$tmpawk" ]; then +# prog="$tmpawk" +#fi +# +#tmpawk=`which gawk 2>/dev/null | awk '{print $1}'` +#if [ -x "$tmpawk" ]; then +# prog="$tmpawk" +#fi +# 2017/May/12, Windows no gawk wo sakeru tame + +#echo "prog="$prog 1>&2 + +umask 077 +( +$prog ' +BEGIN { + prefix = ENVIRON["prefix"]; + version = ENVIRON["version"]; + myself = ENVIRON["myself"]; + pwd = ENVIRON["mafft_working_dir"]; # from mafft.bat on windows + if( pwd == "" ) pwd = ENVIRON["PWD"]; + while( 1 ) + { + options = "" + printf( "\n" ) > "/dev/tty"; + printf( "---------------------------------------------------------------------\n" ) > "/dev/tty"; + printf( "\n" ) > "/dev/tty"; + printf( " MAFFT %s\n", version ) > "/dev/tty"; + printf( "\n" ) > "/dev/tty"; +# printf( " Copyright (c) 2002- Kazutaka Katoh\n" ) > "/dev/tty"; + printf( " MBE 30:772-780 (2013), NAR 30:3059-3066 (2002)\n" ) > "/dev/tty"; + printf( " https://mafft.cbrc.jp/alignment/software/\n" ) > "/dev/tty"; + printf( "---------------------------------------------------------------------\n" ) > "/dev/tty"; + printf( "\n" ) > "/dev/tty"; + + while( 1 ) + { + printf( "\n" ) > "/dev/tty"; + printf( "Input file? (FASTA format; Folder=%s)\n@ ", pwd ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ) + if( res == 0 || NF == 0 ) + continue; + infile = sprintf( "%s", $0 ); + + res = getline < infile; + close( infile ); + if( res == -1 ) + { + printf( "%s: No such file.\n\n", infile ) > "/dev/tty"; + printf( "Filename extension (eg., .txt) must be typed, if any.\n\n" ) > "/dev/tty"; + } + else if( res == 0 ) + printf( "%s: Empty.\n", infile ) > "/dev/tty"; + else + { + printf( "OK. infile = %s\n\n", infile ) > "/dev/tty"; + break; + } + } + nseq = 0; + + while( 1 ) + { + printf( "\n" ) > "/dev/tty"; + printf( "Output file?\n" ) > "/dev/tty"; + printf( "@ " ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ); + if( res == 0 || NF == 0 ) + continue; + else + { + outfile = sprintf( "%s", $0 ); + printf( "OK. outfile = %s\n\n", outfile ) > "/dev/tty"; + break; + } + } + + while( 1 ) + { + outargs = ""; + printf( "\n" ) > "/dev/tty"; + printf( "Output format?\n" ) > "/dev/tty"; + printf( " 1. Clustal format / Sorted\n" ) > "/dev/tty"; + printf( " 2. Clustal format / Input order\n" ) > "/dev/tty"; + printf( " 3. Fasta format / Sorted\n" ) > "/dev/tty"; + printf( " 4. Fasta format / Input order\n" ) > "/dev/tty"; + printf( " 5. Phylip format / Sorted\n" ) > "/dev/tty"; + printf( " 6. Phylip format / Input order\n" ) > "/dev/tty"; + printf( "@ " ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ); +# printf( "res=%d, NF=%d\n", res, NF ); + + resnum = 0 + $1; +# printf( "resnum=%d\n", resnum ); + + if( resnum < 1 || 6 < resnum ) + continue; + else + { + if( resnum == 1 ) + outargs = "--clustalout --reorder"; + else if( resnum == 2 ) + outargs = "--clustalout --inputorder"; + else if( resnum == 3 ) + outargs = "--reorder"; + else if( resnum == 4 ) + outargs = "--inputorder"; + else if( resnum == 5 ) + outargs = "--phylipout --reorder"; + else if( resnum == 6 ) + outargs = "--phylipout --inputorder"; + else + continue; + printf( "OK. arguments = %s\n\n", outargs ) > "/dev/tty"; + break; + } + } + + while( 1 ) + { + arguments = ""; + printf( "\n" ) > "/dev/tty"; + printf( "Strategy?\n" ) > "/dev/tty"; + printf( " 1. --auto\n" ) > "/dev/tty"; + printf( " 2. FFT-NS-1 (fast)\n" ) > "/dev/tty"; + printf( " 3. FFT-NS-2 (default)\n" ) > "/dev/tty"; + printf( " 4. G-INS-i (accurate)\n" ) > "/dev/tty"; + printf( " 5. L-INS-i (accurate)\n" ) > "/dev/tty"; + printf( " 6. E-INS-i (accurate)\n" ) > "/dev/tty"; + printf( "@ " ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ); +# printf( "res=%d, NF=%d\n", res, NF ); + + resnum = 0 + $1; +# printf( "resnum=%d\n", resnum ); + + if( resnum < 1 || 6 < resnum ) + continue; + else + { + if( resnum == 1 ) + arguments = "--auto"; + else if( resnum == 2 ) + arguments = "--retree 1"; + else if( resnum == 3 ) + arguments = "--retree 2"; + else if( resnum == 4 ) + arguments = "--globalpair --maxiterate 16"; + else if( resnum == 5 ) + arguments = "--localpair --maxiterate 16"; + else if( resnum == 6 ) + arguments = "--genafpair --maxiterate 16"; + else + arguments = sprintf( "%s", $0 ); + printf( "OK. arguments = %s %s\n\n", arguments, outargs ) > "/dev/tty"; + break; + } + } + + + while( 1 ) + { + printf( "\n" ) > "/dev/tty"; + printf( "Additional arguments? (--ep # --op # --kappa # etc)\n" ) > "/dev/tty"; + printf( "@ " ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ); + if( res == 0 || NF == 0 ) + { + break; + } + else + { + addargs = sprintf( "%s", $0 ); + printf( "OK. arguments = %s %s %s\n\n", addargs, arguments, outargs ) > "/dev/tty"; + break; + } + } + + arguments = sprintf( "%s %s %s", addargs, arguments, outargs ); + + print "" + command = sprintf( "\"%s\" %s \"%s\" > \"%s\"", myself, arguments, infile, outfile ); + gsub( /\\/, "/", command ); + + + printf( "command=\n%s\n", command ) > "/dev/tty"; + + + while( 1 ) + { + go = 0; + printf( "Type Y or just enter to run this command.\n" ) > "/dev/tty"; + printf( "@ " ) > "/dev/tty"; + res = getline < "/dev/tty"; + close( "/dev/tty" ); + if( res == 0 ) + continue; + else if( NF == 0 || $0 ~ /^[Yy]/ ) + { + go=1; + break; + } + else + break; + } + if( go ) break; + printf( "\n" ) > "/dev/tty"; + printf( "\n" ) > "/dev/tty"; + } + system( command ); + command = sprintf( "more \"%s\"", outfile ); + system( command ); + printf( "Press Enter to exit." ) > "/dev/tty"; + res = getline < "/dev/tty"; +} +' +) +exit 0; diff --git a/mafft/src/mafft-7.487-with-extensions/core/mafftash_premafft.tmpl b/mafft/src/mafft-7.487-with-extensions/core/mafftash_premafft.tmpl new file mode 100644 index 0000000000..6dc3b9c421 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mafftash_premafft.tmpl @@ -0,0 +1,464 @@ +#!/usr/bin/perl + +##################################################################### +# Author: KM Amada (kmamada@ifrec.osaka-u.ac.jp) +# +# Ver. Date Changelog +##################################################################### +# 1.0 07.26.13 Initial release +# 2.0 09.03.13 Added extensive warnings and error messages +# 3.0 10.28.13 Fix for retrieving large files. Added STDERR logs +# 3.1 11.08.13 Added LWP failsafe. Made hat3 not a required output +# 3.2 12.08.14 Removed 5-char restriction for own structure files +# +##################################################################### + +use strict; +use Getopt::Long; +use File::Path qw(make_path remove_tree); +use LWP::Simple; +use LWP::UserAgent; + +# to prevent error 'Header line too long (limit is 8192)' [v3.1] +use LWP::Protocol::http; +push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 0); + + + +my $BASEURL = "http://sysimm.ifrec.osaka-u.ac.jp/MAFFTash/REST/service.cgi/premafft"; + +my ( $WORKDIR, $PDBLIST, $OWNLIST, $HAT3FILE, $INSTRFILE ); + +GetOptions +( + 'd=s' => \$WORKDIR, + 'p=s' => \$PDBLIST, + 'o=s' => \$OWNLIST, + 'h=s' => \$HAT3FILE, + 'i=s' => \$INSTRFILE, +); + +print STDERR "[MAFFTash-premafft]\n"; + +# set temp directory +my $TMP = "/tmp/mapremafft$$"; +make_path($TMP) unless -d $TMP; + + + +###### +# validation +&help("Required parameter : atleast one of either '-p' or '-o'") unless ( defined $PDBLIST || defined $OWNLIST); +&help("Required parameter : '-d'") if defined $OWNLIST && ! defined $WORKDIR; + +$HAT3FILE = "hat3" unless defined $HAT3FILE; +$INSTRFILE = "instr" unless defined $INSTRFILE; +chop $WORKDIR if defined $WORKDIR && $WORKDIR =~ m/\/$/g; + + +###### +# prepare inputs +print STDERR "Preparing inputs for service request...\n"; + +my @files = (); +push(@files, "strweight" => "0.5"); +push(@files, "premafft" => "1"); + + +# pdb entries +if ( defined $PDBLIST ) +{ + print STDERR "PDB List defined!\n"; + &bail("Error: Input file $PDBLIST does not exists!") unless -e $PDBLIST; + my $listfile = "$TMP/pdblist.inp"; + + + open(INPF,"<$PDBLIST") or &bail("Error: Cannot open file $PDBLIST for reading!"); + open(OUTF,">$listfile") or &bail("Error: Cannot open temporary file $listfile for writing!"); + + while() + { + chomp; + if ( /^(\w{5})$/ ) + { + print OUTF ">PDBID\n$1\n"; + } + } + + close OUTF; + close INPF; + + push(@files, "inputfile" => ["$listfile"]); +} + + + +# upload own structures +my %ownids = (); + +if ( defined $OWNLIST ) +{ + print STDERR "OWN List defined!\n"; + &bail("Error: Input file $OWNLIST does not exists!") unless -e $OWNLIST; + + + open(OWNINPF,"<$OWNLIST") or &bail("Error: Cannot open file $OWNLIST for reading!"); + + while() + { + chomp; + + if ( /^(\S+)$/ ) + { + my $fileref = "$WORKDIR/$1.pdb"; + + unless (-e $fileref) + { + close OWNINPF; + &bail("Error: File $fileref does not exists!"); + } + + push(@files, "inputownfile[]" => ["$fileref"]); + $ownids{$1} = 1; + } + } + + close OWNINPF; +} + + + +###### +# start rest service +print STDERR "Sending service request...\n"; + +my $browser = LWP::UserAgent->new; +$browser->timeout(0); + + +# post: running a mafftash job +my $postResponse = $browser->post( $BASEURL, \@files, 'Content_Type' => 'form-data' ); +&bail(sprintf("[%d] %s\n", $postResponse->code, &parseError($postResponse->content))) unless($postResponse->is_success); + + +# get response from post request +my ($status, $mafftashid) = &parseResponse($postResponse->content); + + + +my $MAXTRIES = 3; +my $STIMER = 4; +my $longtimer = 0; + +print STDERR "Request sent! Waiting for response...[$mafftashid]\n"; + + +# wait for results until it becomes available +while(1) +{ + $longtimer = $longtimer <= ($STIMER*3) ? $longtimer+$STIMER : $STIMER; + sleep $longtimer; + + + # get: get results for mafftash job + my $getResponse = $browser->get("$BASEURL/$mafftashid"); + + if ( $getResponse->is_success ) + { + + # get response from get request + ($status, $mafftashid) = &parseResponse($getResponse->content); + next unless ( $status eq "done" ); + + + # if job is finished and ready + print STDERR "Results found!\n"; + my $csfile = "$TMP/checksum.tar.gz"; + my $try1 = 1; + + + while(1) + { + print STDERR "Fetching Results... [Trial $try1]\n"; + + if ( is_success(getstore("$BASEURL/getmdlist/$mafftashid", $csfile)) && -e $csfile && -s $csfile ) + { + # get response from get request + my $checklist = &extractchecksum($csfile); + &bail("Error retrieving list of compressed files!") unless ( scalar %$checklist > 0 ); + + + foreach my $id ( keys %$checklist ) + { + my $checkfile = "$TMP/$id"; + my $checkid = $checklist->{$id}; + my $try2 = 1; + + while(1) + { + unlink $checkfile if -e $checkfile; + + if ( is_success(getstore("$BASEURL/get/$mafftashid/$id", $checkfile)) && -e $checkfile && -s $checkfile ) + { + my $hashid = &getchecksum($checkfile); + #print STDERR "[hashid]$hashid [checkid]$checkid\n"; + + if ($hashid ne "" && $hashid ne $checkid ) + { + unlink $checkfile if -e $checkfile; + &bail("Error retrieving compressed file from server! [Checksum Failed]") if $try2 >= $MAXTRIES; + $try2++; + sleep $STIMER; + } + else + { + last; + } + } + else + { + &bail("Error retrieving compressed file from server!") if $try2 >= $MAXTRIES; + $try2++; + sleep $STIMER; + } + } + } + + last; + } + else + { + &bail("Error retrieving list of compressed files from server!") if $try1 >= $MAXTRIES; + $try1++; + sleep $STIMER; + } + } + + last; + + } + else + { + &bail(sprintf("[%d] %s\n", $getResponse->code, &parseError($getResponse->content))); + } + +} + + +# make sure outputs were generated +# decompress +print STDERR "Assembling final results...\n"; + +&backticks("cat $TMP/archive.tar.gz* | tar -zxf - -C $TMP/"); +&backticks("mv -f $TMP/instr $INSTRFILE") if -e "$TMP/instr"; +&backticks("mv -f $TMP/hat3 $HAT3FILE") if -e "$TMP/hat3"; + +# sometimes no hat3 file is generated [v3.1] +#&bail("Error: Output file $HAT3FILE not found!") unless -e $HAT3FILE; +&bail("Error: Output file $INSTRFILE not found!") unless -e $INSTRFILE; + + +# warn if some ownids were ommitted +if ( scalar keys(%ownids) > 0 ) +{ + my %instrids = (); + + open(INSTRF,"<$INSTRFILE") or &bail("Error: Cannot open file $INSTRFILE for reading!"); + + while() + { + chomp; + + if ( /^>\d+_(\S+)$/ ) + { + $instrids{$1} = 1; + } + } + + close INSTRF; + + foreach my $id ( keys %ownids ) + { + warn "Warning: Own structure $id was excluded from instr/hat3.\n" unless $instrids{$id}; + } + +} + + + +&cleanup(); + + + +#################### +#################### + + + +sub parseResponse +{ + my $response = shift; + + #"status":"wait","mafftashid":"Ma8211432R" + + my $status = ""; + my $mafftashid = ""; + + if ( $response =~ /^([^\s:]+):([^\s:]+)$/ ) + { + $mafftashid = $1; + $status = $2; + } + + return ($status, $mafftashid); + +} + + +sub extractchecksum +{ + my $infile = shift; + my %dataset = (); + + open CSUM, "tar -zxf $infile -O|" or return \%dataset; + + while() + { + chomp; + if ( /^(\S+)\s+(\S+)$/ ) + { + $dataset{$2} = $1; + } + + } + + close CSUM; + + return \%dataset; + +} + + +sub parseError +{ + my $response = shift; + + #"error":"Invalid number of inputs found." + my $errorstr = ( $response =~ /\"error\"\s*:\s*\"([^\"]+)\"/ ) ? $1 : ""; + return $errorstr; +} + + +sub getchecksum +{ + my $infile = shift; + + # md5 binary check + my $MD5BIN = ""; + + if ( -x "/usr/bin/md5sum" ) + { + $MD5BIN = "/usr/bin/md5sum"; + } + elsif ( -x "/sbin/md5" ) + { + $MD5BIN = "/sbin/md5 -q"; + } + + return "" if $MD5BIN eq ""; + + + my $checksum = ""; + open MD5EXE, "$MD5BIN $infile|" or return ""; + + while() + { + if (/^(\S+)\s+(\S+)$/) + { + $checksum = $1; + last; + } + elsif (/^(\S+)$/) + { + $checksum = $1; + last; + } + } + + close MD5EXE; + + return $checksum; + +} + + +sub backticks +{ + my $command = shift; + + `$command`; + return ($? == -1) ? 0 : 1; +} + + +sub bail +{ + my $str = shift; + print STDERR "$str\n" if defined $str; + + &cleanup(); + exit(1); +} + + +sub cleanup +{ + return if ($TMP eq "" || !-d $TMP); + + opendir(MAINDIR, $TMP); + my @files = readdir(MAINDIR); + closedir(MAINDIR); + + foreach my $file (@files) + { + unlink "$TMP/$file" if -e "$TMP/$file"; + } + + remove_tree($TMP); + +} + + +sub help +{ + my $str = shift; + + print <<'HELPME'; + +USAGE + ./mafftash_premafft.pl -p [FILE] + ./mafftash_premafft.pl -o [FILE] -d [DIRECTORY] + ./mafftash_premafft.pl -p [FILE] -o [FILE] -d [DIRECTORY] + + +PARAMETERS + -p [FILE] + FILE contains a list of PDBIDs (one entry per line); make sure that the PDBIDs are in the standard 5-character pdbid+chain naming format + + -o [FILE] -d [DIRECTORY] + FILE contains a list of IDs from your own structure/pdb files (one entry per line) + for each ID in the list make sure that a corresponding structure file (same ID with .pdb extension) is stored in DIRECTORY + + -h [HATFILE] + save the output hat3 file in HATFILE; if not set, the output is written to a file named 'hat3' in your current directory + + -i [INSTRFILE] + save the output instr file in INSTRFILE; if not set, the output is written to a file named 'instr' in your current directory + +HELPME + + &bail($str); +} + + + diff --git a/mafft/src/mafft-7.487-with-extensions/core/maffttext2hex.c b/mafft/src/mafft-7.487-with-extensions/core/maffttext2hex.c new file mode 100644 index 0000000000..b86831688d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/maffttext2hex.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include + +int main( int ac, char **av ) +{ + unsigned int c; + FILE *fp; + unsigned char buf[10000]; + unsigned char *bpt; + char format; + + if( ac == 1 || ( ac == 2 && av[1][0] == '-' ) ) + { + fp = stdin; + } + else if( ac == 2 ) + { + fp = fopen( av[1], "rb" ); + if( fp == NULL ) + { + fprintf( stderr, "%s: Cannot open %s.\n", av[0], av[1] ); + exit( 1 ); + } + } + else + { + fprintf( stderr, "Usage %s input > output\n", av[0] ); + exit( 1 ); + } + +#if mingw + setmode( fileno( fp ), O_BINARY ); +#endif + +#if 1 + format = 'f'; + c = fgetc( fp ); + if( c == 'C' ) format = 'c'; + ungetc( c, fp ); +#else + fgets( (char *)buf, 999, fp ); + rewind( fp ); + if( !strncmp( (char *)buf, "CLUSTAL", 7 ) ) format = 'c'; + else format = 'f'; +#endif + + if( format == 'c' ) // clustal + { + int ln = 0; + int titlelen = -1; + while( 1 ) + { + fgets( (char *)buf, 999, fp ); + if( feof( fp ) ) break; + if( ln == 0 ) + { + ln = 1; + printf( "%s", buf ); + continue; + } + + bpt = (unsigned char *)strchr( (char *)buf, ' ' ); + if( bpt == NULL ) + { + printf( "\n" ); + continue; + } + if( titlelen == -1 ) + { + while( *++bpt == ' ' ) + ; + titlelen = bpt - buf; + } + else + { + bpt = buf + titlelen; + } + *(bpt-1) = 0; + printf( "%s ", buf ); + + while( (c=(unsigned int)*bpt++)!='\n' ) + { + if( c == '-' ) printf( "-- " ); + else if( c == '=' ) printf( "== " ); + else if( c == '*' ) printf( "** " ); + else if( c == ' ' ) printf( " " ); + else printf( "%02x ", c ); + } + printf( "\n" ); + } + } + else // fasta + { + while( 1 ) + { + c = fgetc( fp ); + if( c == EOF ) break; + else if( c == '\n' ) printf( "\n" ); + else if( c == '\r' ) printf( "\r" ); // nai + else if( c == '-' ) printf( "-- " ); + else if( c == '=' ) printf( "== " ); // nai + else if( c == ' ' ) printf( " " ); // nai + else if( c == '>' || c == '<' ) + { + printf( "%c", c ); + while( 1 ) + { + c = fgetc( fp ); + printf( "%c", c ); + if( c == '\n' ) break; + } + } + else printf( "%02x ", c ); + } + } + fclose( fp ); + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/makedirectionlist.c b/mafft/src/mafft-7.487-with-extensions/core/makedirectionlist.c new file mode 100644 index 0000000000..cc68843f35 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/makedirectionlist.c @@ -0,0 +1,1300 @@ +#include "mltaln.h" + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 + +#define GLOBAL 0 + +#define END_OF_VEC -1 + +//int nadd; +double thresholdtorev; +int dodp; +int addfragment; +int mode = '2'; +int reflim = 1000; +int contrastsort = 1; + +typedef struct _thread_arg +{ + int iend; + char **seq; + int *map; + char *tmpseq; + int *res; + int **spointt; + short *table1; + int iq; +#ifdef enablemultithread + int *jshare; + int thread_no; + pthread_mutex_t *mutex_counter; +#endif +} thread_arg_t; + +typedef struct _selfdpthread_arg +{ + int iend; + char **seq; + double *res; +#ifdef enablemultithread + int *jshare; + int thread_no; + pthread_mutex_t *mutex_counter; +#endif +} selfdpthread_arg_t; + +typedef struct _contrast +{ + int pos; + double dif; +} contrastarr; + +static void *selfdpthread( void *arg ) +{ + selfdpthread_arg_t *targ = (selfdpthread_arg_t *)arg; + int iend = targ->iend; + char **seq = targ->seq; + double *res = targ->res; +#ifdef enablemultithread + int thread_no = targ->thread_no; + int *jshare = targ->jshare; +#endif + int j; + char **revseq; + + revseq = AllocateCharMtx( 1, nlenmax+1 ); + + j = -1; + while( 1 ) + { +#ifdef enablemultithread + if( nthread ) + { + pthread_mutex_lock( targ->mutex_counter ); + j = *jshare; + if( j%100 == 0 ) reporterr( "%d / %d (thread %d) \r", j, iend, thread_no ); + if( j == iend ) + { + pthread_mutex_unlock( targ->mutex_counter ); + break; + } + ++(*jshare); + pthread_mutex_unlock( targ->mutex_counter ); + } + else +#endif + { + j++; + if( j%100 == 0 ) reporterr( "%d / %d \r", j, iend ); + if( j == iend ) + { + break; + } + } + + sreverse( revseq[0], seq[j] ); +#if GLOBAL + res[j] = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, seq+j, seq+j, 0 ); + res[j] -= G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, seq+j, revseq, 0 ); +#else + res[j] = L__align11_noalign( n_dis_consweight_multi, seq+j, seq+j ); + res[j] -= L__align11_noalign( n_dis_consweight_multi, seq+j, revseq ); +#endif + } + + creverse( 0 ); + FreeCharMtx( revseq ); +#if GLOBAL + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); +#else + L__align11_noalign( NULL, NULL, NULL ); +#endif + return( NULL ); +} + +#if 0 +static void partshuffle( int size, int outsize, int *ary ) +{ + int i; + +// reporterr( "ary before shuffle = \n" ); + // for(i=0;i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); + fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt/kimura %d\n", pamN ); + --argc; + goto nextoption; + case 't': + thresholdtorev = atof( *++argv ); + fprintf( stderr, "thresholdtorev = %f\n", thresholdtorev ); + --argc; + goto nextoption; + case 'o': + mode = *(*++argv); + fprintf( stderr, "mode = %c\n", mode ); + --argc; + goto nextoption; + case 'r': + reflim = myatoi(*++argv); + fprintf( stderr, "reflim = %d\n", reflim ); + --argc; + goto nextoption; + case 'c': + contrastsort = 0; + break; + case 'd': + dodp = 1; + break; + case 'F': + addfragment = 1; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'S': + alg = 'S'; + break; + case 'M': + alg = 'M'; + break; + case 'm': + alg = 'm'; + break; + case 'G': + alg = 'G'; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + + + + + +void seq_grp_nuc( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 4 ) + *grp++ = tmp; + else +// fprintf( stderr, "WARNING : Unknown character %c\r", *(seq-1) ); + ; + } + *grp = END_OF_VEC; + if( grp - grpbk < 6 ) + { +// fprintf( stderr, "\n\nWARNING: Too short.\nPlease also consider use mafft-ginsi, mafft-linsi or mafft-ginsi.\n\n\n" ); +// exit( 1 ); + *grpbk = -1; + } +} + +void seq_grp( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 6 ) + *grp++ = tmp; + else +// fprintf( stderr, "WARNING : Unknown character %c\r", *(seq-1) ); + ; + } + *grp = END_OF_VEC; + if( grp - grpbk < 6 ) + { +// fprintf( stderr, "\n\nWARNING: Too short.\nPlease also consider use mafft-ginsi, mafft-linsi or mafft-ginsi.\n\n\n" ); +// exit( 1 ); + *grpbk = -1; + } +} + +void makecompositiontable_p( short *table, int *pointt ) +{ + int point; + + while( ( point = *pointt++ ) != END_OF_VEC ) + table[point]++; +} + + +void makepointtable_nuc( int *pointt, int *n ) +{ + int point; + register int *p; + + if( *n == -1 ) + { + *pointt = -1; + return; + } + + p = n; + point = *n++ * 1024; + point += *n++ * 256; + point += *n++ * 64; + point += *n++ * 16; + point += *n++ * 4; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 1024; + point *= 4; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +void makepointtable( int *pointt, int *n ) +{ + int point; + register int *p; + + if( *n == -1 ) + { + *pointt = -1; + return; + } + + p = n; + point = *n++ * 7776; + point += *n++ * 1296; + point += *n++ * 216; + point += *n++ * 36; + point += *n++ * 6; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 7776; + point *= 6; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +static int localcommonsextet_p2( short *table, int *pointt ) +{ + int value = 0; + short tmp; + int point; + short *memo; + int *ct; + int *cp; + + if( *pointt == -1 ) + return( 0 ); + + memo = (short *)calloc( tsize, sizeof( short ) ); + if( !memo ) ErrorExit( "Cannot allocate memo\n" ); + ct = (int *)calloc( MIN( maxl, tsize )+1, sizeof( int ) ); // chuui!! + if( !ct ) ErrorExit( "Cannot allocate memo\n" ); + + cp = ct; + while( ( point = *pointt++ ) != END_OF_VEC ) + { + tmp = memo[point]++; + if( tmp < table[point] ) + value++; + if( tmp == 0 ) *cp++ = point; + } + *cp = END_OF_VEC; + + cp = ct; + while( *cp != END_OF_VEC ) + memo[*cp++] = 0; + + free( memo ); + free( ct ); + return( value ); +} + +static int compfunc( const void *a, const void *b ) +{ + return ((contrastarr *)b)->dif - ((contrastarr *)a)->dif; // correct +// return ((contrastarr *)a)->dif - ((contrastarr *)b)->dif; // incorrect! +} + +static void makecontrastorder6mer( int *order, int **pointt, int **pointt_rev, char **seq, int iend, int shift ) +{ + int i; + double *res; + contrastarr *arr; + short *table1, *table1_rev; + + + arr = calloc( iend, sizeof( contrastarr ) ); + res = calloc( iend, sizeof( double ) ); + + for( i=0; iiend; + char **seq = targ->seq; + int *map = targ->map; + char *tmpseq = targ->tmpseq; + int *res = targ->res; + int **spointt = targ->spointt; + short *table1 = targ->table1; +// int iq = targ->iq; +#ifdef enablemultithread +// int thread_no = targ->thread_no; + int *jshare = targ->jshare; +#endif + int j; + char **mseq1, **mseq2; + + + if( dodp ) // nakuserukamo + { + mseq1 = AllocateCharMtx( 1, 0 ); + mseq2 = AllocateCharMtx( 1, 0 ); + } + + j = -1; + while( 1 ) + { +#ifdef enablemultithread + if( nthread ) + { + pthread_mutex_lock( targ->mutex_counter ); + j = *jshare; + if( j == iend ) + { + pthread_mutex_unlock( targ->mutex_counter ); + break; + } + ++(*jshare); + pthread_mutex_unlock( targ->mutex_counter ); + } + else +#endif + { + j++; + if( j == iend ) + { +// if( iq%100==1 ) fprintf( stderr, "\r %d / %d \r", iq, njob ); + break; + } + } + + + if( dodp ) + { +// strcpy( mseq1[0], tmpseq ); +// strcpy( mseq2[0], seq[j] ); + mseq1[0] = tmpseq; + mseq2[0] = seq[map[j]]; +#if GLOBAL + res[j] = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, 0 ); +#else + res[j] = L__align11_noalign( n_dis_consweight_multi, mseq1, mseq2 ); +#endif + } + else + { +// reporterr( "\n\nj=%d, map[j]=%d\n\n", j, map[j] ); + res[j] = localcommonsextet_p2( table1, spointt[map[j]] ); + } + } + if( dodp ) // nakuserukamo + { + free( mseq1 ); + free( mseq2 ); +#if GLOBAL + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); +#else + L__align11_noalign( NULL, NULL, NULL ); +#endif + } +// else +// if( nthread ) // inthread == 0 no toki free suru to, error. nazeda +// localcommonsextet_p( NULL, NULL ); + return( NULL ); +} + +int main( int argc, char *argv[] ) +{ + static int *nlen; + static int *nogaplen; + static char **name, **seq; + int i, j, istart, iend, ic; + FILE *infp; +// FILE *adfp; + char c; + + int *grpseq; + char *tmpseq, *revseq; + int **pointt, **pointt_rev, **spointt; + double res_forward, res_reverse, res_max; + int ires, mres, mres2; + int *res, *resr, *resf; + int *map; + static short *table1, *table1_rev; + static char **mseq1f, **mseq1r, **mseq2; + int *contrastorder; + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen( infp ); + rewind( infp ); + + if( alg == 'a' ) + { + if( nlenmax < 10000 ) + alg = 'G'; + else + alg = 'S'; + } + + seq = AllocateCharMtx( njob, nlenmax*1+1 ); + +#if 0 + Read( name, nlen, seq ); + readData( infp, name, nlen, seq ); +#else + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + nogaplen = AllocateIntVec( njob ); + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); + + if( dorp != 'd' ) + { + fprintf( stderr, "Not necessary!\n" ); + for( i=0; i thresholdtorev ) // tekitou + { +// fprintf( stderr, "REVERSE!!!\n" ); + sreverse( seq[i], mseq2[0] ); + + strcpy( tmpseq, name[i] ); + strcpy( name[i], "_R_" ); + strncpy( name[i]+3, tmpseq+1, 10 ); + name[i][13] = 0; + } + else + { + strcpy( seq[i], mseq2[0] ); + + strcpy( tmpseq, name[i] ); + strcpy( name[i], "_F_" ); + strncpy( name[i]+3, tmpseq+1, 10 ); + name[i][13] = 0; + } + } + FreeCharMtx( mseq1f ); + FreeCharMtx( mseq1r ); + FreeCharMtx( mseq2 ); + free( tmpseq ); + } + else if( alg == 'm' ) + { + + if( dodp ) // nakuserukamo + { + mseq1f = AllocateCharMtx( 1, nlenmax+1); + mseq1r = AllocateCharMtx( 1, nlenmax+1 ); + mseq2 = AllocateCharMtx( 1, nlenmax+1 ); + } + else + { +// nthread = 0; // heiretsu keisan no kouritsu ha warui node + spointt = AllocateIntMtx( njob, 0 ); + pointt = AllocateIntMtx( njob, nlenmax+1 ); + pointt_rev = AllocateIntMtx( njob, nlenmax+1 ); + } + tmpseq = AllocateCharVec( MAX( nlenmax, B ) +1 ); + revseq = AllocateCharVec( nlenmax+1 ); + grpseq = AllocateIntVec( nlenmax+1 ); + res = AllocateIntVec( njob ); + resr = AllocateIntVec( njob ); + resf = AllocateIntVec( njob ); + map = AllocateIntVec( njob ); + contrastorder = AllocateIntVec( njob ); + if( dorp == 'd' ) tsize = (int)pow( 4, 6 ); + else tsize = (int)pow( 6, 6 ); // iranai + + maxl = 0; + for( i=0; i maxl ) maxl = nogaplen[i]; + } + + reporterr( "Step 1/2\n" ); + + + if( !dodp ) + { + if( nadd ) + iend = njob - nadd; + else + iend = 0; // keisan shinai + + for( i=0; i moto no basho ni modosu + seq_grp_nuc( grpseq, revseq ); + makepointtable_nuc( pointt_rev[i], grpseq ); +// makecompositiontable_p( table1_rev, pointt_rev[i] ); -> moto no basho ni modosu + spointt[i] = pointt[i]; + + +// reporterr( "pointt[i] = %p\n", pointt[i] ); +// reporterr( "pointt[i][0] = %p\n", pointt[i][0] ); + + } + } + + + if( contrastsort ) // sukoshi chuui + { + + + if( nadd ) + { + iend = njob-nadd; + for( i=0; i makecontrastorder() no mae ni idou + if( !dodp ) + { + seq_grp_nuc( grpseq, tmpseq ); + makepointtable_nuc( pointt[ic], grpseq ); + spointt[ic] = pointt[ic]; + } +#endif + + strcpy( tmpseq, name[ic] ); + strcpy( name[ic], "_F_" ); + strncpy( name[ic]+3, tmpseq+1, 10 ); + name[ic][13] = 0; + } + + reporterr( "\n\nStep 2/2\n" ); + + if( nadd ) + istart = njob - nadd; + else + istart = 1; + for( i=istart; i makecontrastorder() no mae ni idou + if( !dodp ) + { + table1 = (short *)calloc( tsize, sizeof( short ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + table1_rev = (short *)calloc( tsize, sizeof( short ) ); + if( !table1_rev ) ErrorExit( "Cannot allocate table1_rev\n" ); + seq_grp_nuc( grpseq, tmpseq ); + makepointtable_nuc( pointt[ic], grpseq ); + makecompositiontable_p( table1, pointt[ic] ); + seq_grp_nuc( grpseq, revseq ); + makepointtable_nuc( pointt_rev[ic], grpseq ); + makecompositiontable_p( table1_rev, pointt_rev[ic] ); + } +#else + if( !dodp ) + { + table1 = (short *)calloc( tsize, sizeof( short ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + table1_rev = (short *)calloc( tsize, sizeof( short ) ); + if( !table1_rev ) ErrorExit( "Cannot allocate table1_rev\n" ); + makecompositiontable_p( table1, pointt[ic] ); + makecompositiontable_p( table1_rev, pointt_rev[ic] ); + } +#endif + + if( nadd && addfragment ) + iend = njob-nadd; + else + iend = i; + + + if( iend > reflim ) + { +// reporterr( "iend = %d -> %d\n", iend, reflim ); +#if 0 + for( j=0; jmres2 ) + { + if( ires>mres ) + { + mres2 = mres; + mres = ires; + } + else + mres2 = ires; + } + } + res_forward = (double)( mres + mres2 ) / 2; + mres = mres2 = 0; + for( j=0; jmres2 ) + { + if( ires>mres ) + { + mres2 = mres; + mres = ires; + } + else + mres2 = ires; + } + } + res_reverse = (double)( mres + mres2 ) / 2; + res_max = MAX(res_reverse,res_forward); + } +// reporterr( "i=%d, res_reverse = %f\n", i, res_reverse ); + else if( mode == '1' ) + { + res_reverse = 0.0; + for( j=0; jres_forward) ) // tekitou +// if( (res_reverse-res_forward)/res_max > thresholdtorev ) // tekitou + { + strcpy( seq[ic], revseq ); + + strcpy( tmpseq, name[ic] ); + strcpy( name[ic], "_R_" ); + strncpy( name[ic]+3, tmpseq+1, 10 ); + name[ic][13] = 0; + if( !dodp ) spointt[ic] = pointt_rev[ic]; + } + else + { + strcpy( tmpseq, name[ic] ); + strcpy( name[ic], "_F_" ); + strncpy( name[ic]+3, tmpseq+1, 10 ); + name[ic][13] = 0; + if( !dodp ) spointt[ic] = pointt[ic]; + } + + if( !dodp ) + { + free( table1 ); + free( table1_rev ); + } + } + + if( name[0][1] == 'R' ) + { + for( j=0; j%s\n", name[i] ); +// fprintf( stdout, "%s\n", seq[i] ); + fprintf( stdout, "%s\n", name[i] ); + } + + FreeCharMtx( seq ); + FreeCharMtx( name ); + freeconstants(); + closeFiles(); + + fprintf( stderr, "\n" ); + SHOWVERSION; + return( 0 ); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/makemergetable.rb b/mafft/src/mafft-7.487-with-extensions/core/makemergetable.rb new file mode 100644 index 0000000000..f2cec737f9 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/makemergetable.rb @@ -0,0 +1,32 @@ +#!/bin/env ruby +require 'getopts' + +seedoffset = 0 + +if getopts( "s:" ) == nil || ARGV.length == 0 || $OPT_h then + puts "Usage: #{$0} [-s number_of_seeds] input_files" + exit +end + +if $OPT_s + seedoffset = $OPT_s.to_i +end + + +files = ARGV + + +num = seedoffset + 1 +for file in files + output = "" + STDERR.puts file + fp = File.open( file, "r" ) + while line = fp.gets + if line =~ /^>/ then + output += " " + num.to_s + num += 1 + end + end + fp.close + puts output + " # " + file +end diff --git a/mafft/src/mafft-7.487-with-extensions/core/mccaskillwrap.c b/mafft/src/mafft-7.487-with-extensions/core/mccaskillwrap.c new file mode 100644 index 0000000000..b0fdc25f47 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mccaskillwrap.c @@ -0,0 +1,461 @@ +#include "mltaln.h" + +#define DEBUG 0 + +static char *whereismccaskillmea; + +#ifdef enablemultithread +typedef struct _thread_arg +{ + int thread_no; + int njob; + int *jobpospt; + int **gapmap; + char **nogap; + int nlenmax; + RNApair ***pairprob; + pthread_mutex_t *mutex; +} thread_arg_t; +#endif + +void outmccaskill( FILE *fp, RNApair **pairprob, int length ) +{ + int i; + RNApair *pt; + for( i=0; ibestpos!=-1; pt++ ) + { + if( pt->bestpos > i ) + fprintf( fp, "%d %d %50.40f\n", i, pt->bestpos, pt->bestscore ); + } +} + +#if 1 +static void readrawmccaskill( FILE *fp, RNApair **pairprob, int length ) +{ + char gett[1000]; + int *pairnum; + int i; + int left, right; + double prob; + + pairnum = (int *)calloc( length, sizeof( int ) ); + for( i=0; i' ) continue; + sscanf( gett, "%d %d %lf", &left, &right, &prob ); + if( prob < 0.01 ) continue; // mxscarna to mafft ryoho ni eikyou +//fprintf( stderr, "gett = %s\n", gett ); + + if( left != right && prob > 0.0 ) + { + pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) ); + pairprob[left][pairnum[left]].bestscore = prob; + pairprob[left][pairnum[left]].bestpos = right; + pairnum[left]++; + pairprob[left][pairnum[left]].bestscore = -1.0; + pairprob[left][pairnum[left]].bestpos = -1; +// fprintf( stderr, "%d-%d, %f\n", left, right, prob ); + + pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) ); + pairprob[right][pairnum[right]].bestscore = prob; + pairprob[right][pairnum[right]].bestpos = left; + pairnum[right]++; + pairprob[right][pairnum[right]].bestscore = -1.0; + pairprob[right][pairnum[right]].bestpos = -1; +// fprintf( stderr, "%d-%d, %f\n", right, left, prob ); + } + } + free( pairnum ); +} +#endif + +#ifdef enablemultithread +static void *athread( void *arg ) +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int thread_no = targ->thread_no; + int njob = targ->njob; + int *jobpospt = targ->jobpospt; + int **gapmap = targ->gapmap; + char **nogap = targ->nogap; + int nlenmax = targ->nlenmax; + RNApair ***pairprob = targ->pairprob; + + int i, res; + FILE *infp; + char *com; + char *dirname; + + dirname = calloc( 100, sizeof( char ) ); + com = calloc( 1000, sizeof( char ) ); + + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == njob ) + { + pthread_mutex_unlock( targ->mutex ); +// return( NULL ); + break; + } + *jobpospt = i+1; + pthread_mutex_unlock( targ->mutex ); + + commongappick_record( 1, nogap+i, gapmap[i] ); + if( strlen( nogap[i] ) == 0 ) continue; + + sprintf( dirname, "_%d", i ); + sprintf( com, "rm -rf %s", dirname ); + system( com ); + sprintf( com, "mkdir %s", dirname ); + system( com ); + + fprintf( stderr, "%d / %d (by thread %4d)\n", i+1, njob, thread_no ); + sprintf( com, "%s/_mccaskillinorg", dirname ); + infp = fopen( com, "w" ); +// fprintf( infp, ">in\n%s\n", nogap[i] ); + fprintf( infp, ">in\n" ); + write1seq( infp, nogap[i] ); + fclose( infp ); + +// sprintf( com, "tr -d '\\r' < %s/_mccaskillinorg > %s/_mccaskillin", dirname, dirname ); + sprintf( com, "cd %s && tr -d '\\r' < _mccaskillinorg > _mccaskillin && cd ..", dirname ); + system( com ); // for cygwin, wakaran + if( alg == 'G' ) + sprintf( com, "cd %s; %s/dafs --mafft-out _mccaskillout _mccaskillin > _dum1 2>_dum", dirname, whereismccaskillmea ); + else +// sprintf( com, "cd %s; %s/mxscarnamod -m -writebpp _mccaskillin > _mccaskillout 2>_dum", dirname, whereismccaskillmea ); + sprintf( com, "cd %s && env PATH=%s mxscarnamod -m -writebpp _mccaskillin > _mccaskillout 2>_dum", dirname, whereismccaskillmea ); // mingw no tame, dirname/bin no kawari ni env PATH + res = system( com ); + + if( res ) + { + fprintf( stderr, "ERROR IN mccaskill_mea\n" ); + exit( 1 ); + } + + sprintf( com, "%s/_mccaskillout", dirname ); + infp = fopen( com, "r" ); + readrawmccaskill( infp, pairprob[i], nlenmax ); + fclose( infp ); + +// sprintf( com, "rm -rf \"%s\" > \"/dev/null\" 2>&1", dirname ); + sprintf( com, "rm -rf \"%s\"", dirname ); // for windows, not use /dev/null + if( system( com ) ) + { + fprintf( stderr, "retrying to rmdir\n" ); +// nanosleep( 100000 ); + sleep( 1 ); + system( com ); + } + } + free( dirname ); + free( com ); + return( NULL ); +} +#endif + +void arguments( int argc, char *argv[] ) +{ + int c; + nthread = 1; + inputfile = NULL; + dorp = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + whereismccaskillmea = NULL; + alg = 's'; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'd': + whereismccaskillmea = *++argv; + fprintf( stderr, "whereismccaskillmea = %s\n", whereismccaskillmea ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + case 's': + alg = 's'; // use scarna; default + break; + case 'G': + alg = 'G'; // use dafs, instead of scarna + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + +int main( int argc, char *argv[] ) +{ + static char com[10000]; + static int *nlen; + int left, right; + int res; + static char **name, **seq, **nogap; + static int **gapmap; + static int *order; + int i, j; + FILE *infp; + RNApair ***pairprob; + RNApair **alnpairprob; + RNApair *pairprobpt; + RNApair *pt; + int *alnpairnum; + double prob; + int adpos; + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( !whereismccaskillmea ) + whereismccaskillmea = ""; + + getnumlen( infp ); + rewind( infp ); + + if( dorp != 'd' ) + { + fprintf( stderr, "nuc only\n" ); + exit( 1 ); + } + + seq = AllocateCharMtx( njob, nlenmax*2+1 ); + nogap = AllocateCharMtx( njob, nlenmax*2+1 ); + gapmap = AllocateIntMtx( njob, nlenmax*2+1 ); + order = AllocateIntVec( njob ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + pairprob = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + alnpairprob = (RNApair **)calloc( nlenmax, sizeof( RNApair * ) ); + alnpairnum = AllocateIntVec( nlenmax ); + + for( i=0; i 0 ) + { + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + thread_arg_t *targ; + jobpos = 0; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i%d\n", i ); + outmccaskill( stdout, pairprob[i], nlenmax ); + } + } + else +#endif + { + for( i=0; i%d\n", i ); + continue; + } + + infp = fopen( "_mccaskillinorg", "w" ); +// fprintf( infp, ">in\n%s\n", nogap[i] ); + fprintf( infp, ">in\n" ); + write1seq( infp, nogap[i] ); + fclose( infp ); + + system( "tr -d '\\r' < _mccaskillinorg > _mccaskillin" ); // for cygwin, wakaran + if( alg == 'G' ) + sprintf( com, "env PATH=%s dafs --mafft-out _mccaskillout _mccaskillin > _dum1 2>_dum", whereismccaskillmea ); + else + sprintf( com, "env PATH=%s mxscarnamod -m -writebpp _mccaskillin > _mccaskillout 2>_dum", whereismccaskillmea ); + res = system( com ); + + if( res ) + { + fprintf( stderr, "ERROR IN mccaskill_mea\n" ); + exit( 1 ); + } + + infp = fopen( "_mccaskillout", "r" ); + readrawmccaskill( infp, pairprob[i], nlenmax ); + fclose( infp ); + fprintf( stdout, ">%d\n", i ); + outmccaskill( stdout, pairprob[i], nlenmax ); + } + } + + for( i=0; ibestpos!=-1; pairprobpt++ ) + { + left = gapmap[i][j]; + right = gapmap[i][pairprobpt->bestpos]; + prob = pairprobpt->bestscore; + + for( pt=alnpairprob[left]; pt->bestpos!=-1; pt++ ) + if( pt->bestpos == right ) break; + + if( pt->bestpos == -1 ) + { + alnpairprob[left] = (RNApair *)realloc( alnpairprob[left], (alnpairnum[left]+2) * sizeof( RNApair ) ); + adpos = alnpairnum[left]; + alnpairnum[left]++; + alnpairprob[left][adpos].bestscore = 0.0; + alnpairprob[left][adpos].bestpos = right; + alnpairprob[left][adpos+1].bestscore = -1.0; + alnpairprob[left][adpos+1].bestpos = -1; + pt = alnpairprob[left]+adpos; + } + else + adpos = pt-alnpairprob[left]; + + pt->bestscore += prob; + if( pt->bestpos != right ) + { + fprintf( stderr, "okashii!\n" ); + exit( 1 ); + } +// fprintf( stderr, "adding %d-%d, %f\n", left, right, prob ); + } + } + + for( i=0; ibestpos!=-1; pairprobpt++ ) + { + pairprobpt->bestscore /= (double)njob; + left = i; + right = pairprobpt->bestpos; + prob = pairprobpt->bestscore; + fprintf( stdout, "%d-%d, %f\n", left, right, prob ); + } + + return( 0 ); +#endif +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/mingw64mingw32dll b/mafft/src/mafft-7.487-with-extensions/core/mingw64mingw32dll new file mode 100644 index 0000000000..e8142cd975 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mingw64mingw32dll @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +export PATH=/home/mingw32/mingw32/bin:$PATH +export C_INCLUDE_PATH=/home/mingw32/mingw32/include +export LIBRARY_PATH=/home/mingw32/mingw32/lib +make clean +make ENABLE_MULTITHREAD="" dlls +rm -rf dll32 +mkdir dll32 +mv *.dll dll32/ + +export PATH=/home/mingw64/mingw64/bin:$PATH +export C_INCLUDE_PATH=/home/mingw64/mingw64/include +export LIBRARY_PATH=/home/mingw64/mingw64/lib +make clean +make ENABLE_MULTITHREAD="" dlls +rm -rf dll64 +mkdir dll64 +mv *.dll dll64/ diff --git a/mafft/src/mafft-7.487-with-extensions/core/miyata.h b/mafft/src/mafft-7.487-with-extensions/core/miyata.h new file mode 100644 index 0000000000..cddb6248ad --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/miyata.h @@ -0,0 +1,47 @@ +double polarity_[] = +{ + 8.1, /* A */ + 10.5, /* R */ + 11.6, /* N */ + 13.0, /* D */ + 5.5, /* C */ + 10.5, /* Q */ + 12.3, /* E */ + 9.0, /* G */ + 10.4, /* H */ + 5.2, /* I */ + 4.9, /* L */ + 11.3, /* K */ + 5.7, /* M */ + 5.2, /* F */ + 8.0, /* P */ + 9.2, /* S */ + 8.6, /* T */ + 5.4, /* W */ + 6.2, /* Y */ + 5.9, /* V */ +}; + +double volume_[] = +{ + 31.0, /* A */ + 124.0, /* R */ + 56.0, /* N */ + 54.0, /* D */ + 55.0, /* C */ + 85.0, /* Q */ + 83.0, /* E */ + 3.0, /* G */ + 96.0, /* H */ + 111.0, /* I */ + 111.0, /* L */ + 119.0, /* K */ + 105.0, /* M */ + 132.0, /* F */ + 32.5, /* P */ + 32.0, /* S */ + 61.0, /* T */ + 170.0, /* W */ + 136.0, /* Y */ + 84.0, /* V */ +}; diff --git a/mafft/src/mafft-7.487-with-extensions/core/miyata5.h b/mafft/src/mafft-7.487-with-extensions/core/miyata5.h new file mode 100644 index 0000000000..3ddf2c0391 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/miyata5.h @@ -0,0 +1,166 @@ +int locpenaltym = -1440; +int exgpm = +0; /* != 0 nisuruto kowareru. exgp ha constants.c de kurikomu */ +char locaminom[] = "ARNDCQEGHILKMFPSTWYVBZX.-J"; +char locgrpm[] = +{ + 0, 3, 2, 2, 5, 2, 2, 0, 3, 1, 1, 3, 1, 4, 0, 0, 0, 4, 4, 1, 2, 2, + 6, 6, 6, 1, +}; +int locn_dism[26][26] = + { + { + 600, -235, 91, -78, 202, 51, -103, 340, -21, -169, + -189, -246, -92, -323, 582, 454, 342, -400, -309, 71, + 7, -26, -15, -400, 0,-1400, + }, + + { + -235, 600, 17, -69, -275, 277, 185, -400, 365, -112, + -149, 485, -55, -106, -229, -183, 20, -178, 22, -95, + -26, 231, -15, -400, 0,-1400, + }, + + { + 91, 17, 600, 414, -209, 317, 357, 39, 231, -363, + -398, 74, -280, -400, 85, 225, 200, -400, -378, -189, + 507, 337, -15, -400, 0,-1400, + }, + + { + -78, -69, 414, 600, -395, 179, 342, -78, 108, -400, + -400, 14, -400, -400, -86, 65, 14, -400, -400, -372, + 507, 261, -15, -400, 0,-1400, + }, + + { + 202, -275, -209, -395, 600, -109, -332, -35, -132, 134, + 128, -335, 182, -40, 220, 74, 185, -355, -81, 354, + -302, -220, -15, -400, 0,-1400, + }, + + { + 51, 277, 317, 179, -109, 600, 360, -109, 508, -135, + -172, 297, -58, -203, 51, 128, 280, -378, -109, -9, + 248, 480, -15, -400, 0,-1400, + }, + + { + -103, 185, 357, 342, -332, 360, 600, -195, 325, -369, + -400, 274, -295, -400, -109, 11, 77, -400, -321, -249, + 350, 480, -15, -400, 0,-1400, + }, + + { + 340, -400, 39, -78, -35, -109, -195, 600, -195, -400, + -400, -400, -355, -400, 322, 357, 114, -400, -400, -189, + -19, -152, -15, -400, 0,-1400, + }, + + { + -21, 365, 231, 108, -132, 508, 325, -195, 600, -100, + -141, 374, -26, -152, -15, 45, 222, -303, -49, -3, + 169, 417, -15, -400, 0,-1400, + }, + + { + -169, -112, -363, -400, 134, -135, -369, -400, -100, 600, + 560, -212, 517, 425, -149, -243, -12, 108, 354, 357, + -400, -252, -15, -400, 0,-1400, + }, + + { + -189, -149, -398, -400, 128, -172, -400, -400, -141, 560, + 600, -252, 482, 420, -172, -269, -43, 105, 331, 340, + -400, -290, -15, -400, 0,-1400, + }, + + { + -246, 485, 74, 14, -335, 297, 274, -400, 374, -212, + -252, 600, -152, -215, -240, -175, -1, -289, -92, -172, + 44, 285, -15, -400, 0,-1400, + }, + + { + -92, -55, -280, -400, 182, -58, -295, -355, -26, 517, + 482, -152, 600, 365, -75, -163, 68, 59, 334, 422, + -368, -176, -15, -400, 0,-1400, + }, + + { + -323, -106, -400, -400, -40, -203, -400, -400, -152, 425, + 420, -215, 365, 600, -306, -386, -143, 282, 462, 191, + -400, -315, -15, -400, 0,-1400, + }, + + { + 582, -229, 85, -86, 220, 51, -109, 322, -15, -149, + -172, -240, -75, -306, 600, 440, 351, -400, -292, 88, + 0, -29, -15, -400, 0,-1400, + }, + + { + 454, -183, 225, 65, 74, 128, 11, 357, 45, -243, + -269, -175, -163, -386, 440, 600, 345, -400, -352, -15, + 145, 70, -15, -400, 0,-1400, + }, + + { + 342, 20, 200, 14, 185, 280, 77, 114, 222, -12, + -43, -1, 68, -143, 351, 345, 600, -400, -100, 194, + 107, 178, -15, -400, 0,-1400, + }, + + { + -400, -178, -400, -400, -355, -378, -400, -400, -303, 108, + 105, -289, 59, 282, -400, -400, -400, 600, 297, -118, + -400, -400, -15, -400, 0,-1400, + }, + + { + -309, 22, -378, -400, -81, -109, -321, -400, -49, 354, + 331, -92, 334, 462, -292, -352, -100, 297, 600, 165, + -400, -215, -15, -400, 0,-1400, + }, + + { + 71, -95, -189, -372, 354, -9, -249, -189, -3, 357, + 340, -172, 422, 191, 88, -15, 194, -118, 165, 600, + -280, -129, -15, -400, 0,-1400, + }, + + { + 7, -26, 507, 507, -302, 248, 350, -19, 169, -400, + -400, 44, -368, -400, 0, 145, 107, -400, -400, -280, + 507, 299, -400, -400, 0,-1400, + }, + + { + -26, 231, 337, 261, -220, 480, 480, -152, 417, -252, + -290, 285, -176, -315, -29, 70, 178, -400, -215, -129, + 299, 480, -400, -400, 0,-1400, + }, + + { + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -400, -400, -400, -400, 0,-1400, + }, + + { + -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, + -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, + -400, -400, -400, -400, 0,-1400, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + }, + + { +-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400, +-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400,-1400, +-1400,-1400,-1400,-1400, 0, 1600, + }, + }; diff --git a/mafft/src/mafft-7.487-with-extensions/core/mltaln.h b/mafft/src/mafft-7.487-with-extensions/core/mltaln.h new file mode 100644 index 0000000000..05aa990acd --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mltaln.h @@ -0,0 +1,387 @@ +#define USE_XCED 0 + +#define _XOPEN_SOURCE + +#if USE_XCED +#include "config.h" +#include "share.h" +#else +#endif + +#include "mafft.h" +#include +#include +#include +#include +#include +#include +#include +#include "mtxutl.h" +//#include +#include +#include +#ifdef enablemultithread +#include +#include +#include +#endif +#ifndef _MSC_VER +#include +#endif +#if !defined(mingw) && !defined(_MSC_VER) +#include // for setstacksize, 2016/Jun +#include // shared memory +#include // shm_open +#endif + + + +#define VERSION "7.487" +#define SHOWVERSION reporterr( "%s (%s) Version " VERSION "\nalg=%c, model=%s, amax=%3.1f\n%d thread(s)\n\n", progName( argv[0] ), (dorp=='d')?"nuc":((nblosum==-2)?"text":"aa"), alg, modelname, specificityconsideration, nthread ) + +#define FFT_THRESHOLD 80 +#define FFT_WINSIZE_P 20 +#define FFT_WINSIZE_D 100 +#define DISPSEQF 60 +#define DISPSITEI 0 +#define MAXITERATION 500 +#define M 500000 /* njob no saidaiti */ +#define N 5000000 /* nlen no saidaiti */ +#define MAXSEG 100000 +#define B 256 +#define C 60 /* 1 gyou no mojisuu */ +#define D 6 +#define DFORMAT "%#6.3f" +#define rnd() ( ( 1.0 / ( RAND_MAX + 1.0 ) ) * rand() ) +#define MAX(X,Y) ( ((X)>(Y))?(X):(Y) ) +#define MIN(X,Y) ( ((X)<(Y))?(X):(Y) ) +#define G(X) ( ((X)>(0))?(X):(0) ) +#define BEFF 1.0 /* 0.6 ni suruto zureru */ +#define WIN 3 +#define SGAPP -1000 +#define GETA2 0.001 +#define GETA3 0.001 +#define NOTSPECIFIED 100009 +#define SUEFF 0.1 /* upg/(spg+upg) -> sueff.sed */ +#define DIVLOCAL 0 +#define INTMTXSCALE 1000000.0 +#define JTT 201 +#define TM 202 + +extern char modelname[500]; +extern int njob, nlenmax; +extern int amino_n[0x100]; +extern char amino_grp[0x100]; +//extern int amino_dis[0x100][0x100]; +extern int **amino_dis; +extern double **n_disLN; +//extern double amino_dis_consweight_multi[0x100][0x100]; +extern double **amino_dis_consweight_multi; +extern int **n_dis; +extern int **n_disFFT; +extern double **n_dis_consweight_multi; +extern unsigned char amino[0x100]; +extern double polarity[0x100]; +extern double volume[0x100]; +extern int ribosumdis[37][37]; + +extern int ppid; +extern double thrinter; +extern double fastathreshold; +extern int pslocal, ppslocal; +extern int constraint; +extern int divpairscore; +extern int fmodel; // 1-> fmodel 0->default -1->raw +extern int nblosum; // 45, 50, 62, 80 +extern int kobetsubunkatsu; +extern int bunkatsu; +extern int dorp; +extern int niter; +extern int contin; +extern int calledByXced; +extern int devide; +extern int scmtd; +extern int weight; +extern int utree; +extern int tbutree; +extern int refine; +extern int check; +extern double cut; +extern int cooling; +extern int trywarp; +extern int penalty, ppenalty, penaltyLN; +extern int penalty_dist, ppenalty_dist; +extern int RNApenalty, RNAppenalty; +extern int RNApenalty_ex, RNAppenalty_ex; +extern int penalty_ex, ppenalty_ex, penalty_exLN; +extern int penalty_EX, ppenalty_EX; +extern int penalty_OP, ppenalty_OP; +extern int penalty_shift; +extern double penalty_shift_factor; +extern int offset, poffset, offsetLN, offsetFFT; +extern int RNAthr, RNApthr; +extern int scoremtx; +extern int TMorJTT; +extern char use_fft; +extern char force_fft; +extern int nevermemsave; +extern int fftscore; +extern int fftWinSize; +extern int fftThreshold; +extern int fftRepeatStop; +extern int fftNoAnchStop; +extern int divWinSize; +extern int divThreshold; +extern int disp; +extern int outgap; +extern char alg; +extern int cnst; +extern int mix; +extern int tbitr; +extern int tbweight; +extern int tbrweight; +extern int disopt; +extern int pamN; +extern int checkC; +extern double geta2; +extern int treemethod; +extern int kimuraR; +extern char *swopt; +extern int fftkeika; +extern int score_check; +extern char *inputfile; +extern char *addfile; +extern int addprofile; +extern double consweight_multi; +extern double consweight_rna; +extern char RNAscoremtx; + +extern char *signalSM; +extern FILE *prep_g; +extern FILE *trap_g; +extern char **seq_g; +extern char **res_g; +extern int rnakozo; +extern char rnaprediction; + +/* sengen no ichi ha koko dake de ha nai */ +extern void constants(); +extern char **Calignm1(); +extern char **Dalignm1(); +extern char **align0(); +extern double Cscore_m_1( char **, int, int, double ** ); +extern double score_m_1( char **, int, int, double ** ); +extern double score_calc0( char **, int, double **, int ); +extern char seqcheck( char ** ); +extern double substitution( char *, char * ); +extern double substitution_score( char *, char * ); +extern double substitution_nid( char *, char * ); +extern double substitution_hosei( char *, char * ); +extern double ipower( double, int ); +extern double translate_and_Calign(); +extern double A__align(); +extern double A__align11(); +extern double A__align_gapmap(); +extern double partA__align(); +extern double L__align11( double **scoringmtx, double scoreoffset, char **seq1, char **seq2, int alloclen, int *off1pt, int *off2pt ); +extern double G__align11(); +extern double Falign(); +extern double Falign_localhom(); +extern double Conalign(); +extern double Aalign(); +extern double imp_match_out_sc( int, int ); +extern double part_imp_match_out_sc( int, int ); +extern void ErrorExit(); +extern void cpmx_calc(); +extern void intergroup_score( char **, char **, double *, double *, int, int, int, double * ); +extern int conjuctionfortbfast(); +extern int fastconjuction(); +extern char seqcheck( char ** ); + +typedef struct _LocalHom +{ + struct _LocalHom *next; + struct _LocalHom *last; + int start1; + int end1; + int start2; + int end2; + double opt; + int overlapaa; + int extended; + double importance; + double rimportance; +// double fimportance; +// double wimportance; + char korh; + int nokori; +} LocalHom; + +typedef struct _NodeInCub +{ + int step; + int LorR; +} NodeInCub; + +typedef struct _Node +{ + struct _Node *children[3]; + int tmpChildren[3]; + double length[3]; + double *weightptr[3]; + int top[3]; + int *members[3]; +} Node; + +typedef struct _Segment +{ + int start; + int end; + int center; + double score; + int skipForeward; + int skipBackward; + struct _Segment *pair; + int number; +} Segment; + +typedef struct _Segments +{ + Segment group1; + Segment group2; + int number1; + int number2; +} Segments; + +typedef struct _Bchain +{ + struct _Bchain *next; + struct _Bchain *prev; + int pos; +} Bchain; + +typedef struct _Achain +{ + int next; + int prev; +// int curr; +} Achain; + + +typedef struct _Fukusosuu +{ + double R; + double I; +} Fukusosuu; + +typedef struct _Gappattern +{ + int len; + double freq; +} Gappat; + +typedef struct _RNApair +{ + int uppos; + double upscore; + int downpos; + double downscore; + int bestpos; + double bestscore; +} RNApair; + +typedef struct _Treedep +{ + int child0; + int child1; + int done; + double distfromtip; +} Treedep; + +typedef struct _Addtree +{ + int nearest; + double dist1; + char *neighbors; + double dist2; +} Addtree; + +typedef struct _lennum +{ + int len; + int num; +} Lennum; + +typedef struct _pairnum +{ + unsigned long long npairs; + int num; + int n0; + int n1; +} Pairnum; + +typedef struct _extanch +{ + int i; + int j; + int starti; + int endi; + int startj; + int endj; + int score; +} ExtAnch; + +#include "fft.h" +#include "dp.h" +#include "functions.h" + +#ifdef enablemultithread +#define TLS __thread +#else +#define TLS +#endif + +extern TLS int commonAlloc1; +extern TLS int commonAlloc2; +extern TLS int **commonIP; +extern TLS int **commonJP; +extern int nthread; +extern int nthreadreadlh; +extern int nthreadpair; +extern int randomseed; +extern int parallelizationstrategy; +#define BESTFIRST 0 +#define BAATARI0 1 +#define BAATARI1 2 +#define BAATARI2 3 + +extern int scoreout; +extern int spscoreout; +extern int outnumber; + +extern int legacygapcost; +extern double minimumweight; +extern int nwildcard; + +extern TLS char *newgapstr; + +extern int nalphabets; +extern int nscoredalphabets; +extern double specificityconsideration; +extern int ndistclass, maxdistclass; + +extern int gmsg; + +extern double sueff_global; +extern double lenfaca, lenfacb, lenfacc, lenfacd; +extern int maxl, tsize; + + +/* for --large */ +extern int compacttree; +extern int lhlimit; +extern int specifictarget; +#define HAT3NODEBLOCK 500 +extern int nadd; +extern int usenaivescoreinsteadofalignmentscore; +#define MYBUFSIZE 1000 * 1000 * 100 // 100MB diff --git a/mafft/src/mafft-7.487-with-extensions/core/mltaln9.c b/mafft/src/mafft-7.487-with-extensions/core/mltaln9.c new file mode 100644 index 0000000000..bd6e6330c7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/mltaln9.c @@ -0,0 +1,15764 @@ +#include "mltaln.h" + +#define DEBUG 0 +#define CANONICALTREEFORMAT 1 +#define MEMSAVE 1 + +#define HAT3SORTED 0 +#define DISPPAIRID 0 // tbfast ha ugokanakunaru + +#define LHBLOCKFACTOR 2 +#define MINBLOCKLEN2 1000000000 // 100000 pairs * 100 sites * 100 sites + +#define N0LOOPFIRST 0 +#define YOUNGER0TREE 1 // --add ni hitsuyou + +#define REPORTCOSTS 0 +#define EXACTLYSAMEASPAIRLOCALALIGN 0 // test you. itchi saseruniha guide tree mo ataeru + +#define RECURSIVETOP 0 + +#define TREE7325 0 + +#if 0 +int seqlen( char *seq ) +{ + int val = 0; + while( *seq ) + if( *seq++ != '-' ) val++; + return( val ); +} +#else +int seqlen( char *seq ) +{ + int val = 0; + if( *newgapstr == '-' ) + { + while( *seq ) + if( *seq++ != '-' ) val++; + } + else + { + while( *seq ) + { + if( *seq != '-' && *seq != *newgapstr ) val++; + seq++; + } + } + return( val ); +} +#endif + +int intlen( int *num ) +{ + int *numbk = num; + while( *num++ != -1 ) + ; + return( num-numbk-1 ); +} + +char seqcheck( char **seq ) +{ + int i, len; + char **seqbk = seq; + while( *seq ) + { + len = strlen( *seq ); + for( i=0; i output\n" ); + reporterr( "=== \n" ); + reporterr( "========================================================================= \n" ); + reporterr( "========================================================================= \n" ); + return( (int)(*seq)[i] ); + } + } + seq++; + } + return( 0 ); +} + +void intcat( int *s1, int *s2 ) +{ + while( *s1 != -1 ) s1++; + while( *s2 != -1 ) + { +// reporterr( "copying %d\n", *s2 ); + *s1++ = *s2++; + } + *s1 = -1; +} + +void intcpy( int *s1, int *s2 ) +{ + while( *s2 != -1 ) + { +// reporterr( "copying %d\n", *s2 ); + *s1++ = *s2++; + } + *s1 = -1; +} + +void intncpy( int *s1, int *s2, int n ) +{ + while( n-- ) *s1++ = *s2++; +} + +void fltncpy( double *s1, double *s2, int n ) +{ + while( n-- ) *s1++ = *s2++; +} + +static int countmem( int *s ) +{ + int v = 0; + while( *s++ != -1 ) v++; + return( v ); +} + +static int lastmem( int *s ) +{ + while( *s++ != -1 ) + ; + return( *(s-2) ); +} + + +void scmx_calc( int icyc, char **aseq, double *effarr, double **scmx ) +{ + int i, j, lgth; + + lgth = strlen( aseq[0] ); + for( j=0; j DISPSEQF ) imax = DISPSEQF; + else imax = nseq; + reporterr( " ....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+....,....+\n" ); + for( i=0; i<+imax; i++ ) + { + strncpy( b, seq[i]+DISPSITEI, 120 ); + b[120] = 0; + reporterr( "%3d %s\n", i+1, b ); + } +} + +void intergroup_score_consweight( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + unsigned char ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == '-' ) + { + tmpscore += (double)penalty; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + while( (ms2=(unsigned char)mseq2[++k]) == '-' ) + ; +// tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; +// reporterr( "val in _gapnomi = %f\n", *value ); + } + } +#if 0 + fprintf( stdout, "###score = %f\n", score ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} +void intergroup_score_gapnomi( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + int ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == (int)'-' ) + { + tmpscore += (double)penalty; +// tmpscore += (double)amino_dis[ms1][ms2]; + while( (ms2=(int)mseq2[++k]) == (int)'-' ) + ; +// tmpscore += (double)amino_dis[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; +// reporterr( "val in _gapnomi = %f\n", *value ); + } + } +#if 0 + fprintf( stdout, "###score = %f\n", score ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} + +void intergroup_score_multimtx( int **whichmtx, double ***scoringmatrices, char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k, c; + int len2 = len - 2; + int mn1, mn2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + int gapnum = amino_n['-']; + + double gaptmpscore; + double gapscore = 0.0; + +// reporterr( "#### in intergroup_score\n" ); + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( mn2 == gapnum ) + { + tmpscore += (double)penalty; + gaptmpscore += (double)penalty; + tmpscore += (double)scoringmatrices[c][mn1][mn2]; +// tmpscore += (double)scoringmtx[mn1][mn2]; + while( (mn2=amino_n[(unsigned char)mseq2[++k]]) == gapnum ) + tmpscore += (double)scoringmatrices[c][mn1][mn2]; +// tmpscore += (double)scoringmtx[mn1][mn2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; + gapscore += (double)gaptmpscore * (double)efficient; + } + } +// reporterr( "done." ); +#if 0 + reporterr( "###gapscore = %f\n", gapscore ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} +void intergroup_score( char **seq1, char **seq2, double *eff1, double *eff2, int clus1, int clus2, int len, double *value ) +{ + int i, j, k; + int len2 = len - 2; + unsigned char ms1, ms2; + double tmpscore; + char *mseq1, *mseq2; + double efficient; + + double gaptmpscore; + double gapscore = 0.0; + +// reporterr( "#### in intergroup_score\n" ); + +// totaleff1 = 0.0; for( i=0; ilen2 ) break; + continue; + } + if( ms2 == '-' ) + { + tmpscore += (double)penalty; + gaptmpscore += (double)penalty; +// tmpscore += (double)amino_dis[ms1][ms2]; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + while( (ms2=(unsigned char)mseq2[++k]) == '-' ) +// tmpscore += (double)amino_dis[ms1][ms2]; + tmpscore += (double)amino_dis_consweight_multi[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + *value += (double)tmpscore * (double)efficient; + gapscore += (double)gaptmpscore * (double)efficient; + } + } +#if 0 + reporterr( "###gapscore = %f\n", gapscore ); +#endif +#if DEBUG + reporterr( "score in intergroup_score = %f\n", score ); +#endif +// return( score ); +} + +double score_calc5( char **seq, int s, double **eff, int ex ) /* method 3 deha nai */ +{ + int i, j, k; + double c; + int len = strlen( seq[0] ); + double score; + double tmpscore; + char *mseq1, *mseq2; + double efficient; +#if DEBUG + FILE *fp; +#endif + + score = 0.0; + c = 0.0; + + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore * efficient; +/* + fprintf( stdout, "%d-%d tmpscore = %f, eff = %f, tmpscore*eff = %f\n", i, ex, tmpscore, efficient, tmpscore*efficient ); +*/ + } + /* + fprintf( stdout, "total score = %f\n", score ); + */ + + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore * efficient; + } + } +/* + reporterr( "score in score_calc5 = %f\n", score ); +*/ + return( (double)score ); +/* + +fprintf( trap_g, "score by fast = %f\n", (double)score ); + +tmpscore = score = 0.0; + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty - n_dis[24][0]; + while( mseq2[++k] == '-' ) + ; + k--; + if( k > len-2 ) break; + continue; + } + } + /* + if( x == 65 ) printf( "i=%d j=%d tmpscore=%d l=%d\n", i, j, tmpscore, len ); + */ + score += (double)tmpscore * efficient; + } + } + score /= c; + return( (double)score ); +} + + + +void upg2( int nseq, double **eff, int ***topol, double **len ) +{ + int i, j, k; + double tmplen[M]; + + static char **pair = NULL; + + if( !pair ) + { + pair = AllocateCharMtx( njob, njob ); + } + + for( i=0; i 0 ) + { + topol[k][0][count] = i; + count++; + } + topol[k][0][count] = -1; + for( i=0, count=0; i 0 ) + { + topol[k][1][count] = i; + count++; + } + topol[k][1][count] = -1; + + len[k][0] = minscore / 2.0 - tmplen[im]; + len[k][1] = minscore / 2.0 - tmplen[jm]; + + tmplen[im] = minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +#define BLOCKSIZE 100 +#define LARGEBLOCKSIZE 100 + +typedef struct _generaltdistarrthread_arg +{ + int para; + int njob; +// int thread_no; + int m; + int *nlen; + char **seq; + int **skiptable; + int **pointt; + int *ttable; + int *tselfscore; + int *posshared; + int *joblist; + double *result; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} generaldistarrthread_arg_t; + +static void *generalkmerdistarrthread( void *arg ) // enablemultithread == 0 demo tsukau +{ + generaldistarrthread_arg_t *targ = (generaldistarrthread_arg_t *)arg; + int njob = targ->njob; + int para = targ->para; + int m = targ->m; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *ttable = targ->ttable; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *result = targ->result; +// double **partmtx = targ->partmtx; + int i, posinjoblist, n; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += LARGEBLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int m = targ->m; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *result = targ->result; +// double **partmtx = targ->partmtx; + int i, posinjoblist, n; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + return( NULL ); + } + posinjoblist = *posshared; + *posshared += LARGEBLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; n", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + +// result = calloc( nseq, sizeof( double ) ); +// joblist = calloc( nseq, sizeof( int ) ); + + + for( acptj=(acpt+pos)->next,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + + if( j ) + { +// reporterr( "resetting in parallel!! j=%d\n", j ); +// exit( 1 ); + int posshared; + generaldistarrthread_arg_t *targ; + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + + targ = calloc( nthread, sizeof( generaldistarrthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + posshared = 0; + pthread_mutex_init( &mutex, NULL ); + for( i=0; inext; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + } + + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; + +// free( joblist ); +// free( result ); +} + +#else +static void kmerresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, int *tselfscore, int **pointt, int *nlen, int *singlettable1, double *resultnotused, int *joblistnotused ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + + for( acptj=(acpt+pos)->next; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; +// else if( seq ) +// tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); + else + tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; +// else if( seq ) +// tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); + else + tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +} +#endif + +#if 1 +static void msaresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, char **seq, int **skiptable, int *tselfscore, double *result, int *joblist ) +{ + int i, j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; +// double *result; +// int *joblist; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + +// result = calloc( nseq, sizeof( double ) ); +// joblist = calloc( nseq, sizeof( int ) ); + +// for( acptj=acpt,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + for( acptj=(acpt+pos)->next,j=0; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + i = acptj->pos; +// if( i == pos ) continue; + + if( distfrompt[pos] ) + { + tmpdouble = result[i] = distfrompt[pos][i]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else if( distfrompt[i] ) + { + tmpdouble = result[i] = distfrompt[i][pos]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = i; + } + } + else + joblist[j++] = i; + } + + + if( j ) + { +// reporterr( "resetting in parallel!! j=%d\r", j ); +// exit( 1 ); + int posshared; + generaldistarrthread_arg_t *targ; + posshared = 0; + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + targ = calloc( nthread, sizeof( generaldistarrthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + for( i=0; inext; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + tmpdouble = result[j]; + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + } + +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; + +// free( joblist ); +// free( result ); +} +#else +static void msaresetnearest( int nseq, Bchain *acpt, double **distfrompt, double *mindisfrompt, int *nearestpt, int pos, char **seq, int **skiptable, int *tselfscore, double *resultnotused, int *joblistnotused ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + + +// reporterr( "resetnearest..\r" ); +// printf( "[%d], %f, dist=%d ->", pos, *distfrompt, *nearestpt ); + +// mindisfrom = 999.9; +// nearest = -1; + + + for( acptj=(acpt+pos)->next; acptj!=NULL; acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; + else + tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); +// else +// tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + for( acptj=acpt; (acptj&&acptj->pos!=pos); acptj=acptj->next ) // setnearest ni awaseru + { + j = acptj->pos; + + if( distfrompt[pos] ) + tmpdouble=distfrompt[pos][j]; + else if( distfrompt[j] ) + tmpdouble=distfrompt[j][pos]; + else + tmpdouble=distcompact_msa( seq[pos], seq[j], skiptable[pos], skiptable[j], tselfscore[pos], tselfscore[j] ); +// else +// tmpdouble=distcompact( nlen[pos], nlen[j], singlettable1, pointt[j], tselfscore[pos], tselfscore[j] ); + + + + if( tmpdouble < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// printf( "mindisfrom = %f\n", mindisfrom ); + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +} +#endif + +static int getdensest( int *m, double *d ) +{ + int i; + double dmax = -100.0; + int pmax = -1; + for( i=0; m[i]>-1; i++ ) + { + if( d[m[i]] > dmax ) + { + dmax = d[m[i]]; + pmax = m[i]; + } + } + return( pmax ); +} + +static void setdensity( int nseq, Bchain *acpt, double **eff, double *density, int pos ) +{ + int j; + double tmpdouble; +// double **effptpt; + Bchain *acptj; + +// printf( "[%d], %f, dist=%d ->", pos, *mindisfrompt, *nearestpt ); + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + + tmpdouble = 0.0; +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( eff[pos][j-pos] < 1.0 ) + tmpdouble += (2.0-eff[pos][j-pos]); + } +// effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; + if( eff[j][pos-j] < 1.0 ) + tmpdouble += (2.0-eff[j][pos-j]); + } + + *density = tmpdouble; +// printf( "p=%d, d=%f \n", pos, *density ); +} + +static void setnearest( int nseq, Bchain *acpt, double **eff, double *mindisfrompt, int *nearestpt, int pos ) +{ + int j; + double tmpdouble; + double mindisfrom; + int nearest; +// double **effptpt; + Bchain *acptj; + + mindisfrom = 999.9; + nearest = -1; + +// printf( "[%d], %f, dist=%d ->", pos, *mindisfrompt, *nearestpt ); + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=*effpt++) < *mindisfrompt ) + if( (tmpdouble=eff[pos][j-pos]) < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } +// effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=(*effptpt++)[pos-j]) < *mindisfrompt ) + if( (tmpdouble=eff[j][pos-j]) < mindisfrom ) + { + mindisfrom = tmpdouble; + nearest = j; + } + } + + *mindisfrompt = mindisfrom; + *nearestpt = nearest; +// printf( "%f, %d \n", pos, *mindisfrompt, *nearestpt ); +} + +static void setnearest_double_fullmtx( int nseq, Bchain *acpt, double **eff, double *mindisfrompt, int *nearestpt, int pos ) +{ + int j; + double tmpdouble; + double **effptpt; + Bchain *acptj; + + *mindisfrompt = 999.9; + *nearestpt = -1; + +// if( (acpt+pos)->next ) effpt = eff[pos]+(acpt+pos)->next->pos-pos; + +// for( j=pos+1; jnext; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=*effpt++) < *mindisfrompt ) + if( (tmpdouble=eff[pos][j]) < *mindisfrompt ) + { + *mindisfrompt = tmpdouble; + *nearestpt = j; + } + } + effptpt = eff; +// for( j=0; jpos!=pos); acptj=acptj->next ) + { + j = acptj->pos; +// if( (tmpdouble=(*effptpt++)[pos-j]) < *mindisfrompt ) + if( (tmpdouble=eff[j][pos]) < *mindisfrompt ) + { + *mindisfrompt = tmpdouble; + *nearestpt = j; + } + } +} + + + +static void loadtreeoneline( int *ar, double *len, FILE *fp ) +{ + static char gett[1000]; + int res; + char *p; + + p = fgets( gett, 999, fp ); + if( p == NULL ) + { + reporterr( "\n\nFormat error (1) in the tree? It has to be a bifurcated and rooted tree.\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + + res = sscanf( gett, "%d %d %lf %lf", ar, ar+1, len, len+1 ); + if( res != 4 ) + { + reporterr( "\n\nFormat error (2) in the tree? It has to be a bifurcated and rooted tree.\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + ar[0]--; + ar[1]--; + + if( ar[0] >= ar[1] ) + { + reporterr( "\n\nIncorrect guide tree\n" ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + +// reporterr( "ar[0] = %d, ar[1] = %d\n", ar[0], ar[1] ); +// reporterr( "len[0] = %f, len[1] = %f\n", len[0], len[1] ); +} + +void loadtop( int nseq, double **mtx, int ***topol, double **len, char **name, int *nlen, Treedep *dep ) +{ + int i, j, k, minijm, maxijm; + int *intpt, *intpt2; + int *hist = NULL; + Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; + int nmemim, nmemjm; + char **tree; + char *treetmp; + char *nametmp, *nameptr, *tmpptr; + char namec; + FILE *fp; + int node[2]; + double *height; + double clusterdist; + int mpair, mi, mj; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( nseq ); + ac = (Bchain *)malloc( nseq * sizeof( Bchain ) ); + nmemar = AllocateIntVec( nseq ); +// treetmp = AllocateCharVec( nseq*50 ); + treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( nseq, nseq*50 ); + tree = AllocateCharMtx( nseq, 0 ); + height = AllocateFloatVec( nseq ); + } + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } +#else + len[k][0] = len[k][1] = -1.0; + loadtreeoneline( node, len[k], fp ); + im = node[0]; + jm = node[1]; + + if( im > nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + +#endif + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + +// reporterr( "prevnode = %d, nmemim = %d\n", prevnode, nmemim ); + + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + + nmemjm = nmemar[jm]; + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + +// reporterr( "prevnode = %d, nmemjm = %d\n", prevnode, nmemjm ); + + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + +// len[k][0] = ( minscore - tmptmplen[im] ); +// len[k][1] = ( minscore - tmptmplen[jm] ); +// len[k][0] = -1; +// len[k][1] = -1; + + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + + if( len[k][0] == -1 || len[k][1] == -1 ) + { + reporterr( "Re-computing the length of branch %d..\n", k ); + clusterdist = 0.0; + mpair = 0; + for( i=0; (mi=topol[k][0][i])>-1; i++ ) for( j=0; (mj=topol[k][1][j])>-1; j++ ) + { + minijm = MIN(mi,mj); + maxijm = MAX(mi,mj); + clusterdist += mtx[minijm][maxijm-minijm]; + mpair += 1; + } + clusterdist /= (double)mpair; + reporterr( "clusterdist = %f\n", clusterdist ); + if( len[k][0] == -1 ) len[k][0] = clusterdist/2.0 - height[im]; + if( len[k][1] == -1 ) len[k][1] = clusterdist/2.0 - height[im]; + + fprintf( stderr, "len0 = %f\n", len[k][0] ); + fprintf( stderr, "len1 = %f\n\n", len[k][1] ); + } + +#if 0 + fprintf( stderr, "vSTEP-%03d:\n", k+1 ); + fprintf( stderr, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][0][i]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][1][i]+1 ); + fprintf( stderr, "\n" ); + +#endif + height[im] += len[k][0]; // for ig tree, 2015/Dec/25 + dep[k].distfromtip = height[im]; // for ig tree, 2015/Dec/25 +// reporterr( "##### dep[%d].distfromtip = %f\n", k, height[im] ); + + + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 0 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { +// reporterr( "calling setnearest\n" ); +// setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + + } + fclose( fp ); + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fprintf( fp, "#by loadtop\n" ); + fclose( fp ); + + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); + free( hist ); + free( (char *)ac ); + free( (void *)nmemar ); + free( height ); + +} + +static void shufflelennum( Lennum *ary, int size ) +{ + int i; + for(i=0;ilen - ((Lennum *)p)->len ); +} + +static int compfuncpair( const void *p, const void *q ) +{ + return( ((Pairnum *)q)->npairs - ((Pairnum *)p)->npairs ); +} + +void limitlh( int *uselh, Lennum *in, int size, int limit ) +{ + int i; +// for(i=0;i size ) limit = size; +// reporterr( "numpairs=%llu, ULLONG_MAX=%llu, nn=%lld, INT_MAX=%d, n=%d\n", numpairs, ULLONG_MAX, nn, INT_MAX, n ); + + for(i=0;i INT_MAX ) nn = INT_MAX; + + n = (int)nn; + if( n > size ) n = size; +// reporterr( "numpairs=%llu, ULLONG_MAX=%llu, nn=%lld, INT_MAX=%d, n=%d\n", numpairs, ULLONG_MAX, nn, INT_MAX, n ); + + for(i=0;idep)[pos].child0 == -1 ) + { + *order++ = (tdpglobal->topol)[pos][0][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, (tdpglobal->dep)[pos].child0 ); + } + + if( (tdpglobal->dep)[pos].child1 == -1 ) + { + *order++ = (tdpglobal->topol)[pos][1][0]; + *order = -1; + } + else + { + order = topolorder_lessargs( order, (tdpglobal->dep)[pos].child1 ); + } + + return( order ); +} + +int *topolorderz( int *order, int ***topol, Treedep *dep, int pos, int nchild ) +{ +#if 0 + TopDep td; + td.topol = topol; + td.dep = dep; + + tdpglobal = &td; +#else + tdpglobal = (TopDep *)calloc( sizeof( TopDep ), 1 ); + tdpglobal->topol = topol; + tdpglobal->dep = dep; +#endif + + int child; + + if( nchild == 0 || nchild == 2 ) + { + if( (child=(dep)[pos].child0) == -1 ) + { + *order++ = (topol)[pos][0][0]; + *order = -1; + } + else + { +// order = topolorder_lessargs( order, &td, child ); + order = topolorder_lessargs( order, child ); + } + } + if( nchild == 1 || nchild == 2 ) + { + if( (child=(dep)[pos].child1) == -1 ) + { + *order++ = (topol)[pos][1][0]; + *order = -1; + } + else + { +// order = topolorder_lessargs( order, &td, child ); + order = topolorder_lessargs( order, child ); + } + } + +#if 1 + free( tdpglobal ); + tdpglobal = NULL; +#endif + + return ( order ); +} + + + +#if RECURSIVETOP +#else +static void topolorder_mudaari( int nseq, int *n1, int *n2, int *order1, int *order2, int ***topol, Treedep *dep, int pos ) +// memhist[][] wo free sezu, recalcpairs4thread() ni wataseba, kono kansuu ha iranai. -> V7.383 +// memhist[][] no memory shiyou ryou ha, saiaku no baai O(N^2) +{ + int **memhist, **localmem; + int i, s1, s2, c1, c2; + memhist = AllocateIntMtx( pos, 0 ); + localmem = AllocateIntMtx( 2, 0 ); + for( i=0; i<=pos; i++ ) memhist[i] = NULL; + + for( i=0; i<=pos; i++ ) + { + c1 = dep[i].child0; + c2 = dep[i].child1; + if( c1 == -1 ) + { + localmem[0] = calloc( sizeof( int ), 2 ); + localmem[0][0] = topol[i][0][0]; + localmem[0][1] = -1; + s1 = 1; + } + else + { + localmem[0] = memhist[c1]; + s1 = intlen( localmem[0] ); + } + + if( c2 == -1 ) + { + localmem[1] = calloc( sizeof( int ), 2 ); + localmem[1][0] = topol[i][1][0]; + localmem[1][1] = -1; + s2 = 1; + } + else + { + localmem[1] = memhist[c2]; + s2 = intlen( localmem[1] ); + } + + if( i == pos ) + { + intcpy( order1, localmem[0] ); + intcpy( order2, localmem[1] ); + *n1 = s1; + *n2 = s2; + } + else + { + memhist[i] = calloc( sizeof( int ), s1+s2+1 ); + intcpy( memhist[i], localmem[0] ); + intcpy( memhist[i]+s1, localmem[1] ); + memhist[i][s1+s2] = -1; + } + free( localmem[0] ); + free( localmem[1] ); + if( c1 != -1 ) memhist[c1] = NULL; + if( c2 != -1 ) memhist[c2] = NULL; + +// reporterr( "freeing memhist[%d]\n", dep[i].child0 ); +// reporterr( "freeing memhist[%d]\n", dep[i].child1 ); + } + + for( i=0; i<=pos; i++ ) + { + if( memhist[i] ) free( memhist[i] ); + memhist[i] = NULL; + } + free( memhist ); + free( localmem ); +} +#endif + +#if CANONICALTREEFORMAT +void createchain( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int shuffle, int seed ) +{ + FILE *fp; + int i, j; + double l, ll; + int treelen; + char **tree; + char *instanttree; + int posinit; +// char *treetmp, *tt; + char *nametmp, *nameptr, *tmpptr; + char namec; + int *order; + int im, jm, mm; + + if( treeout ) + { +// treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( nseq, 0 ); + + treelen = nseq; + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + treelen += strlen( tree[i] ) + 20; + + } + + instanttree = calloc( treelen, sizeof( char ) ); + posinit = 0; + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + treelen += strlen( tree[i] ) + 20; + + } + + instanttree = calloc( treelen, sizeof( char ) ); + posinit = 0; + for( i=0; i k ) + { + fprintf( fp, "%d %d %f %f\n", k+1, jm+1, len[i][0], len[i][1] ); + } + else + { + fprintf( fp, "%d %d %f %f\n", jm+1, k+1, len[i][1], len[i][0] ); + k = jm; + } + } +#endif + fclose( fp ); + free( order ); +} +#endif + +void loadtree( int nseq, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + int *hist = NULL; + Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; + int nmemim, nmemjm; + char **tree; + char *treetmp; + char *nametmp, *nameptr, *tmpptr; + char namec; + FILE *fp; + int node[2]; + double *height; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + + reporterr( "Loading a tree\n" ); + + if( !hist ) + { + hist = AllocateIntVec( nseq ); + ac = (Bchain *)malloc( nseq * sizeof( Bchain ) ); + nmemar = AllocateIntVec( nseq ); +// treetmp = AllocateCharVec( nseq*50 ); + if( dep ) height = AllocateFloatVec( nseq ); + } + + if( treeout ) + { + treetmp = NULL; + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( nseq, nseq*50 ); + tree = AllocateCharMtx( nseq, 0 ); + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + } + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } +#else + len[k][0] = len[k][1] = -1.0; + loadtreeoneline( node, len[k], fp ); + im = node[0]; + jm = node[1]; + +// if( im > nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + if( im > nseq-1 || jm > nseq-1 ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + + if( len[k][0] == -1.0 || len[k][1] == -1.0 ) + { + reporterr( "\n\nERROR: Branch length is not given.\n" ); + exit( 1 ); + } + + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + +#endif + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + +// reporterr( "prevnode = %d, nmemim = %d\n", prevnode, nmemim ); + + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + + nmemjm = nmemar[jm]; + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + +// reporterr( "prevnode = %d, nmemjm = %d\n", prevnode, nmemjm ); + + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + +// len[k][0] = ( minscore - tmptmplen[im] ); +// len[k][1] = ( minscore - tmptmplen[jm] ); +// len[k][0] = -1; +// len[k][1] = -1; + + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + +// mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + } + } + + + if( treeout ) + { + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 0 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { +// reporterr( "calling setnearest\n" ); +// setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stderr, "vSTEP-%03d:\n", k+1 ); + fprintf( stderr, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][0][i]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stderr, " %03d", topol[k][1][i]+1 ); + fprintf( stderr, "\n" ); +#endif + + if( dep ) + { + height[im] += len[k][0]; // for ig tree, 2015/Dec/25 + dep[k].distfromtip = height[im]; // for ig tree, 2015/Dec/25 +// reporterr( "##### dep[%d].distfromtip = %f\n\n", k, height[im] ); + } + +// reporterr( "dep[%d].child0 = %d\n", k, dep[k].child0 ); +// reporterr( "dep[%d].child1 = %d\n", k, dep[k].child1 ); +// reporterr( "dep[%d].distfromtip = %f\n", k, dep[k].distfromtip ); + } + fclose( fp ); + + if( treeout ) + { + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fprintf( fp, "#by loadtree\n" ); + fclose( fp ); + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); + } + + free( hist ); + free( (char *)ac ); + free( (void *)nmemar ); + if( dep ) free( height ); + +} + +int check_guidetreefile( int *seed, int *npick, double *limitram ) +{ + char string[100]; + char *sizestring; + FILE *fp; + double tanni; + double tmpd; + + *seed = 0; + *npick = 200; + *limitram = 10.0 * 1000 * 1000 * 1000; // 10GB + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + fgets( string, 999, fp ); + fclose( fp ); + + if( !strncmp( string, "shuffle", 7 ) ) + { + sscanf( string+7, "%d", seed ); + reporterr( "shuffle, seed=%d\n", *seed ); + return( 's' ); + } + else if( !strncmp( string, "pileup", 6 ) ) + { + reporterr( "pileup.\n" ); + return( 'p' ); + } + else if( !strncmp( string, "auto", 4 ) ) + { + sscanf( string+4, "%d %d", seed, npick ); + reporterr( "auto, seed=%d, npick=%d\n", *seed, *npick ); + if( *npick < 2 ) + { + reporterr( "Check npick\n" ); + exit( 1 ); + } + return( 'a' ); + } + else if( !strncmp( string, "test", 4 ) ) + { + sscanf( string+4, "%d %d", seed, npick ); + reporterr( "calc, seed=%d, npick=%d\n", *seed, *npick ); + if( *npick < 2 ) + { + reporterr( "Check npick\n" ); + exit( 1 ); + } + return( 't' ); + } + else if( !strncmp( string, "compact", 7 ) ) + { + sizestring = string + 7; + reporterr( "sizestring = %s\n", sizestring ); + if( strchr( sizestring, 'k' ) || strchr( sizestring, 'k' ) ) tanni = 1.0 * 1000; // kB + else if( strchr( sizestring, 'M' ) || strchr( sizestring, 'm' ) ) tanni = 1.0 * 1000 * 1000; // GB + else if( strchr( sizestring, 'G' ) || strchr( sizestring, 'g' ) ) tanni = 1.0 * 1000 * 1000 * 1000; // GB + else if( strchr( sizestring, 'T' ) || strchr( sizestring, 't' ) ) tanni = 1.0 * 1000 * 1000 * 1000 * 1000; // TB + else + { + reporterr( "\nSpecify initial ram usage by '--initialramusage xGB'\n\n\n" ); + exit( 1 ); + } + sscanf( sizestring, "%lf", &tmpd ); + *limitram = tmpd * tanni; + reporterr( "Initial RAM usage = %10.3fGB\n", *limitram/1000/1000/1000 ); + return( 'c' ); + } + else if( !strncmp( string, "very compact", 12 ) ) + { + reporterr( "very compact.\n" ); + return( 'C' ); + } + else if( !strncmp( string, "stepadd", 7 ) ) + { + reporterr( "stepwise addition (disttbfast).\n" ); + return( 'S' ); + } + else if( !strncmp( string, "youngestlinkage", 15 ) ) + { + reporterr( "youngest linkage (disttbfast).\n" ); + return( 'Y' ); + } + else if( !strncmp( string, "nodepair", 8 ) ) + { + reporterr( "Use nodepair.\n" ); + return( 'n' ); + } + else + { + reporterr( "loadtree.\n" ); + return( 'l' ); + } +} + + +static double sueff1, sueff05; +//static double sueff1_double, sueff05_double; + +static double cluster_mix_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) * sueff1 + ( d1 + d2 ) * sueff05 ); +} +static double cluster_average_double( double d1, double d2 ) +{ + return( ( d1 + d2 ) * 0.5 ); +} +static double cluster_minimum_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) ); +} +#if 0 +static double cluster_mix_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) * sueff1_double + ( d1 + d2 ) * sueff05_double ); +} +static double cluster_average_double( double d1, double d2 ) +{ + return( ( d1 + d2 ) * 0.5 ); +} +static double cluster_minimum_double( double d1, double d2 ) +{ + return( MIN( d1, d2 ) ); +} +#endif + +static void increaseintergroupdistanceshalfmtx( double **eff, int ngroup, int **groups, int nseq ) +{ + int nwarned = 0; + int i, k, m, s1, s2, sl, ss; + int *others, *tft; + double maxdist, *dptr, dtmp; + tft = calloc( nseq, sizeof( int * ) ); + others = calloc( nseq, sizeof( int * ) ); + +// for( m=0; m-1; m++ ) tft[s1] = 1; + for( m=0,k=0; m-1; m++ ) for( k=0; (s1=groups[i][k])>-1&&k s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dtmp = eff[ss][sl-ss]; + if( dtmp > maxdist ) maxdist = dtmp; + } +// reporterr( "maxdist = %f\n", maxdist ); + + for( m=0; (s2=groups[i][m])>-1; m++ ) for( k=0; (s1=others[k])>-1; k++ ) + { + if( s2 > s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dptr = eff[ss] + sl-ss; + if( *dptr < maxdist ) + { + if( *dptr < 0.5 && nwarned++ < 100 ) reporterr( "# Sequences %d and %d seem to be closely related, but are not in the same sub MSA (%d) in your setting.\n", s2+1, s1+1, i+1 ); + *dptr = maxdist; + } + } +// for( m=0; m 100 ) reporterr( "# Sequenc.... (more pairs)\n" ); + + free( tft ); + free( others ); +} + +static void increaseintergroupdistancesfullmtx( double **eff, int ngroup, int **groups, int nseq ) +{ + int nwarned = 0; + int i, k, m, s1, s2, sl, ss; + int *others, *tft; + double maxdist, *dptr, dtmp; + tft = calloc( nseq, sizeof( int * ) ); + others = calloc( nseq, sizeof( int * ) ); + + reporterr( "\n" ); // Hitsuyou desu. + for( i=0; i-1; m++ ) tft[s1] = 1; + for( m=0,k=0; m-1; m++ ) for( k=0; (s1=groups[i][k])>-1&&k s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dtmp = eff[ss][sl]; + if( dtmp > maxdist ) maxdist = dtmp; + } + +// reporterr( "maxdist = %f\n", maxdist ); + + for( m=0; (s2=groups[i][m])>-1; m++ ) for( k=0; (s1=others[k])>-1; k++ ) + { + if( s2 > s1 ) + { + sl = s2; ss = s1; + } + else + { + sl = s1; ss = s2; + } + dptr = eff[ss] + sl; + if( *dptr < maxdist ) + { + if( *dptr < 0.5 && nwarned++ < 100 ) reporterr( "# Sequences %d and %d seem to be closely related, but are not in the same sub MSA (%d) in your setting.\n", s2+1, s1+1, i+1 ); + *dptr = maxdist; + } + } + } + if( nwarned > 100 ) reporterr( "# Sequenc.... (more pairs)\n" ); + +// for( m=0; m _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) inconsistent[acpti->pos][acptj->pos] = 0; // osoi!!! + ninconsistentpairs = 0; + firsttime = 1; + while( 1 ) + { + if( firsttime ) + { + firsttime = 0; + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + } + else + { + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[i][j] && (tmpdouble=eff[i][j-i]) < minscore ) + { + minscore = tmpdouble; + im = i; jm = j; + } + } + for( acptj=ac; (acptj&&acptj->pos!=i); acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[j][i] && (tmpdouble=eff[j][i-j]) < minscore ) + { + minscore = tmpdouble; + im = j; jm = i; + } + } + } + } + + + allinconsistent = 1; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + if( inconsistent[acpti->pos][acptj->pos] == 0 ) + { + allinconsistent = 0; + goto exitloop_f; + } + } + } + exitloop_f: + + if( allinconsistent ) + { + reporterr( "\n\n\nPlease check whether the grouping is possible.\n\n\n" ); + exit( 1 ); + } +#if 1 + intpt = testtopol; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + *intpt = -1; +// reporterr( "testtopol = \n" ); +// for( i=0; testtopol[i]>-1; i++ ) reporterr( " %03d", testtopol[i]+1 ); +// reporterr( "\n" ); +#endif + for( i=0; i-1; j++ ) reporterr( " %03d", groups[i][j]+1 ); +// reporterr( "\n" ); + if( overlapmember( groups[i], testtopol ) ) + { + if( !includemember( testtopol, groups[i] ) && !includemember( groups[i], testtopol ) ) + { + if( !warned[i] ) + { + warned[i] = 1; + reporterr( "\n###################################################################\n" ); + reporterr( "# WARNING: Group %d is forced to be a monophyletic cluster.\n", i+1 ); + reporterr( "###################################################################\n" ); + } + inconsistent[im][jm] = 1; + + if( maxinconsistentpairs < ninconsistentpairs+1 ) + { + inconsistentpairlist = realloc( inconsistentpairlist, (ninconsistentpairs+1)*sizeof( int * ) ); + for( j=maxinconsistentpairs; j *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + eff[im][jm-im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif +#if 1 + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } +#endif + } + } + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + reporterr( "\noSTEP-%03d:\n", k+1 ); + reporterr( "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) reporterr( " %03d", topol[k][0][i]+1 ); + reporterr( "\n" ); + reporterr( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) reporterr( " %03d", topol[k][1][i]+1 ); + reporterr( "\n\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + free( testtopol ); + FreeIntMtx( inconsistent ); + for( i=0; ithread_no; + int para = targ->para; + int im = targ->im; + int nseq = targ->nseq; + double **partmtx = targ->partmtx; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *tselfscore = targ->tselfscore; + double *result = targ->result; + int *joblist = targ->joblist; + Bchain **acpt = targ->acpt; + Bchain *ac = targ->ac; + + Bchain *acptbk; + Bchain *acptinit; + + int i; + + acptinit = *acpt; + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *acpt == NULL ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + acptbk = *acpt; + *acpt = (*acpt)->next; + +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + i = acptbk->pos; + if( nearest[i] == im ) + { + if( partmtx[im][i] > mindist[i] ) + { + msaresetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, seq, skiptable, tselfscore, result, joblist ); + } + } + } +} + +static void *kmerresetnearestthread( void *arg ) +{ + resetnearestthread_arg_t *targ = (resetnearestthread_arg_t *)arg; +// int thread_no = targ->thread_no; + int para = targ->para; + int im = targ->im; + int nseq = targ->nseq; + double **partmtx = targ->partmtx; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + int *tselfscore = targ->tselfscore; + int **pointt = targ->pointt; + int *nlen = targ->nlen; + double *result = targ->result; + int *joblist = targ->joblist; + Bchain **acpt = targ->acpt; + Bchain *ac = targ->ac; + + int *singlettable1; + + Bchain *acptbk; + Bchain *acptinit; + + int i; + + acptinit = *acpt; + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *acpt == NULL ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + acptbk = *acpt; + *acpt = (*acpt)->next; + +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + i = acptbk->pos; + if( nearest[i] == im ) + { + if( partmtx[im][i] > mindist[i] ) + { + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[i] ); + } + kmerresetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, tselfscore, pointt, nlen, singlettable1, result, joblist ); + if( pointt ) free( singlettable1 ); singlettable1 = NULL;// kmer + if( pointt ) commonsextet_p( NULL, NULL ); + } + } + } +} + + +typedef struct _compactdistarrthread_arg +{ + int para; + int njob; +// int thread_no; + int im; + int jm; + int *nlen; + char **seq; + int **skiptable; + int **pointt; + int *table1; + int *table2; + int *tselfscore; + Bchain **acpt; + int *posshared; + double *mindist; + double *newarr; + double **partmtx; + int *nearest; + int *joblist; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} compactdistarrthread_arg_t; + +static void *verycompactkmerdistarrthreadjoblist( void *arg ) // enablemultithread == 0 demo tsukau +{ + compactdistarrthread_arg_t *targ = (compactdistarrthread_arg_t *)arg; + int njob = targ->njob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *table1 = targ->table1; + int *table2 = targ->table2; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; +// double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *nlen = targ->nlen; + int **pointt = targ->pointt; + int *table1 = targ->table1; + int *table2 = targ->table2; + int *tselfscore = targ->tselfscore; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; +// double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nnjob; + int para = targ->para; + int im = targ->im; + int jm = targ->jm; +// int thread_no = targ->thread_no; + int *tselfscore = targ->tselfscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + int *joblist = targ->joblist; + int *posshared = targ->posshared; + double *mindist = targ->mindist; + int *nearest = targ->nearest; + double **partmtx = targ->partmtx; + double *newarr = targ->newarr; + int i, posinjoblist, n; + + double tmpdist1; + double tmpdist2; + double tmpdouble; + +// for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + + + while( 1 ) + { +#ifdef enablemultithread + if( para ) pthread_mutex_lock( targ->mutex ); +#endif + if( *posshared >= njob ) // block no toki >= + { +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + commonsextet_p( NULL, NULL ); + return( NULL ); + } + posinjoblist = *posshared; + *posshared += BLOCKSIZE; +#ifdef enablemultithread + if( para ) pthread_mutex_unlock( targ->mutex ); +#endif + + for( n=0; nrep1 == -1 ) return; + if( pt->child0 ) reformat_younger0_rec( ori, pt->child0, n, lastappear, topol, len, dep, pos ); + if( pt->child1 ) reformat_younger0_rec( ori, pt->child1, n, lastappear, topol, len, dep, pos ); + + topol[*pos][0] = (int *)realloc( topol[*pos][0], ( 2 ) * sizeof( int ) ); + topol[*pos][1] = (int *)realloc( topol[*pos][1], ( 2 ) * sizeof( int ) ); + + topol[*pos][0][1] = -1; + topol[*pos][1][1] = -1; + if( pt->rep0 < pt->rep1 ) + { + topol[*pos][0][0] = pt->rep0; + topol[*pos][1][0] = pt->rep1; + len[*pos][0] = pt->len0; + len[*pos][1] = pt->len1; + dep[*pos].child0 = lastappear[pt->rep0]; + dep[*pos].child1 = lastappear[pt->rep1]; + } + else + { + topol[*pos][1][0] = pt->rep0; + topol[*pos][0][0] = pt->rep1; + len[*pos][1] = pt->len0; + len[*pos][0] = pt->len1; + dep[*pos].child1 = lastappear[pt->rep0]; + dep[*pos].child0 = lastappear[pt->rep1]; + } + + lastappear[pt->rep0] = *pos; + lastappear[pt->rep1] = *pos; + dep[*pos].distfromtip = pt->height; +// reporterr( "STEP %d\n", *pos ); +// reporterr( "%d %f\n", topol[*pos][0][0], len[*pos][0] ); +// reporterr( "%d %f\n", topol[*pos][1][0], len[*pos][1] ); + (*pos)++; +} +#else +static void reformat_rec( Treept *ori, Treept *pt, int n, int *lastappear, int ***topol, double **len, Treedep *dep, int *pos ) +{ + if( pt->rep1 == -1 ) return; + if( pt->child0 ) reformat_rec( ori, pt->child0, n, lastappear, topol, len, dep, pos ); + if( pt->child1 ) reformat_rec( ori, pt->child1, n, lastappear, topol, len, dep, pos ); + + topol[*pos][0] = (int *)realloc( topol[*pos][0], ( 2 ) * sizeof( int ) ); + topol[*pos][1] = (int *)realloc( topol[*pos][1], ( 2 ) * sizeof( int ) ); + + topol[*pos][0][0] = pt->rep0; + topol[*pos][0][1] = -1; + topol[*pos][1][0] = pt->rep1; + topol[*pos][1][1] = -1; + len[*pos][0] = pt->len0; + len[*pos][1] = pt->len1; + + dep[*pos].child0 = lastappear[pt->rep0]; + dep[*pos].child1 = lastappear[pt->rep1]; + + lastappear[pt->rep0] = *pos; + lastappear[pt->rep1] = *pos; + + dep[*pos].distfromtip = pt->height; +// reporterr( "STEP %d\n", *pos ); +// reporterr( "%d %f\n", topol[*pos][0][0], len[*pos][0] ); +// reporterr( "%d %f\n", topol[*pos][1][0], len[*pos][1] ); + (*pos)++; +} +#endif + +static char *reformat_rec_newick( char **subtree, Treept *pt ) +{ + char *newick, *newick0, *newick1; + if( pt->rep1 == -1 ) return( subtree[pt->rep0] ); + + newick0 = reformat_rec_newick( subtree, pt->child0 ); + newick1 = reformat_rec_newick( subtree, pt->child1 ); + newick = calloc( strlen( newick0 ) + strlen( newick1 ) + 100, sizeof( char ) ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( pt->rep0 < pt->rep1 ) + sprintf( newick, "(%s:%7.5f,%s:%7.5f)", newick0, pt->len0, newick1, pt->len1 ); + else + sprintf( newick, "(%s:%7.5f,%s:%7.5f)", newick1, pt->len1, newick0, pt->len0 ); + free( newick0 ); + free( newick1 ); + return( newick ); +} + +static void reformattree( Treept *root, Treept *ori, int n, int ***topol, double **len, Treedep *dep, char **name, int treeout ) +{ + int i, pos; + char *newick; + int *lastappear; +// int rootpos; +// for( rootpos=n*2-2; rootpos>n; rootpos-- ) if( ori[rootpos].parent == NULL ) break; + + +// reporterr( "Reformat, i=%d\n", i ); +// reporterr( "njob=%d, treept[%d].parent,child0,child1 - self = %p,%p,%p - %p\n", n, i, treept[i].parent,treept[i].child0,treept[i].child1,treept+i ); + if( treeout ) + { + FILE *fp; + int j; + char namec, *nametmp, *tmpptr, **tree, *nameptr; + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( njob, 0 ); + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + + } + + free( nametmp ); + + + newick = reformat_rec_newick( tree, root ); // tree[] ha free sareru + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", newick ); + fclose( fp ); + free( tree ); // free[] ha free sareteiru + free( newick ); + +// FreeCharMtx( tree ); + } + + lastappear = (int *)malloc( sizeof( int ) * n ); + if( lastappear == NULL ) + { + reporterr( "Cannot allocate lastappear\n" ); + exit( 1 ); + } + for( i=0; iopt == -1.0 || uselh[i] == 0 || uselh[j] == 0 ) + if( uselh[i] == 0 && uselh[j] == 0 ) + { + return; + } + +#if DISPPAIRID + fprintf( *fpp, "node %d: %d (%d) - %d (%d) (%c)\n", n, i+1, ii, j+1, jj, tmpint ); +#endif + + opt = lh->opt; + size = 0; + for( tmpptr=lh; tmpptr; tmpptr=tmpptr->next ) size++; + +#if HAT3SORTED + if( fwrite( &size, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &opt, sizeof( double ), 1, *fpp ) != 1 ) +#else + if( fwrite( &ii, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &jj, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &size, sizeof( int ), 1, *fpp ) != 1 || + fwrite( &opt, sizeof( double ), 1, *fpp ) != 1 ) +#endif + { + reporterr( "write error, n=%d\n", n ); + exit( 1 ); + } + for( tmpptr=lh; tmpptr; tmpptr=tmpptr->next ) + { + len = tmpptr->end1-tmpptr->start1; + if( fwrite( &(tmpptr->start1), sizeof( int ), 1, *fpp ) != 1 || + fwrite( &(tmpptr->start2), sizeof( int ), 1, *fpp ) != 1 || + fwrite( &len, sizeof( int ), 1, *fpp ) != 1 ) + { + reporterr( "write error, n=%d\n", n ); + exit( 1 ); + } +// reporterr( "reg1:%d-%d, reg2:%d-%d, len=%d, score=%f\n", tmpptr->start1, tmpptr->start1+len, tmpptr->start2, tmpptr->start2+len, len, opt ); + } + c = '\n'; + fwrite( &c, sizeof( char ), 1, *fpp ); + } + } +} + + + +typedef struct _calcnearestthread_arg +{ + char **bseq; + int thread_no; + int *posshared; + int alloclen; + int nlim; + double *selfscore; + double *mindists; + int *neighbors; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} calcnearestthread_arg_t; + + +static void *calcnearestthread( void *arg ) +{ + calcnearestthread_arg_t *targ = (calcnearestthread_arg_t *)arg; + char **bseq = targ->bseq; + int thread_no = targ->thread_no; + int *posshared = targ->posshared; + int alloclen = targ->alloclen; + int nlim = targ->nlim; + double *selfscore = targ->selfscore; + double *mindists = targ->mindists; + int *neighbors = targ->neighbors; +#ifdef enablemultithread + pthread_mutex_t *mutex = targ->mutex; +#endif + int pos; + double tmpdist, mindist; + int progress; + int neighbor, i; + double (*distfunc)( char *, char *, double, double, int ); + if( alg == 'A' ) distfunc = distdp_noalign; + else if( alg == 'L' ) distfunc = distdpL_noalign; + else if( alg == 'N' ) distfunc = distdpN_noalign; + + while( 1 ) + { +#ifdef enablemultithread + pthread_mutex_lock( mutex ); +#endif +#if TREE7325 + if( *posshared > nlim ) +#else + if( *posshared < 1 ) // ? 2017/Apr/26 +#endif + { +#ifdef enablemultithread + pthread_mutex_unlock( mutex ); +#endif +// reporterr( "freeing tmpseq1\n" ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); + L__align11_noalign( NULL, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); + return( NULL ); + } + pos = *posshared; +#if TREE7325 + *posshared += 1; +#else + *posshared -= 1; +#endif +#ifdef enablemultithread + pthread_mutex_unlock( mutex ); +#endif + + if( (nlim-pos) % 100 == 0 ) + { + //progress = ( (unsigned long long)pos * (unsigned long long)nlim - (unsigned long long)pos*((unsigned long long)pos-1.0)*0.5 ) / ( (unsigned long long)nlim * ((unsigned long long)nlim-1.0) *0.5 ) * 100; +// progress = ( (double)pos * nlim - pos*(pos-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; + progress = ( (double)(nlim-pos) * nlim - (nlim-pos)*((nlim-pos)-1.0)*0.5 ) / ( nlim * (nlim-1.0) * 0.5 ) * 100; + reporterr( "Step %d (%d%%), thread %d \r", (nlim-pos), progress, thread_no ); + } + + mindist = 999.9; +#if TREE7325 + for( i=pos+1; i-1; i-- ) +#endif + { +#if 0 + tmpdist = 0.0; // test! +#else + tmpdist = distfunc( bseq[pos], bseq[i], selfscore[pos], selfscore[i], alloclen ); +#endif + if( mindist > tmpdist ) + { + mindist = tmpdist; + neighbor = i; + } + } + mindists[pos] = mindist; + neighbors[pos] = neighbor; + } +} + +typedef struct _jobplan +{ + int node; + int start; + int end; + int subid; + int divided; + unsigned long long npairs; +} Jobplan; + +typedef struct _recalcpairs4thread_arg +{ +// int thread_no; + int nseq; + int numjob; + Jobplan *jobplan; + char **bseq; +#if EXACTLYSAMEASPAIRLOCALALIGN + char **dseq; +#endif + int *joborder; + int *posshared; + int *uselh; + double *selfscore; + int alloclen; + int ***topol; + Treedep *dep; + unsigned long long *done; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} recalcpairs4thread_arg_t; + +static void *recalcpairs4thread( void *arg )// no TLS +{ + recalcpairs4thread_arg_t *targ = (recalcpairs4thread_arg_t *)arg; + char **bseq = targ->bseq; + int nseq=targ->nseq; + int numjob=targ->numjob; + int *posshared = targ->posshared; + int *joborder = targ->joborder; + int *uselh = targ->uselh; +// int thread_no = targ->thread_no; + int ***topol = targ->topol; + Jobplan *jobplan=targ->jobplan; + Treedep *dep = targ->dep; + int alloclen = targ->alloclen; + double *selfscore = targ->selfscore;; + unsigned long long *done = targ->done; +#ifdef enablemultithread + pthread_mutex_t *mutex = targ->mutex; +#endif + + int i, j, m0, m1, m00, m11, n, step, istart, iend, n1, n0, subid; + int prevn; + char *tmpseq1, *tmpseq2; + LocalHom *localhomtable; + int *mem0, *mem1; + FILE *localfp; + char *fn; + int progress = 0; + unsigned long long totalpairs = (unsigned long long)nseq*(nseq-1)/2; + int tmpnodepairs; + double **dynamicmtx = NULL; + double **mtxptr; + double (*distfunc)( double **, char *, char *, LocalHom *, double, double, int ); + if( alg == 'A' ) distfunc = distdp; + else if( alg == 'L' ) distfunc = distdpL; + else if( alg == 'N' ) distfunc = distdpN; + else + { + reporterr( "alg %c is not yet supported\n", alg ); + exit( 1 ); + } +#if EXACTLYSAMEASPAIRLOCALALIGN + double tmpdist; + char **dseq = targ->dseq; + double (*distfunc_noalign)( char *, char *, double, double, int ); + if( alg == 'A' ) distfunc_noalign = distdp_noalign; + else if( alg == 'L' ) distfunc_noalign = distdpL_noalign; + else if( alg == 'N' ) distfunc_noalign = distdpN_noalign; +#endif + + mem0 = calloc( sizeof( int ), njob ); + mem1 = calloc( sizeof( int ), njob ); + tmpseq1 = calloc( sizeof( char ), alloclen ); + tmpseq2 = calloc( sizeof( char ), alloclen ); + + localhomtable = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + freelocalhom1( localhomtable ); + if( specificityconsideration > 0.0 ) + { + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + mtxptr = dynamicmtx; + } + else + mtxptr = n_dis_consweight_multi; + + prevn = -1; + while( 1 ) + { +#ifdef enablemultithread + pthread_mutex_lock( mutex ); +#endif +// if( *posshared <= -1 ) + if( *posshared >= numjob ) + { +#ifdef enablemultithread + pthread_mutex_unlock( mutex ); +#endif +// reporterr( "freeing tmpseq1\n" ); + free( tmpseq1 ); tmpseq1 = NULL; + free( tmpseq2 ); tmpseq2 = NULL; + free( mem0 ); mem0 = NULL; + free( mem1 ); mem1 = NULL; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + G__align11( NULL, NULL, NULL, 0, 0, 0 ); + L__align11( NULL, 0.0, NULL, NULL, 0, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); +#if EXACTLYSAMEASPAIRLOCALALIGN + L__align11_noalign( NULL, NULL, NULL ); + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); +#endif + free( localhomtable ); + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + return( NULL ); + } + n = jobplan[step=joborder[*posshared]].node; +// *posshared -= 1; + *posshared += 1; + *done += jobplan[step].npairs; +// reporterr( "### nodenum=%d, step=%d, npairs=%lld\n", n, step, jobplan[step].npairs ); +#ifdef enablemultithread + pthread_mutex_unlock( mutex ); +#endif + + istart = jobplan[step].start; + iend = jobplan[step].end; + subid = jobplan[step].subid; + +#if EXACTLYSAMEASPAIRLOCALALIGN +#else + if( specificityconsideration > 0.0 ) + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[n].distfromtip ); +#endif + + if( step%100==0 ) +// if( *done % 100 == 0 ) + { + progress = (int)( (double)*done / totalpairs * 100 ); + reporterr( "Node %06d-%03d (%d%%) \r", n, subid, progress ); + } + + if( n != prevn ) + { +// reporterr( "compute mem1 and mem0. n=%d, prevn=%d\n", n, prevn ); + prevn = n; +#if N0LOOPFIRST +#if RECURSIVETOP + mem0[0] = -1; + n0 = topolorderz( mem0, topol, dep, n, 1 ) - mem0; + mem1[0] = -1; + n1 = topolorderz( mem1, topol, dep, n, 0 ) - mem1; +#else + topolorder_mudaari( njob, &n1, &n0, mem1, mem0, topol, dep, n ); +#endif +#else +#if RECURSIVETOP + mem0[0] = -1; + n0 = topolorderz( mem0, topol, dep, n, 0 ) - mem0; + mem1[0] = -1; + n1 = topolorderz( mem1, topol, dep, n, 1 ) - mem1; +#else + topolorder_mudaari( njob, &n0, &n1, mem0, mem1, topol, dep, n ); +#endif +#endif + } +// else reporterr( "reuse mem1 and mem0. n=%d\n", n ); + +#if 0 + reporterr( "mem0 = \n" ); + for( i=0; i m11 ) + { + m0 = m11; m1= m00; + } + else + { + m0 = m00; m1= m11; + } + + if( nadd ) + { + if( m1 < njob-nadd ) continue; +// if( m0 >= njob-nadd || m1 < njob-nadd ) continue; // oosugi! + } + tmpnodepairs++; +// reporterr( "node%d, %d x %d\n", n, m0+1, m1+1 ); + strcpy( tmpseq1, bseq[m0] ); + strcpy( tmpseq2, bseq[m1] ); + + +#if EXACTLYSAMEASPAIRLOCALALIGN + if( specificityconsideration > 0.0 ) + { + tmpdist = distfunc_noalign( dseq[m0], dseq[m1], selfscore[m0], selfscore[m1], alloclen ); + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * tmpdist ); // upgma ni awaseru. + distfunc( dynamicmtx, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); + } + else + { + distfunc( n_dis_consweight_multi, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); + } +#else + distfunc( mtxptr, tmpseq1, tmpseq2, localhomtable, selfscore[m0], selfscore[m1], alloclen ); +#endif +// reporterr( "tmpdist = %f\n", tmpdist ); +#if N0LOOPFIRST + writehat3node_noaddress( n, m0, m1, j, i, &localfp, 'n', localhomtable, uselh ); +#else + writehat3node_noaddress( n, m0, m1, i, j, &localfp, 'n', localhomtable, uselh ); +#endif + freelocalhom1( localhomtable ); + } + } + fclose( localfp ); +// reporterr( "node = %d, tmpnodepairs = %d\n", n, tmpnodepairs ); + } +} + +static void calcnearest_para( int njob, double *selfscore, char **bseq, int alloclen, int *neighbors, double *mindists ) +{ + int i; + calcnearestthread_arg_t *targ; +#ifdef enablemultithread + pthread_t *handle; + pthread_mutex_t mutex; +#endif + int posshared; + +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + +#if TREE7325 + posshared = 0; +#else + posshared = njob-1; +#endif + targ = calloc( nthread, sizeof( calcnearestthread_arg_t ) ); +#ifdef enablemultithread + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); +#endif + + for( i=0; i 7.383 + +// qsort( npairs, njob-1, sizeof( Pairnum ), compfuncpair ); + + if( nadd ) free( addmem ); + +// for( i=0; i-1; n-- ) +// for( k=0; k=0; k-- ) + { + + n = npairs[k].num; + if( mergeoralign[n] == 'n' ) continue; +// reporterr( "n=%d, go!\n", n ); + + n0 = npairs[k].n0; + n1 = npairs[k].n1; + + { + done += (double)npairs[k].npairs; +#if 0 +// blocksize0 = LHBLOCKSIZE/n1; + blocksize0 = (int)(sizeav * LHBLOCKFACTOR)/n1; + if( blocksize0 == 0 ) blocksize0 = 1; +#else + if ( (double)n0*n1*lenav*lenav > (double)MINBLOCKLEN2 ) + { + blocksize0 = (int)( (double)MINBLOCKLEN2/n1/lenav/lenav ); + if( blocksize0 == 0 ) blocksize0 = 1; +// reporterr( "dividing node %d, size=%f, size*len2=%f > %f\n", n, (double)n0*n1, (double)n0*n1*lenav*lenav, MINBLOCKLEN2 ); +// reporterr( "blocksize0=%d, n0=%d, n1=%d\n", blocksize0, n0, n1 ); + } + else + { + blocksize0 = n0; +// reporterr( "did not divide node %d, size=n1*n2=%f, size*len2=%f < %f\n", n, (double)n0*n1, (double)n0*n1*lenav*lenav, MINBLOCKLEN2 ); + } +#endif + } + +// reporterr( "blocksize0 = %d, n0=%d, n1=%d\n", blocksize0, n0, n1 ); + + if( numjob + n0/blocksize0+1 > nallocated ) + { + nallocated += n0/blocksize0+1; +// reporterr( "new nallocated = %d\n", nallocated ); + jobplan = realloc( jobplan, nallocated*sizeof( Jobplan ) ); + } + + if( n0 > blocksize0 ) + { + nnodesdivided++; +// reporterr( "node %d will be divided, because n0, %d > blocksize0, %d. nnodesdivided=%d, numjob=%d\n", n, n0, blocksize0, nnodesdivided, numjob ); + } + subid = 0; + for( b=0; b blocksize0 ) jobplan[numjob].divided = 1; + else jobplan[numjob].divided = 0; + numjob++; + subid++; + } + nfilesfornode[n] = subid; + } + + reporterr( "numjob=%d, nnodesdivided=%d, njob=%d\n", numjob, nnodesdivided, njob ); + reporterr( "Divided %d nodes to %d jobs\n", nnodesdivided, numjob-(njob-1) ); + + joborder = calloc( sizeof( int ), numjob ); + for( i=0; i-1; i-- ) +#else + tmpdist = mindists[1]; + treept[0].parent = treept+n; + treept[1].parent = treept+n; + treept[n].child0 = treept+0; + treept[n].child1 = treept+1; + treept[n].height = tmpdist * 0.5; + treept[n].len0 = tmpdist * 0.5; + treept[n].len1 = tmpdist * 0.5; + treept[n].parent = NULL; + treept[n].rep0 = 0; + treept[n].rep1 = 1; + root = treept+n; + for( i=2; iparent; p!=NULL; b=p,p=p->parent ) + { +// reporterr( "checking %p->%p (height=%f)\n", b, p, p->height ); + if( p->height > mindist * 0.5 ) break; + } + + if( p == NULL ) + { + treept[n].parent = NULL; + root = treept+n; + } + else if( p->child0 == b ) + { + p->child0 = treept+n; + p->len0 = p->height-mindist*0.5; + treept[n].parent = p; + } + else if( p->child1 == b ) + { + p->child1 = treept+n; + p->len1 = p->height-mindist*0.5; + treept[n].parent = p; + } + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + + treept[i].parent = treept+n; + b->parent = treept+n; + + treept[n].child0 = b; + treept[n].child1 = treept+i; + treept[n].height = mindist * 0.5; + treept[n].rep0 = b->rep0; + treept[n].rep1 = treept[i].rep0; + treept[n].len0 = mindist*0.5-b->height; + treept[n].len1 = mindist*0.5; + } + reformattree( root, treept, njob, topol, len, dep, name, treeout ); + + free( treept ); +// free( neighbors ); +// free( mindists ); +} + +void compacttreedpdist( int njob, char **bseq, char **dseq, double *selfscore, int ***topol, double **len, char **name, Treedep *dep, int treeout, int alloclen, int *uselh, int *nfilesfornode, int treegiven ) +{ + int i, neighbor, n; + double tmpdist; + double mindist; +// int *commonanc; + + if( !treegiven ) + { + Treept *treept = NULL; + Treept *p, *b; + Treept *root; + int *neighbors; + double *mindists; + neighbors = calloc( sizeof( int ), njob ); + mindists = calloc( sizeof( double ), njob ); + calcnearest_para( njob, selfscore, dseq, alloclen, neighbors, mindists ); + treept = (Treept *)calloc( sizeof( Treept ), njob*2 ); + +// for( i=0; i-1; i-- ) +#else +// commonanc = (int *)calloc( njob, sizeof( int ) ); + tmpdist = mindists[1]; +// reporterr( "tmpdist = %f\n", tmpdist ); +// reporterr( "%f ?= %f\n", tmpdist, distfromfile( njob, njob-2, njob-1, hat2fp ) ); +// reporterr( "%f ?= %f\n", tmpdist, mindists[njob-2] ); + treept[0].parent = treept+n; + treept[1].parent = treept+n; + treept[n].child0 = treept+0; + treept[n].child1 = treept+1; + treept[n].height = tmpdist * 0.5; + treept[n].len0 = tmpdist * 0.5; + treept[n].len1 = tmpdist * 0.5; + treept[n].parent = NULL; + treept[n].rep0 = 0; + treept[n].rep1 = 1; + root = treept+n; + + for( i=2; iparent; p!=NULL; b=p,p=p->parent ) + { +// reporterr( "checking %p->%p (height=%f)\n", b, p, p->height ); + if( p->height > mindist * 0.5 ) break; + } + + if( p == NULL ) + { + treept[n].parent = NULL; + root = treept+n; + } + else if( p->child0 == b ) + { + p->child0 = treept+n; + p->len0 = p->height-mindist*0.5; + treept[n].parent = p; + } + else if( p->child1 == b ) + { + p->child1 = treept+n; + p->len1 = p->height-mindist*0.5; + treept[n].parent = p; + } + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + + treept[i].parent = treept+n; + b->parent = treept+n; + + treept[n].child0 = b; + treept[n].child1 = treept+i; + treept[n].height = mindist * 0.5; + treept[n].rep0 = b->rep0; + treept[n].rep1 = treept[i].rep0; + treept[n].len0 = mindist*0.5-b->height; + treept[n].len1 = mindist*0.5; + } + reformattree( root, treept, njob, topol, len, dep, name, treeout ); + + free( treept ); + free( neighbors ); + free( mindists ); + } + else + { + reporterr( "treegiven\n" ); + } + + +#if EXACTLYSAMEASPAIRLOCALALIGN + recalcpairs_para4( njob, topol, dep, bseq, dseq, selfscore, alloclen, uselh, nfilesfornode ); +#else + recalcpairs_para4( njob, topol, dep, bseq, selfscore, alloclen, uselh, nfilesfornode ); +#endif +#if HAT3SORTED +// recalcpairs_para2( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); +#else +// recalcpairs_para3( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); +#endif +// recalcpairs( njob, topol, dep, bseq, selfscore, alloclen, hat3node, fd0, fd1, uselh ); + + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // 20130603 + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + + +// free( commonanc ); +// commonsextet_p( NULL, NULL ); +// distdppairs_para( 0, 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL ); +// distdppairsthread( NULL ); +} + +void compacttree_memsaveselectable( int nseq, double **partmtx, int *nearest, double *mindist, int **pointt, int *tselfscore, char **seq, int **skiptable, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int treeout, int howcompact, int memsave ) +{ + int i, j, k; +// int miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; +// double tmpdouble; +// double eff1, eff0; + double *tmptmplen = NULL; //static? + int *hist = NULL; //static? + Bchain *ac = NULL; //static? + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; //static? + int nmemim, nmemjm; + double minscore; + char **tree; //static? + char *treetmp; //static? + char *nametmp, *nameptr, *tmpptr; //static? + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + int *singlettable1 = NULL; + int *singlettable2 = NULL; + double *newarr; + void *(*distarrfunc)( void * ); + void *(*resetnearestfunc)( void * ); + int numfilled; + compactdistarrthread_arg_t *distarrarg; + resetnearestthread_arg_t *resetarg; + int *joblist, nactive, posshared; + double *result; + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( howcompact == 2 ) + { + if( seq ) + { +// distarrfunc = verycompactmsadistarrthread; + distarrfunc = verycompactmsadistarrthreadjoblist; + resetnearestfunc = NULL; + } + else + { +// distarrfunc = verycompactkmerdistarrthread; + distarrfunc = verycompactkmerdistarrthreadjoblist; + resetnearestfunc = NULL; + } + } + else + { + if( seq ) + { + distarrfunc = msadistarrthreadjoblist; + resetnearestfunc = msaresetnearestthread; + } + else + { + distarrfunc = kmerdistarrthreadjoblist; + resetnearestfunc = kmerresetnearestthread; + } + } + distarrarg = calloc( MAX( nthreadpair, 1 ), sizeof( compactdistarrthread_arg_t ) ); + resetarg = calloc( MAX( nthreadpair, 1 ), sizeof( resetnearestthread_arg_t ) ); + joblist = calloc( njob, sizeof( int ) ); + if( howcompact != 2 ) result = calloc( njob, sizeof( double ) ); + else result = NULL; + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + if( treeout ) + { + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi + tree = AllocateCharMtx( njob, 0 ); + } + } + + + if( treeout ) + { + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + } + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "k=%d i=%d, mindist[i]=%f\n", k, i, mindist[i] ); + if( mindist[i] < minscore ) // muscle + { + im = i; + minscore = mindist[i]; + } + } +// printf( "minscore=%f\n", minscore ); + jm = nearest[im]; +// printf( "im=%d\n", im ); +// printf( "jm=%d\n", jm ); + + + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + if( partmtx[im] == NULL && howcompact != 2 ) numfilled++; + if( partmtx[jm] != NULL ) numfilled--; + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + if( memsave ) + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave + else + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); // memsave + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } + if( memsave ) + { + *intpt++ = *pt11; + *intpt = -1; + } + else + { + reporterr( "This version supports memsave=1 only\n" ); // fukkatsu saseru tokiha pt22 wo dainyu. + exit( 1 ); + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + if( memsave ) + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); // memsave + else + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); // memsave + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } + if( memsave ) + { + *intpt++ = *pt11; + *intpt = -1; + } + else + { + reporterr( "This version supports memsave=1 only\n" ); // fukkatsu saseru tokiha pt22 wo dainyu. + exit( 1 ); + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + } + + minscore *= 0.5; + +// printf( "minscore = %f, tmptmplen[im] = %f, tmptmplen[jm] = %f\n", minscore, tmptmplen[im], tmptmplen[jm] ); + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + mindist[im] = 999.9; + + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + singlettable2 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[im] ); + makecompositiontable_global( singlettable2, pointt[jm] ); + } + + newarr = calloc( nseq, sizeof( double ) ); + + + + for( acpti=ac,nactive=0; acpti!=NULL; acpti=acpti->next ) joblist[nactive++] = acpti->pos; // sukoshi muda... + + +#ifdef enablemultithread + if( nthreadpair > 0 ) + { + compactdistarrthread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + + posshared = 0; +// targ = calloc( nthreadpair, sizeof( compactdistarrthread_arg_t ) ); + targ = distarrarg; + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + if( k % 100 == 0 ) reporterr( " (%d threads, nactive=%d, nfilled=%d) \r", nthreadpair, nactive, numfilled ); + for( i=0; inext ) // antei sei no tame + { + i = acpti->pos; + if( i != im && i != jm ) + { +// if( partmtx[i] ) partmtx[i][im] = partmtx[i][jm] = newarr[i]; // heiretsu demo ii. +// if( newarr[i] < mindist[i] ) +// { +// mindist[i] = newarr[i]; +// nearest[i] = im; +// } + if( newarr[i] < mindist[im] ) + { + mindist[im] = newarr[i]; + nearest[im] = i; + } +// if( nearest[i] == jm ) +// { +// nearest[i] = im; +// } + } + } +#endif + } + else +#endif + { + if( k % 100 == 0 ) reporterr( " (serial, nactive=%d, nfilled=%d) \r", nactive, numfilled ); + compactdistarrthread_arg_t *targ; + + posshared = 0; +// targ = calloc( 1, sizeof( compactdistarrthread_arg_t ) ); + targ = distarrarg; + + for( i=0; i<1; i++ ) + { + targ[i].para = 0; + targ[i].njob = nactive; +// targ[i].thread_no = i; + targ[i].im = im; + targ[i].jm = jm; + targ[i].tselfscore = tselfscore; + targ[i].nlen = nlen; + targ[i].seq = seq; + targ[i].skiptable = skiptable; + targ[i].pointt = pointt; + targ[i].table1 = singlettable1; + targ[i].table2 = singlettable2; + targ[i].joblist = joblist; + targ[i].posshared = &posshared; + targ[i].mindist = mindist; + targ[i].nearest = nearest; + targ[i].newarr = newarr; + targ[i].partmtx = partmtx; + + distarrfunc( targ+i ); +// pthread_create( handle, NULL, distarrfunc, (void *)(targ) ); + } + +// free( targ ); + + } + + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) // antei sei no tame + { + i = acpti->pos; + if( i != im && i != jm ) + { +// if( partmtx[i] ) partmtx[i][im] = partmtx[i][jm] = newarr[i]; // heiretsu demo ii. +// if( newarr[i] < mindist[i] ) +// { +// mindist[i] = newarr[i]; +// nearest[i] = im; +// } + if( newarr[i] < mindist[im] ) + { + mindist[im] = newarr[i]; + nearest[im] = i; + } +// if( nearest[i] == jm ) +// { +// nearest[i] = im; +// } + } + } + +// printf( "im=%d, jm=%d\n", im, jm ); +#if 0 + printf( "matrix = \n" ); + for( i=0; inext = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + +#if 0 // muscle seems to miss this. +// int nwork = 0; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "reset nearest? i=%d, k=%d, nearest[i]=%d, im=%d, mindist=%f\n", i, k, nearest[i], im, mindist[i] ); + if( nearest[i] == im ) + { +// printf( "reset nearest, i=%d, k=%d\n", i, k ); + if( partmtx[im][i] > mindist[i] ) + { +// nwork++; +// printf( "go\n" ); + if( pointt ) // kmer + { + singlettable1 = (int *)calloc( tsize, sizeof( int ) ); + makecompositiontable_global( singlettable1, pointt[i] ); + } + resetnearest( nseq, ac, partmtx, mindist+i, nearest+i, i, seq, skiptable, tselfscore, pointt, nlen, singlettable1 ); + if( pointt ) free( singlettable1 ); singlettable1 = NULL;// kmer + if( pointt ) commonsextet_p( NULL, NULL ); + } + } + } +// reporterr( "nwork = %d\n", nwork ); +#else + + if( howcompact == 2 ) continue; + +#if 0 + if( 0 && nthreadpair > 0 ) + { + resetnearestthread_arg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + Bchain *acshared; + + acshared = ac; +// targ = calloc( nthreadpair, sizeof( resetnearestthread_arg_t ) ); + targ = resetarg; + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i]+1 ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i]+1 ); + printf( "\n" ); +#endif + } + if( treeout ) + { + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + } + + for( im=0; im _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "k=%d i=%d, mindist[i]=%f\n", k, i, mindisfrom[i] ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + +// printf( "minscore=%f\n", minscore ); + jm = nearest[im]; +// printf( "im=%d\n", im ); +// printf( "jm=%d\n", jm ); + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 // memsave + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); // memsave + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 // memsave + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + minscore *= 0.5; + +// printf( "minscore = %f, tmptmplen[im] = %f, tmptmplen[jm] = %f\n", minscore, tmptmplen[im], tmptmplen[jm] ); + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); +// printf( "tmpdouble=%f, eff0=%f, eff1=%f\n", tmpdouble, eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } +// printf( "im=%d, jm=%d\n", im, jm ); +#if 0 + printf( "matrix = \n" ); + for( i=0; ij ) + { + minijm=j; + maxijm=i; + } + else + { + minijm=i; + maxijm=j; + } + printf( "%f ", eff[minijm][maxijm-minijm] ); + } + printf( "\n" ); + } +#endif + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; // Ato de fukkatsu + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// printf( "reset nearest? i=%d, k=%d, nearest[i]=%d, im=%d, mindist=%f\n", i, k, nearest[i], im, mindisfrom[i] ); + if( nearest[i] == im ) + { +// printf( "reset nearest, i=%d, k=%d\n", i, k ); + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + { +// printf( "go\n" ); + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } + } +#else + reporterr( "CHUUI!\n" ); +#endif + + + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + if( treeout == 2 ) + { + int *mem = calloc( sizeof( int ), nseq ); + fprintf( fp, "\nDensity:" ); + for( k=0; k-1; i++ ) fprintf( fp, " %03d", topol[k][0][i]+1 ); + fprintf( fp, "%d:", getdensest( mem, density )+1 ); + for( i=0; mem[i]>-1; i++ ) fprintf( fp, " %d", mem[i]+1 ); + fprintf( fp, "\n" ); + + topolorderz( mem, topol, dep, k, 1 ); +// fprintf( fp, "len1 = %f\n", len[k][1] ); +// for( i=0; topol[k][1][i]>-1; i++ ) fprintf( fp, " %03d", topol[k][1][i]+1 ); + fprintf( fp, "%d:", getdensest( mem, density )+1 ); + for( i=0; mem[i]>-1; i++ ) fprintf( fp, " %d", mem[i]+1 ); + fprintf( fp, "\n" ); + } + free( mem ); + } + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + if( treeout == 2 ) free( density ); +} + +void fixed_musclesupg_double_realloc_nobk_halfmtx_treeout( int nseq, double **eff, int ***topol, double **len, char **name, int *nlen, Treedep *dep, int efffree ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + double *tmptmplen = NULL; //static? + int *hist = NULL; //static? + Bchain *ac = NULL; //static? + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; //static? + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + char **tree; //static? + char *treetmp; //static? + char *nametmp, *nameptr, *tmpptr; //static? + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; +// reporterr( "\n##### dep[%d].distfromtip = %f\n", k, minscore ); + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; +#if 0 + tmpdouble = eff[miniim][maxiim-miniim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim-miniim] = + (clusterfuncpt[0])( eff0, eff1 ); + + +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#else + reporterr( "chuui!\n" ); +#endif + + +#if 0 + printf( "\nooSTEP-%03d:\n", k+1 ); + printf( "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) printf( " %03d", topol[k][0][i]+1 ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i]+1 ); + printf( "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); + + free( tree[0] ); + free( tree ); + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + +void fixed_musclesupg_double_treeout( int nseq, double **eff, int ***topol, double **len, char **name ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + static int *nmemar; + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + static char **tree; + static char *treetmp; + static char *nametmp, *nameptr, *tmpptr; + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + + + sueff1 = 1.0 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + + + + +#if 0 + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); + treetmp = AllocateCharVec( njob*150 ); + nametmp = AllocateCharVec( 91 ); + tree = AllocateCharMtx( njob, njob*150 ); + } + for( i=0; i _ no tame + + sprintf( tree[i], "\n%d_%.60s\n", i+1, nameptr ); + } + +#else + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + +#endif + + + + + + + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + nmemim = nmemar[im]; +// intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + intpt = topol[k][0]; + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + nmemjm = nmemar[jm]; +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + intpt = topol[k][1]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; +#if 0 + tmpdouble = eff[miniim][maxiim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } +#if 0 + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#else + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); +#endif + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim] > mindisfrom[i] ) + setnearest_double_fullmtx( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "\nvSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); +#if 0 + FreeCharMtx( tree ); +#else + free( tree[0] ); + free( tree ); +#endif + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + +void fixed_supg_double_treeout_constrained( int nseq, double **eff, int ***topol, double **len, char **name, int ngroup, int **groups ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Bchain *ac = NULL; + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti, *acptj; + int *pt1, *pt2, *pt11, *pt22; + static int *nmemar; + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by D.Mathog, a guess + double *mindisfrom = NULL; // by D.Mathog, a guess + static char **tree; + static char *treetmp; + static char *nametmp, *nameptr, *tmpptr; + FILE *fp; + double (*clusterfuncpt[1])(double,double); + char namec; + int *testtopol, **inconsistent; + int **inconsistentpairlist; + int ninconsistentpairs; + int maxinconsistentpairs; + int *warned; + int allinconsistent; + int firsttime; + + increaseintergroupdistancesfullmtx( eff, ngroup, groups, nseq ); + + sueff1 = 1 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + + + + +#if 0 + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); + treetmp = AllocateCharVec( njob*150 ); + nametmp = AllocateCharVec( 91 ); + tree = AllocateCharMtx( njob, njob*150 ); + } + for( i=0; i _ no tame + + sprintf( tree[i], "\n%d_%.60s\n", i+1, nameptr ); + } + +#else + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateDoubleVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateDoubleVec( njob ); + nearest = AllocateIntVec( njob ); +// treetmp = AllocateCharVec( njob * ( B + 100 ) ); // nagasugi? + treetmp = NULL; // kentou 2013/06/12 + nametmp = AllocateCharVec( 1000 ); // nagasugi +// tree = AllocateCharMtx( njob, njob*600 ); + tree = AllocateCharMtx( njob, 0 ); + testtopol = AllocateIntVec( njob + 1 ); + inconsistent = AllocateIntMtx( njob, njob ); // muda +// inconsistentpairlist = AllocateIntMtx( njob*(njob-1)/2+1, 2 ); // muda + inconsistentpairlist = AllocateIntMtx( 1, 2 ); + warned = AllocateIntVec( ngroup ); + } + + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + +#endif + + + + + + + + + for( i=0; inext!=NULL; acpti=acpti->next ) for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) inconsistent[acpti->pos][acptj->pos] = 0; + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + } + else + { + minscore = 999.9; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[i][j] && (tmpdouble=eff[i][j]) < minscore ) + { + minscore = tmpdouble; + im = i; jm = j; + } + } + for( acptj=ac; (acptj&&acptj->pos!=i); acptj=acptj->next ) + { + j = acptj->pos; + if( !inconsistent[j][i] && (tmpdouble=eff[j][i]) < minscore ) + { + minscore = tmpdouble; + im = j; jm = i; + } + } + } + } + + allinconsistent = 1; + for( acpti=ac; acpti->next!=NULL; acpti=acpti->next ) + { + for( acptj=acpti->next; acptj!=NULL; acptj=acptj->next ) + { + if( inconsistent[acpti->pos][acptj->pos] == 0 ) + { + allinconsistent = 0; + goto exitloop_d; + } + } + } + exitloop_d: + + if( allinconsistent ) + { + reporterr( "\n\n\nPlease check whether the grouping is possible.\n\n\n" ); + exit( 1 ); + } +#if 1 + intpt = testtopol; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + } + else + { + for( intpt2=topol[prevnode][0]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=topol[prevnode][1]; *intpt2!=-1; ) + *intpt++ = *intpt2++; + } + *intpt = -1; +// reporterr( "testtopol = \n" ); +// for( i=0; testtopol[i]>-1; i++ ) reporterr( " %03d", testtopol[i]+1 ); +// reporterr( "\n" ); +#endif + for( i=0; i-1; j++ ) reporterr( " %03d", groups[i][j]+1 ); +// reporterr( "\n" ); + if( overlapmember( testtopol, groups[i] ) ) + { + if( !includemember( testtopol, groups[i] ) && !includemember( groups[i], testtopol ) ) + { + if( !warned[i] ) + { + warned[i] = 1; + reporterr( "\n###################################################################\n" ); + reporterr( "# WARNING: Group %d is forced to be a monophyletic cluster.\n", i+1 ); + reporterr( "###################################################################\n" ); + } + inconsistent[im][jm] = 1; + + if( maxinconsistentpairs < ninconsistentpairs+1 ) + { + inconsistentpairlist = realloc( inconsistentpairlist, (ninconsistentpairs+1)*sizeof( int * ) ); + for( j=maxinconsistentpairs; j *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + nmemjm = nmemar[jm]; +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + intpt = topol[k][1]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + if( len[k][0] < 0.0 ) len[k][0] = 0.0; + if( len[k][1] < 0.0 ) len[k][1] = 0.0; + + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + eff[im][jm] = 999.9; +// eff[im][jm-im] = 999.9; // bug?? + + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; +#if 0 + tmpdouble = eff[miniim][maxiim] = + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + tmpdouble = eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); +#endif + +#if 1 + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } +#endif + } + } +#if 0 + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#else + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); +#endif + + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; +// free( (void *)eff[jm] ); eff[jm] = NULL; + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim] > mindisfrom[i] ) + setnearest_double_fullmtx( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "\ncSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); + fclose( fp ); +#if 0 + FreeCharMtx( tree ); +#else + free( tree[0] ); + free( tree ); +#endif + free( treetmp ); + free( nametmp ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); + free( testtopol ); + FreeIntMtx( inconsistent ); + for( i=0; i local, 2012/02/25 + int *hist = NULL; // static TLS -> local, 2012/02/25 + Bchain *ac = NULL; // static TLS -> local, 2012/02/25 + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11; + int *nmemar; // static TLS -> local, 2012/02/25 + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by Mathog, a guess + double *mindisfrom = NULL; // by Mathog, a guess + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( 2 ) * sizeof( int ) ); // memsave +// intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( 2 ) * sizeof( int ) ); +// intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; +// pt22 = pt1; + } + else + { + pt11 = pt1; +// pt22 = pt2; + } +#if 1 + *intpt++ = *pt11; + *intpt = -1; +#else + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; +#endif + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; + tmpdouble = eff[miniim][maxiim-miniim] = +#if 0 + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "vSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} +void fixed_musclesupg_double_realloc_nobk_halfmtx( int nseq, double **eff, int ***topol, double **len, Treedep *dep, int progressout, int efffree ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + double *tmptmplen = NULL; // static TLS -> local, 2012/02/25 + int *hist = NULL; // static TLS -> local, 2012/02/25 + Bchain *ac = NULL; // static TLS -> local, 2012/02/25 + int im = -1, jm = -1; + Bchain *acjmnext, *acjmprev; + int prevnode; + Bchain *acpti; + int *pt1, *pt2, *pt11, *pt22; + int *nmemar; // static TLS -> local, 2012/02/25 + int nmemim, nmemjm; + double minscore; + int *nearest = NULL; // by Mathog, a guess + double *mindisfrom = NULL; // by Mathog, a guess + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - (double)sueff_global; + sueff05 = (double)sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = AllocateFloatVec( njob ); + ac = (Bchain *)malloc( njob * sizeof( Bchain ) ); + nmemar = AllocateIntVec( njob ); + mindisfrom = AllocateFloatVec( njob ); + nearest = AllocateIntVec( njob ); + } + + + for( i=0; inext!=NULL; acpti=acpti->next ) + { + i = acpti->pos; +// reporterr( "k=%d i=%d\n", k, i ); + if( mindisfrom[i] < minscore ) // muscle + { + im = i; + minscore = mindisfrom[i]; + } + } + jm = nearest[im]; + if( jm < im ) + { + j=jm; jm=im; im=j; + } + + + prevnode = hist[im]; + if( dep ) dep[k].child0 = prevnode; + nmemim = nmemar[im]; + intpt = topol[k][0] = (int *)realloc( topol[k][0], ( nmemim + 1 ) * sizeof( int ) ); + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + prevnode = hist[jm]; + if( dep ) dep[k].child1 = prevnode; + nmemjm = nmemar[jm]; + intpt = topol[k][1] = (int *)realloc( topol[k][1], ( nmemjm + 1 ) * sizeof( int ) ); + if( !intpt ) + { + reporterr( "Cannot reallocate topol\n" ); + exit( 1 ); + } + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = ( minscore - tmptmplen[im] ); + len[k][1] = ( minscore - tmptmplen[jm] ); + + if( dep ) dep[k].distfromtip = minscore; + + tmptmplen[im] = minscore; + + hist[im] = k; + nmemar[im] = nmemim + nmemjm; + + mindisfrom[im] = 999.9; + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim-miniim]; + eff1 = eff[minijm][maxijm-minijm]; + tmpdouble = eff[miniim][maxiim-miniim] = +#if 0 + MIN( eff0, eff1 ) * sueff1 + ( eff0 + eff1 ) * sueff05; +#else + (clusterfuncpt[0])( eff0, eff1 ); +#endif + if( tmpdouble < mindisfrom[i] ) + { + mindisfrom[i] = tmpdouble; + nearest[i] = im; + } + if( tmpdouble < mindisfrom[im] ) + { + mindisfrom[im] = tmpdouble; + nearest[im] = i; + } + if( nearest[i] == jm ) + { + nearest[i] = im; + } + } + } + +// reporterr( "im,jm=%d,%d\n", im, jm ); + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + acjmprev->next = acjmnext; + if( acjmnext != NULL ) + acjmnext->prev = acjmprev; + if( efffree ) + { + free( (void *)eff[jm] ); eff[jm] = NULL; + } + +#if 1 // muscle seems to miss this. + for( acpti=ac; acpti!=NULL; acpti=acpti->next ) + { + i = acpti->pos; + if( nearest[i] == im ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + } + else + { + miniim = im; + maxiim = i; + } + if( eff[miniim][maxiim-miniim] > mindisfrom[i] ) + setnearest( nseq, ac, eff, mindisfrom+i, nearest+i, i ); + } + } +#endif + + +#if 0 + fprintf( stdout, "vSTEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i]+1 ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i]+1 ); + fprintf( stdout, "\n" ); +#endif + } + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + free( (void *)nmemar ); nmemar = NULL; + free( mindisfrom ); + free( nearest ); +} + + + + + + + + + +void veryfastsupg_double_loadtree( int nseq, double **eff, int ***topol, double **len, char **name ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double eff1, eff0; + int *hist = NULL; + Achain *ac = NULL; + double minscore; + char **tree; + char *treetmp; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + FILE *fp; + int node[2]; + double lenfl[2]; + char *nametmp, *nameptr, *tmpptr; //static? + char namec; + + fp = fopen( "_guidetree", "r" ); + if( !fp ) + { + reporterr( "cannot open _guidetree\n" ); + exit( 1 ); + } + + + if( !hist ) + { +// treetmp = AllocateCharVec( njob*50 ); + treetmp = NULL; +// tree = AllocateCharMtx( njob, njob*50 ); + tree = AllocateCharMtx( njob, 0 ); + nametmp = AllocateCharVec( 1000 ); // nagasugi + hist = AllocateIntVec( njob ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i _ no tame + + tree[i] = calloc( strlen( nametmp )+100, sizeof( char ) ); // suuji no bun de +100 + if( tree[i] == NULL ) + { + reporterr( "Cannot allocate tree!\n" ); + exit( 1 ); + } + sprintf( tree[i], "\n%d_%.900s\n", i+1, nameptr ); + } + + for( i=0; i nseq-1 || jm > nseq-1 || tree[im] == NULL || tree[jm] == NULL ) + { + reporterr( "\n\nCheck the guide tree.\n" ); + reporterr( "im=%d, jm=%d\n", im+1, jm+1 ); + reporterr( "Please use newick2mafft.rb to generate a tree file from a newick tree.\n\n" ); + exit( 1 ); + } + + +// reporterr( "im=%d, jm=%d, minscore = %f\n", im, jm, minscore ); + + + if( lenfl[0] == -1.0 || lenfl[1] == -1.0 ) + { + reporterr( "\n\nWARNING: Branch length is not given.\n" ); + exit( 1 ); + } + + if( lenfl[0] < 0.0 ) lenfl[0] = 0.0; + if( lenfl[1] < 0.0 ) lenfl[1] = 0.0; +#endif + +// reporterr( "im=%d, jm=%d\n", im, jm ); + + intpt = topol[k][0]; + prevnode = hist[im]; + if( prevnode == -1 ) + { + *intpt++ = im; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + +#if 0 + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; +#else + len[k][0] = lenfl[0]; + len[k][1] = lenfl[1]; +#endif + + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + + ( eff0 + eff1 ) * 0.5 * sueff_global; + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; + + + treetmp = realloc( treetmp, strlen( tree[im] ) + strlen( tree[jm] ) + 100 ); // 22 de juubunn (:%7,:%7) %7 ha minus kamo + if( !treetmp ) + { + reporterr( "Cannot allocate treetmp\n" ); + exit( 1 ); + } + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + free( tree[im] ); + free( tree[jm] ); + tree[im] = calloc( strlen( treetmp )+1, sizeof( char ) ); + tree[jm] = NULL; + if( tree[im] == NULL ) + { + reporterr( "Cannot reallocate tree!\n" ); + exit( 1 ); + } + strcpy( tree[im], treetmp ); + +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); +// strcpy( tree[im], treetmp ); + +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } + fclose( fp ); + + + fp = fopen( "infile.tree", "w" ); + fprintf( fp, "%s;\n", treetmp ); +// fprintf( fp, "by veryfastsupg_double_loadtree\n" ); + fclose( fp ); + +#if 1 + reporterr( "\n" ); + free( hist ); + free( (char *)ac ); + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); +#endif + +#if 0 +// reporterr( "reconstructing eff[][]\n" ); // Tsune ni hat2 ha aru node koreha iranai. + for( k=0; k-1; i++ ) + { + reporterr( " %03d", im ); + } + fprintf( stdout, "\n" ); + for( i=0; (jm=topol[k][1][i])>-1; i++ ) + { + reporterr( " %03d", jm ); + } + for( i=0; (im=topol[k][0][i])>-1; i++ ) for( j=0; (jm=topol[k][1][j])>-1; j++ ) + { + eff[im][jm] += len[k][0] + len[k][1]; + eff[jm][im] += len[k][0] + len[k][1]; + } + } +#endif +} + +#if 0 +void veryfastsupg_double( int nseq, double **eff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + double minscore; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + if( !hist ) + { + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; + + tmptmplen[im] = minscore; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + + ( eff0 + eff1 ) * 0.5 * sueff_global; + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } +#if 1 + reporterr( "\n" ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; +#endif +} +#endif + +void veryfastsupg_double_outtree( int nseq, double **eff, int ***topol, double **len, char **name ) // not used +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + double tmpdouble; + double eff1, eff0; + static double *tmptmplen = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + double minscore; + static char **tree; + static char *treetmp; + static char *nametmp; + FILE *fpout; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + double (*clusterfuncpt[1])(double,double); + + + sueff1 = 1 - sueff_global; + sueff05 = sueff_global * 0.5; + if ( treemethod == 'X' ) + clusterfuncpt[0] = cluster_mix_double; + else if ( treemethod == 'E' ) + clusterfuncpt[0] = cluster_average_double; + else if ( treemethod == 'q' ) + clusterfuncpt[0] = cluster_minimum_double; + else + { + reporterr( "Unknown treemethod, %c\n", treemethod ); + exit( 1 ); + } + + if( !hist ) + { + treetmp = AllocateCharVec( njob*50 ); + tree = AllocateCharMtx( njob, njob*50 ); + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + nametmp = AllocateCharVec( 31 ); + } + +// for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + minscore *= 0.5; + + len[k][0] = minscore - tmptmplen[im]; + len[k][1] = minscore - tmptmplen[jm]; + + tmptmplen[im] = minscore; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + (clusterfuncpt[0])( eff0, eff1 ); + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; + + sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], len[k][0], tree[jm], len[k][1] ); + strcpy( tree[im], treetmp ); +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } + fpout = fopen( "infile.tree", "w" ); + fprintf( fpout, "%s;\n", treetmp ); +// fprintf( fpout, "by veryfastsupg_double_outtree\n" ); + fclose( fpout ); +#if 1 + reporterr( "\n" ); + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; + FreeCharMtx( tree ); + free( treetmp ); + free( nametmp ); +#endif +} + +void veryfastsupg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; + int *intpt, *intpt2; + int tmpint; + int eff1, eff0; + static double *tmptmplen = NULL; + static int **eff = NULL; + static int *hist = NULL; + static Achain *ac = NULL; + int minscore; + double minscoref; + int im = -1, jm = -1; + int prevnode, acjmnext, acjmprev; + int *pt1, *pt2, *pt11, *pt22; + if( !eff ) + { + eff = AllocateIntMtx( njob, njob ); + hist = AllocateIntVec( njob ); + tmptmplen = (double *)malloc( njob * sizeof( double ) ); + ac = (Achain *)malloc( njob * sizeof( Achain ) ); + } + + for( i=0; i *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } + + intpt = topol[k][1]; + prevnode = hist[jm]; + if( prevnode == -1 ) + { + *intpt++ = jm; + *intpt = -1; + } + else + { + pt1 = topol[prevnode][0]; + pt2 = topol[prevnode][1]; + if( *pt1 > *pt2 ) + { + pt11 = pt2; + pt22 = pt1; + } + else + { + pt11 = pt1; + pt22 = pt2; + } + for( intpt2=pt11; *intpt2!=-1; ) + *intpt++ = *intpt2++; + for( intpt2=pt22; *intpt2!=-1; ) + *intpt++ = *intpt2++; + *intpt = -1; + } +#else + intpt = topol[k][0]; + for( i=0; i -2 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i -2 ) + *intpt++ = i; + *intpt = -1; +#endif + + len[k][0] = minscoref - tmptmplen[im]; + len[k][1] = minscoref - tmptmplen[jm]; + + tmptmplen[im] = minscoref; + + hist[im] = k; + + for( i=0; i!=-1; i=ac[i].next ) + { + if( i != im && i != jm ) + { + if( i < im ) + { + miniim = i; + maxiim = im; + minijm = i; + maxijm = jm; + } + else if( i < jm ) + { + miniim = im; + maxiim = i; + minijm = i; + maxijm = jm; + } + else + { + miniim = im; + maxiim = i; + minijm = jm; + maxijm = i; + } + eff0 = eff[miniim][maxiim]; + eff1 = eff[minijm][maxijm]; + eff[miniim][maxiim] = + MIN( eff0, eff1 ) * ( 1.0 - sueff_global ) + // int?? + ( eff0 + eff1 ) * 0.5 * sueff_global; // int?? + } + } + acjmprev = ac[jm].prev; + acjmnext = ac[jm].next; + ac[acjmprev].next = acjmnext; + if( acjmnext != -1 ) + ac[acjmnext].prev = acjmprev; +#if 0 + fprintf( stdout, "STEP-%03d:\n", k+1 ); + fprintf( stdout, "len0 = %f\n", len[k][0] ); + for( i=0; topol[k][0][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][0][i] ); + fprintf( stdout, "\n" ); + fprintf( stdout, "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) fprintf( stdout, " %03d", topol[k][1][i] ); + fprintf( stdout, "\n" ); +#endif + } +#if 1 + FreeIntMtx( eff ); eff = NULL; + free( (void *)tmptmplen ); tmptmplen = NULL; + free( hist ); hist = NULL; + free( (char *)ac ); ac = NULL; +#endif +} + +void fastsupg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + static double *tmplen; + int *intpt; + double tmpdouble; + double eff1, eff0; + static double **eff = NULL; + static char **pair = NULL; + static Achain *ac; + double minscore; + int im = -1, jm = -1; + if( !eff ) + { + eff = AllocateFloatMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + tmplen = AllocateFloatVec( njob ); + ac = (Achain *)calloc( njob, sizeof( Achain ) ); + } +#endif + + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + minscore /= 2.0; + + len[k][0] = (double)minscore - tmplen[im]; + len[k][1] = (double)minscore - tmplen[jm]; + + tmplen[im] = (double)minscore; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) reporterr( " %03d", topol[k][0][i] ); + reporterr( "\n" ); + reporterr( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) reporterr( " %03d", topol[k][1][i] ); + reporterr( "\n" ); +#endif + } + reporterr( "\n" ); + +// FreeFloatMtx( eff ); +// FreeCharMtx( pair ); +// FreeFloatVec( tmplen ); +// free( ac ); +} +void supg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k, miniim, maxiim, minijm, maxijm; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + static double *tmplen; + int *intpt; + double **doubleptpt; + double *doublept; + double tmpdouble; + double eff1, eff0; + static double **eff = NULL; + static char **pair = NULL; + if( !eff ) + { + eff = AllocateFloatMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + tmplen = AllocateFloatVec( njob ); + } +#endif + + + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + intpt = topol[k][1]; + for( i=0; i 0 ) + *intpt++ = i; + *intpt = -1; + + len[k][0] = (double)minscore / 2.0 - tmplen[im]; + len[k][1] = (double)minscore / 2.0 - tmplen[jm]; + + tmplen[im] = (double)minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +void spg( int nseq, double **oeff, int ***topol, double **len ) +{ + int i, j, k; + double tmplen[M]; +#if 0 + double eff[nseq][nseq]; + char pair[njob][njob]; +#else + double **eff = NULL; + char **pair = NULL; + if( !eff ) + { + eff = AllocateDoubleMtx( njob, njob ); + pair = AllocateCharMtx( njob, njob ); + } +#endif + + for( i=0; i 0 ) + { + topol[k][0][count] = i; + count++; + } + topol[k][0][count] = -1; + for( i=0, count=0; i 0 ) + { + topol[k][1][count] = i; + count++; + } + topol[k][1][count] = -1; + + len[k][0] = minscore / 2.0 - tmplen[im]; + len[k][1] = minscore / 2.0 - tmplen[jm]; + + tmplen[im] = minscore / 2.0; + + for( i=0; i 0 ); + for( i=0; i-1; i++ ) printf( " %03d", topol[k][0][i] ); + printf( "\n" ); + printf( "len1 = %f\n", len[k][1] ); + for( i=0; topol[k][1][i]>-1; i++ ) printf( " %03d", topol[k][1][i] ); + printf( "\n" ); +#endif + } +} + +double ipower( double x, int n ) /* n > 0 */ +{ + double r; + + r = 1; + while( n != 0 ) + { + if( n & 1 ) r *= x; + x *= x; n >>= 1; + } + return( r ); +} + +void countnode( int nseq, int ***topol, double **node ) /* node[j][i] != node[i][j] */ +{ + int i, j, k, s1, s2; + static double rootnode[M]; + + if( nseq-2 < 0 ) + { + reporterr( "Too few sequence for countnode: nseq = %d\n", nseq ); + exit( 1 ); + } + + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } +} + +void countnode_int( int nseq, int ***topol, int **node ) /* node[i][j] == node[j][i] */ +{ + int i, j, k, s1, s2; + int rootnode[M]; + + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=localmem[1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + free( localmem[0] ); + free( localmem[1] ); + } + free( localmem ); + free( memhist[nseq-2] ); + free( memhist ); + + for( i=0; i -1; j++ ) + { + rootnode[s1] += (double)len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += (double)len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; i-1; j++ ) + rootnode[topol[i][0][j]]++; + for( j=0; topol[i][1][j]>-1; j++ ) + rootnode[topol[i][1][j]]++; + for( j=0; topol[i][0][j]>-1; j++ ) + { + s1 = topol[i][0][j]; + for( k=0; topol[i][1][k]>-1; k++ ) + { + s2 = topol[i][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2] - 1; + } + } + } + for( j=0; topol[nseq-2][0][j]>-1; j++ ) + { + s1 = topol[nseq-2][0][j]; + for( k=0; topol[nseq-2][1][k]>-1; k++ ) + { + s2 = topol[nseq-2][1][k]; + node[MIN(s1,s2)][MAX(s1,s2)] = rootnode[s1] + rootnode[s2]; + } + } + for( i=0; i -1; j++ ) + { + rootnode[s1] += len[i][0] * eff[s1]; + eff[s1] *= 0.5; +/* + rootnode[s1] *= 0.5; +*/ + + } + for( j=0; (s2=topol[i][1][j]) > -1; j++ ) + { + rootnode[s2] += len[i][1] * eff[s2]; + eff[s2] *= 0.5; +/* + rootnode[s2] *= 0.5; +*/ + + } + } + for( i=0; ilen2 ) break; + continue; + } + if( ms2 == (int)'-' ) + { + tmpscore += (double)penalty; + tmpscore += (double)amino_dis[ms1][ms2]; + while( (ms2=(unsigned char)seq2[++k]) == '-' ) + tmpscore += (double)amino_dis[ms1][ms2]; + k--; + if( k > len2 ) break; + continue; + } + } + return( tmpscore ); +} + +double score_calc1( char *seq1, char *seq2 ) /* method 1 */ +{ + int k; + double score = 0.0; + int count = 0; + int len = strlen( seq1 ); + + for( k=0; k 1 ) + { + if( utree == 0 ) + { + for( i=0; i 0.0 ) tmp /= count; + else( tmp = 0.0 ); + ch = (int)( tmp/100.0 - 0.000001 ); + sprintf( sco1+i, "%c", ch+0x61 ); + } + sco1[len] = 0; + + for( i=0; i 0.0 ) tmp /= count; + else( tmp = 0.0 ); + tmp = ( tmp - 400 * !scoremtx ) * 2; + if( tmp < 0 ) tmp = 0; + ch = (int)( tmp/100.0 - 0.000001 ); + sprintf( sco2+i, "%c", ch+0x61 ); + sco[i] = tmp; + } + sco2[len] = 0; + + for( i=WIN; i= bk+len1 ) { *str2 = *(str2-len1); str2--;} // by D.Mathog + while( str2 >= bk ) { *str2-- = *str1--; } +} + +int isaligned( int nseq, char **seq ) +{ + int i; + int len = strlen( seq[0] ); + for( i=1; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty - n_dis[0][24]; + while( mseq2[++k] == '-' ) + ; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore / (double)c; +#if DEBUG + printf( "tmpscore in mltaln9.c = %f\n", tmpscore ); + printf( "tmpscore / c = %f\n", tmpscore/(double)c ); +#endif + } + } + reporterr( "raw score = %f\n", score ); + score /= (double)nseq * ( nseq-1.0 ) / 2.0; + score += 400.0; +#if DEBUG + printf( "score in mltaln9.c = %f\n", score ); +#endif + return( (double)score ); +} + +void doublencpy( double *vec1, double *vec2, int len ) +{ + while( len-- ) + *vec1++ = *vec2++; +} + +double score_calc_a( char **seq, int s, double **eff ) /* algorithm A+ */ +{ + int i, j, k; + int gb1, gb2, gc1, gc2; + int cob; + int nglen; + int len = strlen( seq[0] ); + double score; + + score = 0; + nglen = 0; + for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + tmpscore += amino_dis[(unsigned char)mseq1[k]][(unsigned char)mseq2[k]]; + k--; + if( k > len-2 ) break; + continue; + } + } + score += (double)tmpscore; + } + } + + return( score ); +} + + +#define SEGMENTSIZE 150 + +int searchAnchors( int nseq, char **seq, Segment *seg ) +{ + int i, j, k, kcyc; + int status; + double score; + int value = 0; + int len; + int length; + static double *stra = NULL; + static int alloclen = 0; + double cumscore; + static double threshold; + + len = strlen( seq[0] ); + if( alloclen < len ) + { + if( alloclen ) + { + FreeDoubleVec( stra ); + } + else + { + threshold = (int)divThreshold / 100.0 * 600.0 * divWinSize; + } + stra = AllocateDoubleVec( len ); + alloclen = len; + } + + for( i=0; iskipForeward = 0; + (seg+1)->skipBackward = 0; + status = 0; + cumscore = 0.0; + score = 0.0; + length = 0; /* modified at 01/09/11 */ + for( j=0; j threshold ) reporterr( "YES\n" ); + else reporterr( "NO\n" ); +#endif + + if( score > threshold ) + { + if( !status ) + { + status = 1; + seg->start = i; + length = 0; + cumscore = 0.0; + } + length++; + cumscore += score; + } + if( score <= threshold || length > SEGMENTSIZE ) + { + if( status ) + { + seg->end = i; + seg->center = ( seg->start + seg->end + divWinSize ) / 2 ; + seg->score = cumscore; +#if DEBUG + reporterr( "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + if( length > SEGMENTSIZE ) + { + (seg+0)->skipForeward = 1; + (seg+1)->skipBackward = 1; + } + else + { + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + } + length = 0; + cumscore = 0.0; + status = 0; + value++; + seg++; + if( value > MAXSEG - 3 ) ErrorExit( "TOO MANY SEGMENTS!"); + } + } + } + if( status ) + { + seg->end = i; + seg->center = ( seg->start + seg->end + divWinSize ) / 2 ; + seg->score = cumscore; +#if DEBUG +reporterr( "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + value++; + } + return( value ); +} + +void dontcalcimportance_target( int nseq, double *eff, char **seq, LocalHom **localhom, int ntarget ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + +void dontcalcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; i= j ) continue; + for( ptr=localhom[i]+j-i; ptr; ptr=ptr->next ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + + +void dontcalcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j; + LocalHom *ptr; + int *nogaplen; + + nogaplen = AllocateIntVec( nseq ); + + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 + ptr->importance = ptr->opt / ptr->overlapaa; +// ptr->fimportance = (double)ptr->importance; +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } + free( nogaplen ); +} + +void dontcalcimportance_firstone( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j, nseq1; + LocalHom *ptr; +#if 1 +#else + int *nogaplen; + nogaplen = AllocateIntVec( nseq ); + for( i=0; inext ) + { +// reporterr( "i,j=%d,%d,ptr=%p\n", i, j, ptr ); +#if 1 +// ptr->importance = ptr->opt / ptr->overlapaa; + ptr->importance = ptr->opt * 0.5; // tekitou +// ptr->fimportance = (double)ptr->importance; +// reporterr( "i=%d, j=%d, importance = %f, opt=%f\n", i, j, ptr->fimportance, ptr->opt ); +#else + ptr->importance = ptr->opt / MIN( nogaplen[i], nogaplen[j] ); +#endif + } + } + } +#if 1 +#else + free( nogaplen ); +#endif +} + +void calcimportance_target( int nseq, int ntarget, double *eff, char **seq, LocalHom **localhom, int *targetmap, int *targetmapr, int alloclen ) +{ + int i, j, pos, len, ti, tj; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( alloclen ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + +// for( i=0; inext ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } +#else + tmpdouble = 0.0; + len = 0; + for( tmpptr = localhom[ti]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + } + + tmpdouble /= (double)len; + + for( tmpptr = localhom[ti]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->importance = tmpptr->opt / tmpptr->overlapaa; //$B$J$+$C$?$3$H$K$9$k(B + } +#endif + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( ti=0; tinext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%30.25f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); +// for( i=0; inext, tmpptr2 = tmpptr2->next) + { + if( tmpptr1->opt == -1.0 || tmpptr2->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr2->importance ); + tmpptr1->importance = tmpptr2->importance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } + + for( ti=0; tinext ) + { + if( tmpptr1->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance ); +// imp = 1.0 * ( tmpptr1->importance ); + tmpptr1->importance = imp; +// tmpptr1->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( ti=0; tinext ) + { + if( tmpptr->end1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +//exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + +void calcimportance_half( int nseq, double *eff, char **seq, LocalHom **localhom, int alloclen ) +{ + int i, j, pos, len; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( alloclen ); +// reporterr("alloclen=%d, nlenmax=%d\n", alloclen, nlenmax ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + + for( i=0; inext ) + { +// reporterr( "pos=%d, alloclen=%d\n", pos, alloclen ); + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } + else + { + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start2; pos<=tmpptr->end2; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } + } + else + { + if( localhom[j][i-j].opt == -1.0 ) continue; + + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start2; pos<=tmpptr->end2; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->rimportance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } + } + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( i=0; inext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } + else + { + printf( "%d-%d\n", i, j ); + for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start2, tmpptr->end2, tmpptr->start1, tmpptr->end1, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->rimportance, tmpptr->opt ); + } + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); + for( i=0; inext) + { + if( tmpptr1->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr1->rimportance ); + tmpptr1->importance = tmpptr1->rimportance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( i=0; inext ) + { + if( tmpptr->end1 && tmpptr->start1 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + else for( tmpptr = localhom[j]+i-j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->end2 && tmpptr->start2 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start2, tmpptr->end2, tmpptr->start1, tmpptr->end1, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + +void calcimportance( int nseq, double *eff, char **seq, LocalHom **localhom ) +{ + int i, j, pos, len; + double *importance; // static -> local, 2012/02/25 + double tmpdouble; + double *ieff, totaleff; // counteff_simple_double ni utsusu kamo + int *nogaplen; // static -> local, 2012/02/25 + LocalHom *tmpptr; + + importance = AllocateDoubleVec( nlenmax ); + nogaplen = AllocateIntVec( nseq ); + ieff = AllocateDoubleVec( nseq ); + + totaleff = 0.0; + for( i=0; istart1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt ); + } while( tmpptr=tmpptr->next ); + } +#endif + + + for( i=0; inext ) + { + if( tmpptr->opt == -1 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { +#if 1 +// if( pos == 0 ) reporterr( "hit! i=%d, j=%d, pos=%d\n", i, j, pos ); + importance[pos] += ieff[j]; +#else + importance[pos] += ieff[j] * tmpptr->opt / MIN( nogaplen[i], nogaplen[j] ); + importance[pos] += ieff[j] * tmpptr->opt / tmpptr->overlapaa; +#endif + } + } + } +#if 0 + reporterr( "position specific importance of seq %d:\n", i ); + for( pos=0; posnext ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpdouble = 0.0; + len = 0; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + + tmpdouble /= (double)len; + + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->fimportance = (double)tmpptr->importance; + } +#else + tmpdouble = 0.0; + len = 0; + for( tmpptr = localhom[i]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + for( pos=tmpptr->start1; pos<=tmpptr->end1; pos++ ) + { + tmpdouble += importance[pos]; + len++; + } + } + + tmpdouble /= (double)len; + + for( tmpptr = localhom[i]+j; tmpptr; tmpptr=tmpptr->next ) + { + if( tmpptr->opt == -1.0 ) continue; + tmpptr->importance = tmpdouble * tmpptr->opt; +// tmpptr->importance = tmpptr->opt / tmpptr->overlapaa; //$B$J$+$C$?$3$H$K$9$k(B + } +#endif + +// reporterr( "importance of match between %d - %d = %f\n", i, j, tmpdouble ); + } + } + +#if 0 + printf( "before averaging:\n" ); + + for( i=0; inext ) + { + printf( "reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, eff[i] * tmpptr->importance, tmpptr->opt ); + } + } +#endif + +#if 1 +// reporterr( "average?\n" ); + for( i=0; inext, tmpptr2 = tmpptr2->next) + { + if( tmpptr1->opt == -1.0 || tmpptr2->opt == -1.0 ) + { +// reporterr( "WARNING: i=%d, j=%d, tmpptr1->opt=%f, tmpptr2->opt=%f\n", i, j, tmpptr1->opt, tmpptr2->opt ); + continue; + } +// reporterr( "## importances = %f, %f\n", tmpptr1->importance, tmpptr2->importance ); + imp = 0.5 * ( tmpptr1->importance + tmpptr2->importance ); + tmpptr1->importance = tmpptr2->importance = imp; +// tmpptr1->fimportance = tmpptr2->fimportance = (double)imp; + +// reporterr( "## importance = %f\n", tmpptr1->importance ); + + } + +#if 0 // commented out, 2012/02/10 + if( ( tmpptr1 && !tmpptr2 ) || ( !tmpptr1 && tmpptr2 ) ) + { + reporterr( "ERROR: i=%d, j=%d\n", i, j ); + exit( 1 ); + } +#endif + } +#endif +#if 0 + printf( "after averaging:\n" ); + + for( i=0; inext ) + { + if( tmpptr->end1 && tmpptr->start1 != -1 ) + printf( "%d-%d, reg1=%d-%d, reg2=%d-%d, imp=%f -> %f opt=%f\n", i, j, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->opt / tmpptr->overlapaa, tmpptr->importance, tmpptr->opt ); + } + } +exit( 1 ); +#endif + free( importance ); + free( nogaplen ); + free( ieff ); +} + + + + +static void addlocalhom2_e( LocalHom *pt, LocalHom *lh, int sti, int stj, int eni, int enj, double opt, int overlp, int interm ) +{ +// dokka machigatteru + if( pt != lh ) // susumeru + { + pt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + pt = pt->next; + pt->next = NULL; + lh->last = pt; + } + else // sonomamatsukau + { + lh->last = pt; + } + lh->nokori++; +// reporterr( "in addlocalhom2_e, pt = %p, pt->next = %p, interm=%d, sti-eni-stj-enj=%d %d %d %d\n", pt, pt->next, interm, sti, eni, stj, enj ); + + pt->start1 = sti; + pt->start2 = stj; + pt->end1 = eni; + pt->end2 = enj; + pt->opt = opt; + pt->extended = interm; + pt->overlapaa = overlp; +#if 0 + reporterr( "i: %d-%d\n", sti, eni ); + reporterr( "j: %d-%d\n", stj, enj ); + reporterr( "opt=%f\n", opt ); + reporterr( "overlp=%d\n", overlp ); +#endif +} + +void extendlocalhom2( int nseq, LocalHom **localhom, double **dist ) +{ + int overlp, plim; + int i, j, k; + int pi, pj, pk, len; + int status, sti, stj; + int *ipt; + int co; + static int *ini = NULL; + static int *inj = NULL; + LocalHom *pt; + + sti = 0; // by D.Mathog, a guess + stj = 0; // by D.Mathog, a guess + + if( ini == NULL ) + { + ini = AllocateIntVec( nlenmax+1 ); + inj = AllocateIntVec( nlenmax+1 ); + } + + + for( i=0; i dist[i][j] * thrinter || dist[MIN(j,k)][MAX(j,k)] > dist[i][j] * thrinter ) continue; + ipt = ini; co = nlenmax+1; + while( co-- ) *ipt++ = -1; + ipt = inj; co = nlenmax+1; + while( co-- ) *ipt++ = -1; + overlp = 0; + + { + for( pt=localhom[i]+k; pt; pt=pt->next ) + { +// reporterr( "i=%d,k=%d,st1:st2=%d:%d,pt=%p,extended=%p\n", i, k, pt->start1, pt->start2, pt, pt->extended ); + if( pt->opt == -1 ) + { + reporterr( "opt kainaide tbfast.c = %f\n", pt->opt ); + } + if( pt->extended > -1 ) break; + pi = pt->start1; + pk = pt->start2; + len = pt->end1 - pt->start1 + 1; + ipt = ini + pk; + while( len-- ) *ipt++ = pi++; + } + } + + { + for( pt=localhom[j]+k; pt; pt=pt->next ) + { + if( pt->opt == -1 ) + { + reporterr( "opt kainaide tbfast.c = %f\n", pt->opt ); + } + if( pt->extended > -1 ) break; + pj = pt->start1; + pk = pt->start2; + len = pt->end1 - pt->start1 + 1; + ipt = inj + pk; + while( len-- ) *ipt++ = pj++; + } + } +#if 0 + reporterr( "i=%d,j=%d,k=%d\n", i, j, k ); + overlp = 0; + for( pk = 0; pk < nlenmax; pk++ ) + { + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + reporterr( " %d", inj[pk] ); + } + reporterr( "\n" ); + + reporterr( "i=%d,j=%d,k=%d\n", i, j, k ); + overlp = 0; + for( pk = 0; pk < nlenmax; pk++ ) + { + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + reporterr( " %d", ini[pk] ); + } + reporterr( "\n" ); +#endif + overlp = 0; + plim = nlenmax+1; + for( pk = 0; pk < plim; pk++ ) + if( ini[pk] != -1 && inj[pk] != -1 ) overlp++; + + + status = 0; + plim = nlenmax+1; + for( pk=0; pknext = %p, pt->next->next = %p\n", pt, pt->next, pt->next->next ); + + pt = localhom[j][i].last; +// reporterr( "in ex (ba), pt = %p, pt->next = %p\n", pt, pt->next ); +// reporterr( "in ex (ba), pt = %p, pt->next = %p, k=%d\n", pt, pt->next, k ); + addlocalhom2_e( pt, localhom[j]+i, stj, sti, inj[pk-1], ini[pk-1], MIN( localhom[i][k].opt, localhom[j][k].opt ) * 1.0, overlp, k ); +// reporterr( "in ex, pt = %p, pt->next = %p, pt->next->next = %p\n", pt, pt->next, pt->next->next ); + } + } + if( !status ) // else deha arimasenn. + { + if( ini[pk] == -1 || inj[pk] == -1 ) continue; + sti = ini[pk]; + stj = inj[pk]; +// reporterr( "start here!\n" ); + status = 1; + } + } +// if( status ) reporterr( "end here\n" ); + +// exit( 1 ); +// fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->next ); + } +#if 0 + for( pt=localhomtable[i]+j; pt; pt=pt->next ) + { + if( tmpptr->opt == -1.0 ) continue; + fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->next ); + } +#endif + } + } +} + +int makelocal( char *s1, char *s2, int thr ) +{ + int start, maxstart, maxend; + char *pt1, *pt2; + double score; + double maxscore; + + pt1 = s1; + pt2 = s2; + + maxend = 0; // by D.Mathog, a guess + +// reporterr( "thr = %d, \ns1 = %s\ns2 = %s\n", thr, s1, s2 ); + maxscore = 0.0; + score = 0.0; + start = 0; + maxstart = 0; + while( *pt1 ) + { +// reporterr( "*pt1 = %c*pt2 = %c\n", *pt1, *pt2 ); + if( *pt1 == '-' || *pt2 == '-' ) + { +// reporterr( "penalty = %d\n", penalty ); + score += penalty; + while( *pt1 == '-' || *pt2 == '-' ) + { + pt1++; pt2++; + } + continue; + } + + score += ( amino_dis[(unsigned char)*pt1++][(unsigned char)*pt2++] - thr ); +// score += ( amino_dis[(int)*pt1++][(int)*pt2++] ); + if( score > maxscore ) + { +// reporterr( "score = %f\n", score ); + maxscore = score; + maxstart = start; +// reporterr( "## max! maxstart = %d, start = %d\n", maxstart, start ); + } + if( score < 0.0 ) + { +// reporterr( "## resetting, start = %d, maxstart = %d\n", start, maxstart ); + if( start == maxstart ) + { + maxend = pt1 - s1; +// reporterr( "maxend = %d\n", maxend ); + } + score = 0.0; + start = pt1 - s1; + } + } + if( start == maxstart ) + maxend = pt1 - s1 - 1; + +// reporterr( "maxstart = %d, maxend = %d, maxscore = %f\n", maxstart, maxend, maxscore ); + s1[maxend+1] = 0; + s2[maxend+1] = 0; + return( maxstart ); +} + +void resetlocalhom( int nseq, LocalHom **lh ) +{ + int i, j; + LocalHom *pt; + + for( i=0; inext ) + pt->opt = 1.0; + } + +} +#if 0 +void gapmatometeireru( int n, char **res, char **ori, char *gt ) // i loop no tame osoi +{ + char g; + int pr=0, po=0, i; + while( (g = *gt++) ) + { + if( g == '-' ) + { + for( i=0; i-1&&st[j]==1; j-- ) + st[j] = i-j; + } + } + st[i] = -1; + stbk = st; + + for( i=0; i 0 ) + { +// reporterr( "s=%d\n", s ); + st += s-1; + rp += s; +// while( s-- ) +// *rp++ = *newgapstr; + } + else + *rp++ = *op++; + } + *rp = 0; + } + + free( stbk ); +} +static void gapirerustatic( char *res, char *ori, char *gt, char gapchar ) +{ + char g; + while( (g = *gt++) ) + { + if( g == '-' ) + { + *res++ = gapchar; + } + else + { + *res++ = *ori++; + } + } + *res = 0; +} +void gapmatometeireru( int n, char **res, char **ori, char *gt ) +{ + int i; + char gapchar = *newgapstr; + for( i=0; i", i, gaplen, k, (*fpt)[k].freq ); + (*fpt)[k].freq += feff; +// reporterr( "%f\n", (*fpt)[k].freq ); + gaplen = 0; + } + } + fpt++; + } + } +#if 1 + for( j=0; jnext = ac; + acori->pos = -1; + ac[0].prev = acori; + + +// for( i=0; i tmpmin ) + { + minscore = tmpmin; + nearest = i; + } + } + nearesto = nearest; + minscoreo = minscore; + + + +// for( i=0; i-1; j++ ) + { + reporterr( "%d ", topol[i][0][j]+1 ); + } + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][0] ); + reporterr( "group1 = \n" ); + for( j=0; topol[i][1][j]>-1; j++ ) + { + reporterr( "%d ", topol[i][1][j]+1 ); + } + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][1] ); + + reporterr( "\n\n\nminscore = %f ? %f\n", minscore, dep[i].distfromtip*2 ); + reporterr( "i = %d\n", i ); + if( leaf2node[nearest] == -1 ) + { + reporterr( "nogaplen[nearest] = %d\n", nogaplen[nearest] ); + } + else + { + reporterr( "alnleninnode[leaf2node[nearest]] = %d\n", alnleninnode[leaf2node[nearest]] ); + reporterr( "leaf2node[nearest] = %d\n", leaf2node[nearest] ); + } +#endif + nearestnode = leaf2node[nearest]; + if( nearestnode == -1 ) + reflen = nogaplen[nearest]; + else + reflen = alnleninnode[nearestnode]; +// reflen = alnleninnode[i]; // BUG!! + + if( noalign ) seqlengthcondition = 1; + else seqlengthcondition = ( nogaplentoadd <= reflen ); + +//seqlengthcondition = 1; // CHUUI +//seqlengthcondition = ( nogaplentoadd <= reflen ); // CHUUI + + if( repnorg == -1 && dep[i].distfromtip * 2 > minscore && seqlengthcondition ) // Keitouteki ichi ha fuseikaku. +// if( repnorg == -1 && dep[i].distfromtip * 2 > minscore ) // Keitouteki ichi dake ga hitsuyouna baaiha kore wo tsukau. + { +// reporterr( "INSERT HERE, %d-%d\n", nearest, norg ); +// reporterr( "nearest = %d\n", nearest ); +// reporterr( "\n\n\nminscore = %f\n", minscore ); +// reporterr( "distfromtip *2 = %f\n", dep[i].distfromtip * 2 ); +// reporterr( "nearest=%d, leaf2node[]=%d\n", nearest, leaf2node[nearest] ); + + if( nearestnode == -1 ) + { +// reporterr( "INSERTING to 0!!!\n" ); +// reporterr( "lastlength = %d\n", nogaplen[norg] ); +// reporterr( "reflength = %d\n", nogaplen[nearest] ); + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( 1 + 1 ) * sizeof( int ) ); + topolc[posinnew][0][0] = nearest; + topolc[posinnew][0][1] = -1; + + addedlen = lenc[posinnew][0] = minscore / 2; + + } + else + { +// reporterr( "INSERTING to g, leaf2node = %d, cm=%d!!!\n", leaf2node[nearest], countmem(topol[leaf2node[nearest]][0] ) ); +// reporterr( "alnleninnode[i] = %d\n", alnleninnode[i] ); +// reporterr( "alnleninnode[leaf2node[nearest]] = %d\n", alnleninnode[leaf2node[nearest]] ); + + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( ( countmem( topol[nearestnode][0] ) + countmem( topol[nearestnode][1] ) + 1 ) * sizeof( int ) ) ); +// reporterr( "leaf2node[%d] = %d\n", nearest, leaf2node[nearest] ); + intcpy( topolc[posinnew][0], topol[nearestnode][0] ); + intcat( topolc[posinnew][0], topol[nearestnode][1] ); +// addedlen = lenc[posinnew][0] = minscore / 2 - len[nearestnode][0]; // bug!! + addedlen = lenc[posinnew][0] = dep[i].distfromtip - minscore / 2; // 2014/06/10 +// fprintf( stderr, "addedlen = %f, dep[i].distfromtip = %f, len[nearestnode][0] = %f, minscore/2 = %f, lenc[posinnew][0] = %f\n", addedlen, dep[i].distfromtip, len[nearestnode][0], minscore/2, lenc[posinnew][0] ); + + } + neighbor = lastmem( topolc[posinnew][0] ); + + if( treeout ) + { +#if 0 + fp = fopen( "infile.tree", "a" ); // kyougou!! + if( fp == 0 ) + { + reporterr( "File error!\n" ); + exit( 1 ); + } + fprintf( fp, "\n" ); + fprintf( fp, "%8d: %s\n", norg+iadd+1, name[norg+iadd] ); + fprintf( fp, " nearest sequence: %d\n", nearest + 1 ); + fprintf( fp, " distance: %f\n", minscore ); + fprintf( fp, " cousin: " ); + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + fprintf( fp, "%d ", topolc[posinnew][0][j]+1 ); + fprintf( fp, "\n" ); + fclose( fp ); +#else + addtree[iadd].nearest = nearesto; + addtree[iadd].dist1 = minscoreo; + addtree[iadd].dist2 = minscore; + neighborlist[0] = 0; + npt = neighborlist; + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + { + sprintf( npt, "%d ", topolc[posinnew][0][j]+1 ); + npt += strlen( npt ); + } + addtree[iadd].neighbors = calloc( npt-neighborlist+1, sizeof( char ) ); + strcpy( addtree[iadd].neighbors, neighborlist ); +#endif + } + +// reporterr( "INSERTING to 1!!!\n" ); + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( 1 + 1 ) * sizeof( int ) ); + topolc[posinnew][1][0] = norg; + topolc[posinnew][1][1] = -1; + lenc[posinnew][1] = minscore / 2; + +// reporterr( "STEP %d (newnew)\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + + repnorg = nearest; + +// reporterr( "STEP %d\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j] ); +// reporterr( "\n len=%f\n", lenc[i][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j] ); +// reporterr( "\n len=%f\n", lenc[i][1] ); + +// im = topolc[posinnew][0][0]; +// jm = topolc[posinnew][1][0]; +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], lenc[posinnew][0], tree[jm], lenc[posinnew][1] ); +// strcpy( tree[im], treetmp ); + + posinnew++; + } + +// reporterr( "minscore = %f\n", minscore ); +// reporterr( "distfromtip = %f\n", dep[i].distfromtip ); +// reporterr( "Modify matrix, %d-%d\n", nearest, norg ); + eff0 = iscorec[mem0][norg-mem0]; + eff1 = iscorec[mem1][norg-mem1]; + +// iscorec[mem0][norg-mem0] = (clusterfuncpt[0])( eff0, eff1 ); + iscorec[mem0][norg-mem0] = MIN( eff0, eff1 ) * sueff1_double_local + ( eff0 + eff1 ) * sueff05_double_local; + iscorec[mem1][norg-mem1] = 9999.9; // sukoshi muda + + acprev = ac[mem1].prev; + acnext = ac[mem1].next; + acprev->next = acnext; + if( acnext != NULL ) acnext->prev = acprev; + + if( ( nearest == mem1 || nearest == mem0 ) ) + { + minscore = 9999.9; +// for( j=0; j iscorec[j][norg-j] ) +// { +// minscore = iscorec[j][norg-j]; +// nearest = j; +// } +// } +// reporterr( "searching on modified ac " ); + for( acpt=acori->next; acpt!=NULL; acpt=acpt->next ) // sukoshi muda + { +// reporterr( "." ); + j = acpt->pos; + tmpmin = iscorec[j][norg-j]; + if( minscore > tmpmin ) + { + minscore = tmpmin; + nearest = j; + } + } +// reporterr( "done\n" ); + } + +// reporterr( "posinnew = %d\n", posinnew ); + + + if( topol[i][0][0] == repnorg ) + { + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + 2 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topol[i][0] ); + intcat( topolc[posinnew][0], additionaltopol ); + lenc[posinnew][0] = len[i][0] - addedlen; // 2014/6/10 +// fprintf( stderr, "i=%d, dep[i].distfromtip=%f\n", i, dep[i].distfromtip ); +// fprintf( stderr, "addedlen=%f, len[i][0]=%f, lenc[][0]=%f\n", addedlen, len[i][0], lenc[posinnew][0] ); +// fprintf( stderr, "lenc[][1] = %f\n", lenc[posinnew][0] ); + addedlen = 0.0; + } + else + { + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topol[i][0] ); + lenc[posinnew][0] = len[i][0]; + } + + if( topol[i][1][0] == repnorg ) + { + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( countmem( topol[i][1] ) + 2 ) * sizeof( int ) ); + intcpy( topolc[posinnew][1], topol[i][1] ); + intcat( topolc[posinnew][1], additionaltopol ); + lenc[posinnew][1] = len[i][1] - addedlen; // 2014/6/10 +// fprintf( stderr, "i=%d, dep[i].distfromtip=%f\n", i, dep[i].distfromtip ); +// fprintf( stderr, "addedlen=%f, len[i][1]=%f, lenc[][1]=%f\n", addedlen, len[i][1], lenc[posinnew][1] ); +// fprintf( stderr, "lenc[][1] = %f\n", lenc[posinnew][1] ); + addedlen = 0.0; + + repnorg = topolc[posinnew][0][0]; // juuyou + } + else + { + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], ( countmem( topol[i][1] ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][1], topol[i][1] ); + lenc[posinnew][1] = len[i][1]; + } + +// reporterr( "\nSTEP %d (new)\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j]+1 ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + +// reporterr("\ni=%d\n####### leaf2node[nearest]= %d\n", i, leaf2node[nearest] ); + + for( j=0; (m=topol[i][0][j])!=-1; j++ ) leaf2node[m] = i; + for( j=0; (m=topol[i][1][j])!=-1; j++ ) leaf2node[m] = i; + +// reporterr("####### leaf2node[nearest]= %d\n", leaf2node[nearest] ); + +// im = topolc[posinnew][0][0]; +// jm = topolc[posinnew][1][0]; +// sprintf( treetmp, "(%s:%7.5f,%s:%7.5f)", tree[im], lenc[posinnew][0], tree[jm], lenc[posinnew][1] ); +// strcpy( tree[im], treetmp ); +// +// reporterr( "%s\n", treetmp ); + + posinnew++; + } + + if( nstep ) + { + i--; + topolo0 = topol[i][0]; + topolo1 = topol[i][1]; + } + else + { +// i = 0; +// free( topol[i][0] );//? +// free( topol[i][1] );//? +// topol[i][0] = calloc( 2, sizeof( int ) ); +// topol[i][1] = calloc( 1, sizeof( int ) ); +// topol[i][0][0] = 0; +// topol[i][0][1] = -1; +// topol[i][1][0] = -1; + + topoldum0 = calloc( 2, sizeof( int ) ); + topoldum1 = calloc( 1, sizeof( int ) ); + topoldum0[0] = 0; + topoldum0[1] = -1; + topoldum1[0] = -1; + + topolo0 = topoldum0; + topolo1 = topoldum1; + } + if( repnorg == -1 ) + { +// topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topol[i][0] ) + countmem( topol[i][1] ) + 1 ) * sizeof( int ) ); +// intcpy( topolc[posinnew][0], topol[i][0] ); +// intcat( topolc[posinnew][0], topol[i][1] ); + topolc[posinnew][0] = (int *)realloc( topolc[posinnew][0], ( countmem( topolo0 ) + countmem( topolo1 ) + 1 ) * sizeof( int ) ); + intcpy( topolc[posinnew][0], topolo0 ); + intcat( topolc[posinnew][0], topolo1 ); +// lenc[posinnew][0] = len[i][0] + len[i][1] - minscore / 2; // BUG!! 2014/06/07 ni hakken + if( nstep ) + lenc[posinnew][0] = minscore / 2 - dep[nstep-1].distfromtip; // only when nstep>0, 2014/11/21 + else + lenc[posinnew][0] = minscore / 2; + +// reporterr( "\ndep[nstep-1].distfromtip = %f\n", dep[nstep-1].distfromtip ); +// reporterr( "lenc[][0] = %f\n", lenc[posinnew][0] ); + + topolc[posinnew][1] = (int *)realloc( topolc[posinnew][1], 2 * sizeof( int ) ); + intcpy( topolc[posinnew][1], additionaltopol ); + lenc[posinnew][1] = minscore / 2; + +// neighbor = lastmem( topolc[posinnew][0] ); + neighbor = norg-1; // hakkirishita neighbor ga inai baai saigo ni hyouji + + if( treeout ) + { +#if 0 + fp = fopen( "infile.tree", "a" ); // kyougou!! + if( fp == 0 ) + { + reporterr( "File error!\n" ); + exit( 1 ); + } + fprintf( fp, "\n" ); + fprintf( fp, "%8d: %s\n", norg+iadd+1, name[norg+iadd] ); + fprintf( fp, " nearest sequence: %d\n", nearest + 1 ); + fprintf( fp, " cousin: " ); + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + fprintf( fp, "%d ", topolc[posinnew][0][j]+1 ); + fprintf( fp, "\n" ); + fclose( fp ); +#else + addtree[iadd].nearest = nearesto; + addtree[iadd].dist1 = minscoreo; + addtree[iadd].dist2 = minscore; + neighborlist[0] = 0; + npt = neighborlist; + for( j=0; topolc[posinnew][0][j]!=-1; j++ ) + { + sprintf( npt, "%d ", topolc[posinnew][0][j]+1 ); + npt += strlen( npt ); + } + addtree[iadd].neighbors = calloc( npt-neighborlist+1, sizeof( char ) ); + strcpy( addtree[iadd].neighbors, neighborlist ); +#endif + } + +// reporterr( "STEP %d\n", posinnew ); +// for( j=0; topolc[posinnew][0][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][0][j] ); +// reporterr( "\n len=%f", lenc[posinnew][0] ); +// for( j=0; topolc[posinnew][1][j]!=-1; j++ ) reporterr( " %d", topolc[posinnew][1][j] ); +// reporterr( "\n len=%f\n", lenc[posinnew][1] ); + } + + if( topoldum0 ) free( topoldum0 ); + if( topoldum1 ) free( topoldum1 ); + free( leaf2node ); + free( additionaltopol ); + free( ac ); + free( acori ); + if( treeout ) free( neighborlist ); + +#if 0 // create a newick tree for CHECK + char **tree; + char *treetmp; + int im, jm; + + treetmp = AllocateCharVec( njob*150 ); + tree = AllocateCharMtx( njob, njob*150 ); + for( i=0; i-1; ) + { + if( mem[i++] != cand[j++] ) return( 0 ); + } + + if( cand[j] == -1 ) + { + return( 1 ); + } + else + { + return( 0 ); + } +} +#else +int samemember( int *mem, int *cand ) +{ + int i, j; + int nm, nc; + + nm = 0; for( i=0; mem[i]>-1; i++ ) nm++; + nc = 0; for( i=0; cand[i]>-1; i++ ) nc++; + + if( nm != nc ) return( 0 ); + + for( i=0; mem[i]>-1; i++ ) + { + for( j=0; cand[j]>-1; j++ ) + if( mem[i] == cand[j] ) break; + if( cand[j] == -1 ) return( 0 ); + } + + if( mem[i] == -1 ) + { +#if 0 + reporterr( "mem = " ); + for( i=0; mem[i]>-1; i++ ) reporterr( "%d ", mem[i] ); + reporterr( "\n" ); + + reporterr( "cand = " ); + for( i=0; cand[i]>-1; i++ ) reporterr( "%d ", cand[i] ); + reporterr( "\n" ); +#endif + return( 1 ); + } + else + { + return( 0 ); + } +} +#endif + +int samemembern( int *mem, int *cand, int nc ) +{ + int i, j; + int nm; + + nm = 0; + for( i=0; mem[i]>-1; i++ ) + { + nm++; + if( nm > nc ) return( 0 ); + } + + if( nm != nc ) return( 0 ); + + for( i=0; mem[i]>-1; i++ ) + { + for( j=0; j-1; i++ ) + { + for( j=0; cand[j]>-1; j++ ) + if( mem[i] == cand[j] ) break; + if( cand[j] == -1 ) return( 0 ); + } +// reporterr( "INCLUDED! mem[0]=%d\n", mem[0] ); + return( 1 ); +} + +int overlapmember( int *mem1, int *mem2 ) +{ + int i, j; + + for( i=0; mem1[i]>-1; i++ ) + for( j=0; mem2[j]>-1; j++ ) + if( mem1[i] == mem2[j] ) return( 1 ); + return( 0 ); +} + +void gapcount( double *freq, char **seq, int nseq, double *eff, int lgth ) +{ + int i, j; + double fr; + +// for( i=0; i %f\n", i, freq[i] ); + } +// reporterr( "\n" ); + return; +} +void gapcountf( double *freq, char **seq, int nseq, double *eff, int lgth ) +{ + int i, j; + double fr; + +// for( i=0; i 0.0 ) val = 0.0; + return val; +} + +void makedynamicmtx( double **out, double **in, double offset ) +{ + int i, j, ii, jj; + double av; + + offset = dist2offset( offset * 2.0 ); // offset 0..1 -> 0..2 + +// if( offset > 0.0 ) offset = 0.0; +// reporterr( "dynamic offset = %f\n", offset ); + + for( i=0; i%f\n", rep0, distfromtip0, distfromtip[rep0] ); + + +#if 0 + for( j=0; topol[i][1][j]!=-1; j++ ) + reporterr( "%3d ", topol[i][1][j] ); + reporterr( "\n" ); + reporterr( "len=%f\n", len[i][1] ); +#endif + + rep1 = topol[i][1][0]; + distfromtip1 = distfromtip[rep1]; + distfromtip[rep1] += len[i][1]; +// reporterr( "distfromtip[%d] = %f->%f\n", rep1, distfromtip1, distfromtip[rep1] ); + + if( topol[i][0][1] != -1 && distfromtip0 <= threshold && threshold < distfromtip[rep0] ) + { +// reporterr( "HIT 0!\n" ); + *tablept = realloc( *tablept, sizeof( char * ) * (*nsubpt+2) ); + for( j=0, nmem=0; (mem=topol[i][0][j])!=-1; j++ ) + nmem++; +// reporterr( "allocating %d\n", nmem+1 ); + (*tablept)[*nsubpt] = calloc( nmem+1, sizeof( int ) ); + (*tablept)[*nsubpt+1] = NULL; + intcpy( (*tablept)[*nsubpt], topol[i][0] ); + if( *maxmempt < nmem ) *maxmempt = nmem; + *nsubpt += 1; + } + + if( topol[i][1][1] != -1 && distfromtip1 <= threshold && threshold < distfromtip[rep1] ) + { +// reporterr( "HIT 1!\n" ); + *tablept = realloc( *tablept, sizeof( char * ) * (*nsubpt+2) ); + for( j=0, nmem=0; (mem=topol[i][1][j])!=-1; j++ ) + nmem++; +// reporterr( "allocating %d\n", nmem+1 ); + (*tablept)[*nsubpt] = calloc( nmem+1, sizeof( int ) ); + (*tablept)[*nsubpt+1] = NULL; + intcpy( (*tablept)[*nsubpt], topol[i][1] ); + if( *maxmempt < nmem ) *maxmempt = nmem; + *nsubpt += 1; + } + + } + + if( distfromtip[0] <= threshold ) + { + free( distfromtip ); + return( 1 ); + } + + free( distfromtip ); + return( 0 ); +} + + + +double sumofpairsscore( int nseq, char **seq ) +{ + double v = 0; + int i, j; + for( i=1; i 10 ) value = 10.0; // 2015/Mar/17 + return( value ); + } +} + +double distcompact( int len1, int len2, int *table1, int *point2, int ss1, int ss2 ) +{ + double longer, shorter, lenfac, value; + + if( len1 > len2 ) + { + longer=(double)len1; + shorter=(double)len2; + } + else + { + longer=(double)len2; + shorter=(double)len1; + } + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// reporterr( "lenfac=%f\n", lenfac ); +// reporterr( "commonsextet_p()=%d\n", commonsextet_p( table1, point2 ) ); +// reporterr( "ss1=%d, ss2=%d\n", ss1, ss2 ); +// reporterr( "val=%f\n", (1.0-(double)commonsextet_p( table1, point2 )/ss1) ); + + if( ss1 == 0 || ss2 == 0 ) + return( 2.0 ); + + value = ( 1.0 - (double)commonsextet_p( table1, point2 ) / MIN(ss1,ss2) ) * lenfac * 2.0; + + return( value ); // 2013/Oct/17 -> 2bai +} + +static void movereg( char *seq1, char *seq2, LocalHom *tmpptr, int *start1pt, int *start2pt, int *end1pt, int *end2pt ) +{ + char *pt; + int tmpint; + + pt = seq1; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start1 ) break; + } + *start1pt = (int)( pt - seq1 ) - 1; + + if( tmpptr->start1 == tmpptr->end1 ) *end1pt = *start1pt; + else + { + while( *pt != 0 ) + { +// fprintf( stderr, "tmpint = %d, end1 = %d pos = %d\n", tmpint, tmpptr->end1, pt-seq1[i] ); + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end1 ) break; + } + *end1pt = (int)( pt - seq1 ) - 1; + } + + pt = seq2; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start2 ) break; + } + *start2pt = (int)( pt - seq2 ) - 1; + if( tmpptr->start2 == tmpptr->end2 ) *end2pt = *start2pt; + else + { + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end2 ) break; + } + *end2pt = (int)( pt - seq2 ) - 1; + } +} + +static void movereg_swap( char *seq1, char *seq2, LocalHom *tmpptr, int *start1pt, int *start2pt, int *end1pt, int *end2pt ) +{ + char *pt; + int tmpint; + + + pt = seq1; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start2 ) break; + } + *start1pt = (int)( pt - seq1 ) - 1; + + if( tmpptr->start2 == tmpptr->end2 ) *end1pt = *start1pt; + else + { + while( *pt != 0 ) + { +// fprintf( stderr, "tmpint = %d, end1 = %d pos = %d\n", tmpint, tmpptr->end1, pt-seq1[i] ); + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end2 ) break; + } + *end1pt = (int)( pt - seq1 ) - 1; + } + + pt = seq2; + tmpint = -1; + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->start1 ) break; + } + *start2pt = (int)( pt - seq2 ) - 1; + if( tmpptr->start1 == tmpptr->end1 ) *end2pt = *start2pt; + else + { + while( *pt != 0 ) + { + if( *pt++ != '-' ) tmpint++; + if( tmpint == tmpptr->end1 ) break; + } + *end2pt = (int)( pt - seq2 ) - 1; + } +} + +void fillimp( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2 ) +{ + int i, j, k1, k2, start1, start2, end1, end2; + double effij, effijx, effij_kozo; + char *pt1, *pt2; + LocalHom *tmpptr; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + +#if 0 + fprintf( stderr, "eff1 in _init_strict = \n" ); + for( i=0; iorinum2[j] ) + movefunc = movereg_swap; + else + movefunc = movereg; + } + +// effij = eff1[i] * eff2[j] * effijx; + effij = eff1[i] * eff2[j] * effijx; + effij_kozo = eff1_kozo[i] * eff2_kozo[j] * effijx; + tmpptr = localhom[i][j]; + while( tmpptr ) + { +// fprintf( stderr, "start1 = %d\n", tmpptr->start1 ); +// fprintf( stderr, "end1 = %d\n", tmpptr->end1 ); +// fprintf( stderr, "i = %d, seq1 = \n%s\n", i, seq1[i] ); +// fprintf( stderr, "j = %d, seq2 = \n%s\n", j, seq2[j] ); + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + +// fprintf( stderr, "start1 = %d (%c), end1 = %d (%c), start2 = %d (%c), end2 = %d (%c)\n", start1, seq1[i][start1], end1, seq1[i][end1], start2, seq2[j][start2], end2, seq2[j][end2] ); +// fprintf( stderr, "step 0\n" ); + if( end1 - start1 != end2 - start2 ) + { +// fprintf( stderr, "CHUUI!!, start1 = %d, end1 = %d, start2 = %d, end2 = %d\n", start1, end1, start2, end2 ); + } + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { +// ½Å¤ß¤òÆó½Å¤Ë¤«¤±¤Ê¤¤¤è¤¦¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ +// impmtx[k1][k2] += tmpptr->wimportance * fastathreshold; +// impmtx[k1][k2] += tmpptr->importance * effij; +// impmtx[k1][k2] += tmpptr->fimportance * effij; + if( tmpptr->korh == 'k' ) + impmtx[k1][k2] += tmpptr->importance * effij_kozo; + else + impmtx[k1][k2] += tmpptr->importance * effij; +// fprintf( stderr, "k1=%d, k2=%d, impalloclen=%d\n", k1, k2, impalloclen ); +// fprintf( stderr, "mark, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + } + } +#if 0 + printf( "orinum1=%d, orinum2=%d\n", *orinum1, *orinum2 ); + if( *orinum1 == 0 ) + { + fprintf( stdout, "impmtx = \n" ); + for( k2=0; k2nokori++ > 0 ) + { + tmpptr1 = localhomtable->last; + tmpptr1->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); + tmpptr1 = tmpptr1->next; + tmpptr1->extended = -1; + tmpptr1->next = NULL; + localhomtable->last = tmpptr1; + } + else + { + tmpptr1 = localhomtable; + } + + tmpptr1->start1 = st1; + tmpptr1->start2 = st2; + tmpptr1->end1 = st1 + len; + tmpptr1->end2 = st2 + len; +// tmpptr1->opt = ( opt / overlapaa + 0.00 ) / 5.8 * 600; +// tmpptr1->opt = opt; + tmpptr1->opt = ( (double)opt + 0.00 ) / 5.8 * 600; + tmpptr1->importance = ( (double)opt + 0.00 ) / 5.8 * 600; // C0 to itchi shinai + tmpptr1->overlapaa = len; // tsukau toki ha chuui + tmpptr1->korh = 'h'; + +// fprintf( stderr, " %f %d-%d %d-%d \n", tmpptr1->opt, tmpptr1->start1, tmpptr1->end1, tmpptr1->start2, tmpptr1->end2 ); + } + free( m ); + fread( &c, sizeof( char ), 1, fp ); + if( c != '\n' ) + { + reporterr( "\n\nError in binary hat3 \n" ); + exit( 1 ); + } +} + +static int readlocalhomfromfile_autofid( LocalHom *lhpt, int nodeid, FILE *fp, int o1, int o2 ) // for hat3node +{ +// pthread_mutex_t *filemutex = h3i->filemutex; +// int fidcheck; + int k1, k2; +// int *fds = h3i->fds; + int swap; +// unsigned long long k1tri; + + lhpt->start1 = -1; + lhpt->end1 = -1; + lhpt->start2 = -1; + lhpt->end2 = -1; + lhpt->overlapaa = -1.0; + lhpt->opt = -1.0; + lhpt->importance = -1.0; + lhpt->next = NULL; + lhpt->nokori = 0; + lhpt->extended = -1; + lhpt->last = lhpt; + lhpt->korh = 'h'; + + +#if 0 // specific target ni taiousuru! + if( h3i->specifictarget ) + { + int *targetmap = h3i->targetmap; + if( targetmap[o1] == -1 && targetmap[o2] == -1 ) return( -1 ); + if( targetmap[o1] == -1 ) + { + k1 = targetmap[o2]; + k2 = o1; + swap = 1; + } + else + { + k1 = targetmap[o1]; + k2 = o2; + swap = 0; + } + k1tri = 0; + } + else +#endif + { + if( o2 > o1 ) + { + k1 = o1; + k2 = o2-o1; + swap = 0; + } + else + { + k1 = o2; + k2 = o1-o2; + swap = 1; + } +// k1tri = (unsigned long long)k1*(k1-1)/2; + } + + + if( fp ) + { + readlocalhomtable2_single_bin_noseek( fp, lhpt ); + } + return( swap ); +} + +static int whichpair( int *ipt, int *jpt, FILE *fp ) +{ + if( fread( ipt, sizeof( int ), 1, fp ) < 1 ) return( 1 ); + if( fread( jpt, sizeof( int ), 1, fp ) < 1 ) return( 1 ); // <1 ha nai + return( 0 ); +} + +typedef struct _readloopthread_arg +{ +// int thread_no; + int nodeid; + int nfiles; + double **impmtx; + char **seq1; + char **seq2; + int *orinum1; + int *orinum2; + double *eff1; + double *eff2; + unsigned long long *ndone; + int *subidpt; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} readloopthread_arg_t; + +static void *readloopthread( void *arg ) +{ + readloopthread_arg_t *targ = (readloopthread_arg_t *)arg; + int nodeid = targ->nodeid; +// int thread_no = targ->thread_no; + double **impmtx = targ->impmtx; + char **seq1 = targ->seq1; + char **seq2 = targ->seq2; + int *orinum1 = targ->orinum1; + int *orinum2 = targ->orinum2; + double *eff1 = targ->eff1; + double *eff2 = targ->eff2; + unsigned long long *ndone = targ->ndone; + int *subidpt = targ->subidpt; + int nfiles = targ->nfiles; + int subid = -1; +#ifdef enablemultithread + pthread_mutex_t *mutex = targ->mutex; +#endif + int i, j, k1, k2, start1, start2, end1, end2; + double effij, effijx; + char *pt1, *pt2; + LocalHom *tmpptr; + FILE *fp = NULL; + char *fn; + LocalHom lhsingle; + int res; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + initlocalhom1( &lhsingle ); + effijx = 1.0 * fastathreshold; +// void *stbuf = NULL; + +#if 0 + int block; + if( nfiles > 10*nthreadreadlh ) block=10; else block=1; +#endif + + while( 1 ) + { + if( subid == -1 || whichpair( &i, &j, fp ) ) + { + while( 1 ) + { + if( fp ) fclose( fp ); +#if 0 + if( (subid+1)%block==0 ) + { + if( mutex ) pthread_mutex_lock( mutex ); + subid = (*subidpt); + (*subidpt) += block; + if( mutex ) pthread_mutex_unlock( mutex ); + } + else + subid++; +#else +#ifdef enablemultithread + if( mutex ) pthread_mutex_lock( mutex ); +#endif + subid = (*subidpt)++; +#ifdef enablemultithread + if( mutex ) pthread_mutex_unlock( mutex ); +#endif +#endif + + if( subid >= nfiles ) + { +// if( stbuf ) free( stbuf ); +// stbuf = NULL; + return( NULL ); + } + +// if( !stbuf ) +// stbuf = malloc( MYBUFSIZE ); +// if( !stbuf ) +// { +// reporterr( "Cannot allocate stbuf, size=d\n", MYBUFSIZE ); +// exit( 1 ); +// } + + fn = calloc( 100, sizeof( char ) ); + sprintf( fn, "hat3dir/%d-/hat3node-%d-%d", (int)(nodeid/HAT3NODEBLOCK)*HAT3NODEBLOCK, nodeid, subid ); +// sprintf( fn, "hat3dir/%d/%d/hat3node-%d-%d", (int)(nodeid/h2)*h2, (int)(nodeid/HAT3NODEBLOCK)*HAT3NODEBLOCK, nodeid, subid ); +// reporterr( "fopen %s by thread %d\n", fn, thread_no ); + fp = fopen( fn, "rb" ); + if( fp == NULL ) + { + reporterr( "Cannot open %s\n", fn ); + exit( 1 ); + } + free( fn ); +// if( setvbuf( fp, stbuf, _IOFBF, MYBUFSIZE ) ) +// { +// reporterr( "Error in setting buffer, size=%d\n", MYBUFSIZE ); +// exit( 1 ); +// } + setvbuf( fp, NULL, _IOFBF, MYBUFSIZE ); + if( !whichpair( &i, &j, fp ) ) break; + } + } + (*ndone)++; + + + { + +// effij = eff1[i] * eff2[j] * effijx; + effij = eff1[i] * eff2[j] * effijx; +// effij_kozo = eff1_kozo[i] * eff2_kozo[j] * effijx; + + res = readlocalhomfromfile_autofid( &lhsingle, nodeid, fp, orinum1[i], orinum2[j] ); + if( res == -1 ) tmpptr = NULL; + + else if( res == 1 ) + { + movefunc = movereg_swap; // h3i ga arutoki swaplist ha mushi + tmpptr = &lhsingle; + } + else + { + movefunc = movereg; // h3i ga arutoki swaplist ha mushi + tmpptr = &lhsingle; + } + + + while( tmpptr ) + { +// fprintf( stderr, "start1 = %d\n", tmpptr->start1 ); +// fprintf( stderr, "end1 = %d\n", tmpptr->end1 ); +// fprintf( stderr, "i = %d, seq1 = \n%s\n", i, seq1[i] ); +// fprintf( stderr, "j = %d, seq2 = \n%s\n", j, seq2[j] ); + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + +// fprintf( stderr, "start1 = %d (%c), end1 = %d (%c), start2 = %d (%c), end2 = %d (%c)\n", start1, seq1[i][start1], end1, seq1[i][end1], start2, seq2[j][start2], end2, seq2[j][end2] ); +// fprintf( stderr, "step 0\n" ); +// if( end1 - start1 != end2 - start2 ) +// fprintf( stderr, "CHUUI!!, start1 = %d, end1 = %d, start2 = %d, end2 = %d\n", start1, end1, start2, end2 ); + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { + impmtx[k1][k2] += tmpptr->importance * effij; + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + freelocalhom1( &lhsingle ); + } + } +} + +void fillimp_file( double **impmtx, double *imp, int clus1, int clus2, int lgth1, int lgth2, char **seq1, char **seq2, double *eff1, double *eff2, double *eff1_kozo, double *eff2_kozo, LocalHom ***localhom, char *swaplist, int forscore, int *orinum1, int *orinum2, int *uselh, int *seedinlh1, int *seedinlh2, int nodeid, int nfiles ) +{ + int i, j, k1, k2, start1, start2, end1, end2, m0, m1, m2; + double effijx, effij_kozo; + char *pt1, *pt2; + LocalHom *tmpptr; + unsigned long long npairs; +// LocalHom lhsingle; +// FILE *fp = NULL; +// char *fn; +// int subid, res; + void (*movefunc)(char *, char *, LocalHom *, int *, int *, int *, int * ); + readloopthread_arg_t *targ; +#ifdef enablemultithread + pthread_mutex_t mutex; + pthread_t *handle; +#endif + double ***localimpmtx; + int nth; + unsigned long long *localndone; + unsigned long long ndone; + int subid; + + +#if 0 + fprintf( stderr, "eff1 in _init_strict = \n" ); + for( i=0; i m2 ) { m0=m1; m1=m2; m2=m0; } + if( m2 >= njob-nadd && ( uselh==NULL || uselh[m1] || uselh[m2] ) ) // saikentou + { +// reporterr( "%d x %d\n", m1, m2 ); + npairs++; + } + } +#if REPORTCOSTS +// reporterr( "node %d, npairs = %d, nfiles = %d\n", nodeid, npairs, nfiles ); +#endif + } + else if( uselh ) + { +// npairs = (unsigned long long)clus1 * clus2; + npairs = 0; + for( i=0; iorinum2[j] ) + movefunc = movereg_swap; + else + movefunc = movereg; + + while( tmpptr ) + { + + movefunc( seq1[i], seq2[j], tmpptr, &start1, &start2, &end1, &end2 ); + + k1 = start1; k2 = start2; + pt1 = seq1[i] + k1; + pt2 = seq2[j] + k2; + while( *pt1 && *pt2 ) + { + if( *pt1 != '-' && *pt2 != '-' ) + { + if( tmpptr->korh == 'k' ) + impmtx[k1][k2] += tmpptr->importance * effij_kozo; + else // naihazu + { + reporterr( "okashii\n" ); + exit( 1 ); + } +// fprintf( stderr, "k1=%d, k2=%d, impalloclen=%d\n", k1, k2, impalloclen ); +// fprintf( stderr, "mark, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; k2++; + pt1++; pt2++; + } + else if( *pt1 != '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k2++; pt2++; + } + else if( *pt1 == '-' && *pt2 != '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + } + else if( *pt1 == '-' && *pt2 == '-' ) + { +// fprintf( stderr, "skip, %d (%c) - %d (%c) \n", k1, *pt1, k2, *pt2 ); + k1++; pt1++; + k2++; pt2++; + } + if( k1 > end1 || k2 > end2 ) break; + } + tmpptr = tmpptr->next; + } + } + } + } + +#if 0 + if( 0 || nfiles < 2 ) + { + unsigned long long nread; + readloop_serial( nodeid, impmtx, seq1, seq2, orinum1, orinum2, eff1, eff2, &nread ); + npairs -= nread; + } + else +#endif + { + + nth = MIN(nthreadreadlh,nfiles); + subid = 0; + +// reporterr( "nthreadlh=%d, nth=%d\n", nthreadreadlh, nth ); + if( nth > 1 ) + { + localndone = calloc( sizeof(unsigned long long), nth ); + localimpmtx = calloc( sizeof(double **), nth ); + for( i=0; i 1 ) + { + targ[i].ndone = localndone+i; + targ[i].impmtx = localimpmtx[i]; +#ifdef enablemultithread + targ[i].mutex = &mutex; + pthread_create( handle+i, NULL, readloopthread, (void *)(targ+i) ); +#else + readloopthread( (void *)(targ+i) ); +#endif + } + else + { + targ[i].ndone = &ndone; + targ[i].impmtx = impmtx; +#ifdef enablemultithread + targ[i].mutex = NULL; +#endif + readloopthread( targ+i ); + } + } + +#ifdef enablemultithread + if( nth > 1 ) + { + for( j=0; j 1 ) + { + for( i=0; i +#include +#include +#include +#include "mtxutl.h" + +void MtxuntDouble( double **mtx, int n ) +{ + int i, j; + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "seed = %s\n", inputfile ); + --argc; + goto nextoption; + case 't': + nhomologs = myatoi( *++argv ); + fprintf( stderr, "nhomologs = %d\n", nhomologs ); + --argc; + goto nextoption; + case 'o': + seedoffset = myatoi( *++argv ); + fprintf( stderr, "seedoffset = %d\n", seedoffset ); + --argc; + goto nextoption; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + +int countamino( char *s, int end ) +{ + int val = 0; + while( end-- ) + if( *s++ != '-' ) val++; + return( val ); +} + +static void pairalign( char **name, int nlen[M], char **seq, double *effarr, int alloclen ) +{ + int i, j; + FILE *hat3p; + double pscore = 0.0; // by D.Mathog + static double *effarr1 = NULL; + static double *effarr2 = NULL; + char *aseq; + static char **pseq; + LocalHom **localhomtable, *tmpptr; + double tsuyosa; + + if( nhomologs < 1 ) nhomologs = 1; // tsuyosa=0.0 wo sakeru + tsuyosa = (double)nhomologs * nhomologs * TSUYOSAFACTOR; + fprintf( stderr, "tsuyosa = %f\n", tsuyosa ); + localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); + for( i=0; inext ) + { + if( tmpptr->opt == -1.0 ) continue; + if( tmpptr->start1 == -1 ) continue; + fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d k\n", i+seedoffset, j+seedoffset, tmpptr->overlapaa, tmpptr->opt * tsuyosa, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2 ); + } + } + } + fprintf( stderr, "\n" ); + fclose( hat3p ); + +#if DEBUG + fprintf( stderr, "calling FreeLocalHomTable\n" ); +#endif + FreeLocalHomTable( localhomtable, njob ); +#if DEBUG + fprintf( stderr, "done. FreeLocalHomTable\n" ); +#endif +} + +static void WriteOptions( FILE *fp ) +{ + + if( dorp == 'd' ) fprintf( fp, "DNA\n" ); + else + { + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "BLOSUM %d\n", nblosum ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + } + fprintf( stderr, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + if( use_fft ) fprintf( fp, "FFT on\n" ); + + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Algorithm A+\n" ); + else if( alg == 'S' ) + fprintf( fp, "Apgorithm S\n" ); + else if( alg == 'C' ) + fprintf( fp, "Apgorithm A+/C\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( treemethod == 'x' ) + fprintf( fp, "Tree = UPGMA (3).\n" ); + else if( treemethod == 's' ) + fprintf( fp, "Tree = UPGMA (2).\n" ); + else if( treemethod == 'p' ) + fprintf( fp, "Tree = UPGMA (1).\n" ); + else + fprintf( fp, "Unknown tree.\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( dorp == 'd' ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + + +int main( int argc, char *argv[] ) +{ + static int nlen[M]; + static char **name, **seq; + static char **bseq; + static double *eff; + int i; + char c; + int alloclen; + FILE *infp; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen( infp ); + rewind( infp ); + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + name = AllocateCharMtx( njob, B+1 ); + seq = AllocateCharMtx( njob, nlenmax*9+1 ); + bseq = AllocateCharMtx( njob, nlenmax*9+1 ); + alloclen = nlenmax*9; + + eff = AllocateDoubleVec( njob ); + +#if 0 + Read( name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); +#endif + fclose( infp ); + + constants( njob, seq ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illeagal character %c\n", c ); + exit( 1 ); + } + +// writePre( njob, name, nlen, seq, 0 ); + + for( i=0; i_seed_%s\n%s\n", name[i]+1, bseq[i] ); // CHUUI!! + for( i=0; i_seed_%s\n%s\n", name[i]+1, seq[i] ); + + pairalign( name, nlen, seq, eff, alloclen ); + + fprintf( trap_g, "done.\n" ); +#if DEBUG + fprintf( stderr, "closing trap_g\n" ); +#endif + fclose( trap_g ); + +#if IODEBUG + fprintf( stderr, "OSHIMAI\n" ); +#endif + SHOWVERSION; + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/newick2mafft.rb b/mafft/src/mafft-7.487-with-extensions/core/newick2mafft.rb new file mode 100644 index 0000000000..c16fb84b4f --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/newick2mafft.rb @@ -0,0 +1,134 @@ +#! /usr/bin/env ruby + +#version 2, 2009/Jan/24 +#version 3, 2015/Dec/8 + + +if ARGV.length == 1 + scale = 1.0 +elsif ARGV.length == 2 + scale = ARGV.shift.to_f +else + STDERR.puts "USAGE: newick2mafft.rb scale input_tree > output" + exit +end + +if scale <= 0.0 then + STDERR.puts "Inappropriate scale, #{scale.to_s}" + exit +end + +STDERR.puts "scale = " + scale.to_s + +infp = File.open( ARGV.shift, "r" ) + +tree = "" +while line = infp.gets + tree += line.strip + break if tree =~ /;$/ +end +infp.close + + +#tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9]\.[0-9]*e-[0-9][0-9]/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "").gsub(/:\-[0-9\.]+/, ":0.0" ) +#tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9]\.[0-9]*e-[0-9][0-9]/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "") +tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9\.]*[eE]-[0-9]*/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "") + + +STDERR.puts "Initial tree = " + tree + +def resolve( tree ) + + +while 1 +# p tree + tree.sub!( /\,([0-9]+):(\-?[0-9\.]+)\,([0-9]+):(\-?[0-9\.]+)/, ",XXX" ) + hit1 = $1 + hit2 = $2 + hit3 = $3 + hit4 = $4 + +# p hit1 +# p hit2 +# p hit3 +# p hit4 + +# puts "introduce XXX" +# p tree + + break unless tree.index(/XXX/) + + poshit = tree.index(/XXX/) +# puts "poshit=" + poshit.to_s + + i = poshit + height = 0 + while i >= 0 + break if height == 0 && tree[i..i] == '(' + if tree[i..i] == ')' then + height += 1 + elsif tree[i..i] == '(' then + height -= 1 + end + i -= 1 + end + + poskakko = i +# puts "poskakko = " + poskakko.to_s + zenhan = tree[0..poskakko] + zenhan = "" if poskakko == -1 +# puts "zenhan = " + zenhan + + treelen = tree.length + tree = zenhan + "(" + tree[poskakko+1..treelen] +# puts "add (" +# p tree + tree.sub!( /XXX/, "#{hit1}:#{hit2}):0,#{hit3}:#{hit4}" ) + +# p tree +end + + +return tree + +end + +memi = [-1,-1] +leni = [-1,-1] + +while tree.index( /\(/ ) + + tree = resolve( tree ) + + tree.sub!( /\(([0-9]+):(\-?[0-9\.]+),([0-9]+):(\-?[0-9\.]+)\)/, "XXX" ) + memi[0] = $1.to_i + leni[0] = $2.to_f * scale + memi[1] = $3.to_i + leni[1] = $4.to_f * scale + + if leni[0] > 10 || leni[1] > 10 then + STDERR.puts "" + STDERR.puts "Please check the scale of branch length!" + STDERR.puts "The unit of branch lengths must be 'substitution/site'" + STDERR.puts "If the unit is 'substition' in your tree, please" + STDERR.puts "use the scale argument," + STDERR.puts "% newick2mafft scale in > out" + STDERR.puts "where scale = 1/(alignment length)" + STDERR.puts "" + exit 1 + end + +# STDERR.puts "subtree = " + $& + + if memi[1] < memi[0] then + memi.reverse! + leni.reverse! + end + + tree.sub!( /XXX/, memi[0].to_s ) + +# STDERR.puts "Tree = " + tree + + printf( "%5d %5d %10.5f %10.5f\n", memi[0], memi[1], leni[0], leni[1] ) + +end diff --git a/mafft/src/mafft-7.487-with-extensions/core/nj.c b/mafft/src/mafft-7.487-with-extensions/core/nj.c new file mode 100644 index 0000000000..0adf4e5138 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/nj.c @@ -0,0 +1,195 @@ +#include "mltaln.h" +#define DEBUG 0 + + +void topolcpy( int s1[], int s2[], int *mpt1, int *mpt2 ) +{ + int i; + + *mpt1 = *mpt2; + for( i=0; i<*mpt2; i++ ) + { + s1[i] = s2[i]; + } +} + +void topolcat( int s1[], int s2[], int *mpt1, int *mpt2 ) +{ + int i; + + for( i=*mpt1; i<*mpt1+*mpt2; i++ ) + { + s1[i] = s2[i-*mpt1]; + } + *mpt1 += *mpt2; +} + +void topolsort( int m, int s[] ) +{ + int i, j, im; + int sm; + + for( j=0; j2; n--, m=nseq-n ) + { + t = 0.0; + for( i=0; i 0 ) + { + topol[m][0][count] = l; + count++; + } + mem[m][0] = count; + for( l=0, count=0; l 0 ) + { + topol[m][1][count] = l; + count++; + } + mem[m][1] = count; + for( l=0; l 0 ); + if( n > 3 ) reduc( mtx, nseq, im, jm ); + } + for( i=0; i 0 ) + { + topol[m][0][count] = l; + count++; + } + mem[m][0] = count; + /* + printf( " total length == %f\n", totallen ); + */ + + topolcpy( topol[nseq-2][1], topol[nseq-3][0], mem[nseq-2]+1, mem[nseq-3] ); + topolcat( topol[nseq-2][1], topol[nseq-3][1], mem[nseq-2]+1, mem[nseq-3]+1 ); + topolsort( mem[nseq-2][1], topol[nseq-2][1] ); + + if( topol[nseq-2][0][0] > topol[nseq-2][1][0] ) + topolswap( topol[nseq-2][0], topol[nseq-2][1], mem[nseq-2], mem[nseq-2]+1 ); + +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/nodepair.c b/mafft/src/mafft-7.487-with-extensions/core/nodepair.c new file mode 100644 index 0000000000..939053ec78 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/nodepair.c @@ -0,0 +1,504 @@ +#include "mltaln.h" +#include + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 +#define SHISHAGONYU 0 // for debug + + +// from tbfast +static int treein; +static int treeout; + + +// from pairlocalalign +static int stdout_dist; + + +static void arguments( int argc, char *argv[] ) +{ + int c; + + nthread = 1; + nadd = 0; + inputfile = NULL; + fftkeika = 0; + pslocal = -1000.0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'x'; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; + divpairscore = 0; + stdout_dist = 0; +// dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + ppenalty_OP = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + ppenalty_EX = NOTSPECIFIED; + penalty_shift_factor = 1000.0; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + RNAppenalty = NOTSPECIFIED; + RNApthr = NOTSPECIFIED; + specificityconsideration = 0.0; + usenaivescoreinsteadofalignmentscore = 0; + specifictarget = 0; + nwildcard = 0; + compacttree = 2; // tsuneni! + treein = 0; + treeout = 0; + fastathreshold = 2.7; + constraint = 2; + +// localhomfile = 0; // tbfast.c no wo tsukaunode comment out + +// reporterr( "argc=%d\n", argc ); +// reporterr( "*argv=%s\n", *argv ); +// reporterr( "(*argv)[0]=%c\n", (*argv)[0] ); + while( --argc > 0 && (*++argv)[0] == '-' ) + { +// reporterr( "(*argv)[0] in while loop = %s\n", (*argv) ); + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + fastathreshold = atof( *++argv ); + constraint = 2; + --argc; + goto nextoption; +#if 0 + case 'l': + ppslocal = (int)( atof( *++argv ) * 1000 + 0.5 ); + pslocal = (int)( 600.0 / 1000.0 * ppslocal + 0.5); +// fprintf( stderr, "ppslocal = %d\n", ppslocal ); +// fprintf( stderr, "pslocal = %d\n", pslocal ); + --argc; + goto nextoption; +#else +#endif + case 'C': + nthread = myatoi( *++argv ); + if( nthread == 0 ) nthread = 1; +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; +#ifndef enablemultithread + nthread = 1; +#endif + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); +// fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'u': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; + case 'c': + stdout_dist = 1; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'K': + addprofile = 0; + break; +#if 0 + case 'r': + fmodel = -1; + break; +#endif + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; +#endif +#if 0 + case 'Q': + calledByXced = 1; + break; + case 'x': + disp = 1; + break; + case 'a': + alg = 'a'; + break; + case 'S': + alg = 'S'; + break; +#endif + case 'N': + alg = 'N'; + break; + case 'A': + alg = 'A'; + break; + case 'L': + alg = 'L'; + break; + case 'Z': + usenaivescoreinsteadofalignmentscore = 1; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; +#if 0 + case 'Y': + alg = 'Y'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> L; + break; + case 's': + alg = 's'; + break; + case 'G': + alg = 'G'; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; + case 'T': + alg = 'T'; + break; + case 'H': + alg = 'H'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'r': + alg = 'r'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> R, last + break; + case 'V': + alg = 'V'; + break; +#endif + case 'T': // tbfast.c no noalign ni taiou + break; + + case 'F': + use_fft = 1; + break; + case 'U': + treein = 1; + break; + case 't': + treeout = 1; + break; + case 'y': + divpairscore = 1; + break; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; + case 'q': + lhlimit = myatoi( *++argv ); + --argc; + goto nextoption; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "pairlocalalign options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + +int main( int argc, char *argv[] ) +{ + static int *nlen = NULL; + static int *selfscore = NULL; + static char **name = NULL, **seq = NULL; + static double *eff = NULL; + int i; + static int ***topol = NULL; + static Treedep *dep = NULL; + static double **len = NULL; + FILE *infp = NULL; + + char c; + + arguments( argc, argv ); + + if( alg != 'A' && alg != 'L' && alg != 'N' ) + { + reporterr( "alg %c is not yet supported\n", alg ); + exit( 1 ); + } + if( alg != 'N' && usenaivescoreinsteadofalignmentscore == 1 ) + { + reporterr( "The combination of usenaivescoreinsteadofalignmentscore and alg %c is not yet supported\n", alg ); + exit( 1 ); + } + + if( fastathreshold < 0.0001 ) + { + constraint = 0; + lhlimit = 0; + } + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen( infp ); + rewind( infp ); + + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + +#if !defined(mingw) && !defined(_MSC_VER) + setstacksize( 200 * njob ); // topolorder() de ookime no stack wo shiyou. +#endif + + + seq = AllocateCharMtx( njob, nlenmax+1 ); + + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + selfscore = AllocateIntVec( njob ); + + topol = AllocateIntCub( njob, 2, 0 ); + len = AllocateFloatMtx( njob, 2 ); + eff = AllocateDoubleVec( njob ); + + + dep = (Treedep *)calloc( njob, sizeof( Treedep ) ); + + +#if 0 + readData( infp, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); +#endif + + constants( njob, seq ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + initFiles(); + +// WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illegal character %c\n", c ); + exit( 1 ); + } + +// writePre( njob, name, nlen, seq, 0 ); + + if( treein ) loadtree( njob, topol, len, name, nlen, dep, treeout ); + pairalign_node( njob, nlenmax, name, seq, topol, len, dep, treein, treeout ); + + + FreeCharMtx( seq ); seq = NULL; + + FreeCharMtx( name ); name = NULL; + free( nlen ); nlen = NULL; + free( selfscore ); selfscore = NULL; + + for( i=0; i= s ) + { + if( *pos == '/' ) break; + } + + strcpy( s, pos+1 ); +} + +static char getchainid( char *s ) +{ + s += strlen( s ) - 2; + if( isspace( s[0] ) && isalnum( s[1] ) ) + return( s[1] ); + else + return( 'A' ); +} + +static void extractfirstword( char *s ) +{ + while( *s ) + { + if( isspace( *s ) ) break; + s++; + } + *s = 0; +} + +static char *strip( char *s ) +{ + char *v; + + while( *s ) + { + if( !isspace( *s ) ) break; + s++; + } + v = s; + + s += strlen( v ) - 1; + while( s>=v ) + { + if( !isspace( *s ) ) + { + *(s+1) = 0; + break; + } + s--; + } + + return( v ); +} + +#if 0 +static void makeequivdouble( double *d, char *c ) +{ + while( *c ) + { + *d++ = (double)( *c++ - '0' ); + } +} + +static void maskequiv( double *d, int n ) +{ + int halfwin; + int ok; + int i, j; + + halfwin = (int)( equivwinsize / 2 ); + + for( i=0; i 0.0 ) + { + len += 1; + d[i] = 0.0; + } + else + { + d[i] = 0.0; + if( len >= equivshortestlen ) + { + len++; + while( len-- ) d[i-len] = dbk[i-len]; + } + len = 0; + } + } + + if( len >= equivshortestlen ) + { + len++; + while( len-- ) d[n-len] = dbk[n-len]; + } + + free( dbk ); +} +#endif + +static void makeequivdouble_tmalign( double *d, char *c, int n ) +{ + double tmpd; + double *dbk; + int tmpi; + char s; + dbk = d; + while( *c ) + { + if( ( s=*c++ ) == ':' ) + tmpi = 9; + else if( s == '.' ) + tmpi = 4; + else + tmpi = 0; +// tmpd = (double)( tmpi + 1 - equivthreshold ) / ( 10 - equivthreshold ) * 9.0; +// if( tmpd < 0.0 ) tmpd = 0.0; + tmpd = (double)( tmpi ); +// *d++ = (int)tmpd; + *d++ = tmpd; + } + + d = dbk; +// maskequiv( d, n ); +} + +static void makeequivdouble_threshold( double *d, char *c, int n ) +{ + double tmpd; + double *dbk; + int tmpi; + dbk = d; + while( *c ) + { + tmpi = (int)( *c++ - '0' ); + tmpd = (double)( tmpi + 1 - equivthreshold ) / ( 10 - equivthreshold ) * 9.0; + if( tmpd < 0.0 ) tmpd = 0.0; +// *d++ = (int)tmpd; + *d++ = tmpd; + } + + d = dbk; + maskequiv( d, n ); +} + +static void readtmalign( FILE *fp, char *seq1, char *seq2, double *equiv ) +{ + static char *line = NULL; + static char *equivchar = NULL; + int n; + + + if( equivchar == NULL ) + { + equivchar = calloc( nlenmax * 2 + 1, sizeof( char ) ); + line = calloc( nlenmax * 2 + 1, sizeof( char ) ); + } + seq1[0] = 0; + seq2[0] = 0; + equivchar[0] = 0; + + +// system( "vi _tmalignout" ); + while( 1 ) + { + if( feof( fp ) ) + { + fprintf( stderr, "Error in TMalign\n" ); + exit( 1 ); + } + fgets( line, 999, fp ); +// fprintf( stdout, "line = :%s:\n", line ); + if( !strncmp( line+5, "denotes the residue pairs", 20 ) ) break; + } + fgets( line, nlenmax*2, fp ); + strcat( seq1, strip( line ) ); + + fgets( line, nlenmax*2, fp ); + strcat( equivchar, strip( line ) ); + + fgets( line, nlenmax*2, fp ); + strcat( seq2, strip( line ) ); + +#if 0 + printf( "seq1=%s\n", seq1 ); + printf( "seq2=%s\n", seq2 ); + printf( "equi=%s\n", equivchar ); +exit( 1 ); +#endif + n = strlen( seq1 ); + makeequivdouble_tmalign( equiv, equivchar, n ); + +#if 0 + fprintf( stdout, "\n" ); + for( i=0; i_dum", fname1, fname1 ); + res = system( com ); + sprintf( com, "ln -s %s %s.pdb 2>_dum", fname2, fname2 ); + res = system( com ); +#endif + sprintf( com, "\"%s/TMalign\" %s.pdb %s.pdb > _tmalignout 2>_dum", whereispairalign, fname1, fname2 ); + fprintf( stderr, "command = %s\n", com ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in TMalign\n" ); + exit( 1 ); + } + + } + else + { + fprintf( stderr, "Cache is not supported!\n" ); + exit( 1 ); + } + + fp = fopen( "_tmalignout", "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open _tmalignout\n" ); + exit( 1 ); + } + + readtmalign( fp, *mseq1, *mseq2, equiv ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + + return( value ); +} + +static double callrash( int mem1, int mem2, char **mseq1, char **mseq2, double *equiv, char *fname1, char *fname2, int alloclen ) +{ + FILE *fp; +// int res; + static char com[10000]; + double value; + char cachedir[10000]; + char cachefile[10000]; + int runnow; + char pairid[1000]; + + sprintf( pairid, "%d-%d", mem1, mem2 ); +// fprintf( stderr, "pairid = %s\n", pairid ); + + if( usecache ) + { +// sprintf( cachedir, "tmp" ); + sprintf( cachedir, "%s", pdir ); + + sprintf( cachefile, "%s/%s.%s.rash", cachedir, fname1, fname2 ); + + runnow = 0; + fp = fopen( cachefile, "r" ); + if( fp == NULL ) + { + fprintf( stderr, "Cannot open %s\n", cachefile ); + exit( 1 ); + } + else + { + fclose( fp ); + } + } + else + { + fprintf( stderr, "Not supported!\n" ); + exit( 1 ); + } + +#if 0 + if( 0 ) + { +#if 0 + sprintf( com, "ln -s %s %s.pdb 2>_dum", fname1, fname1 ); + res = system( com ); + sprintf( com, "ln -s %s %s.pdb 2>_dum", fname2, fname2 ); + res = system( com ); +#endif +#if 0 // 091127, pdp nai! + sprintf( com, "env PATH=%s PDP_ASH.pl --qf %s.pdb --qc %s --tf %s.pdb --tc %s > _rashout 2>_dum", whereispairalign, fname1, chain1, fname2, chain2 ); +#else + sprintf( com, "\"%s/rash\" --qf %s.pdb --qc %s --tf %s.pdb --tc %s --of %s.pdbpair > %s.rashout 2>%s.dum", whereispairalign, fname1, chain1, fname2, chain2, pairid, pairid, pairid ); +#endif + fprintf( stderr, "command = %s\n", com ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in structural alignment\n" ); + exit( 1 ); + } + sprintf( com, "awk '/^REMARK/,/^TER/' %s.pdbpair > %s.%s-x-%s.%s.pdbpair", pairid, fname1, chain1, fname2, chain2 ); + res = system( com ); + + sprintf( com, "awk '/^REMARK/,/^TER/{next} 1' %s.pdbpair > %s.%s-x-%s.%s.pdbpair", pairid, fname2, chain2, fname1, chain1 ); + res = system( com ); + + sprintf( com, "rm %s.pdbpair", pairid ); + res = system( com ); + + + } + else +#endif + { + fprintf( stderr, "Use cache! cachefile = %s\n", cachefile ); + sprintf( com, "cat %s > %s.rashout", cachefile, pairid ); + system( com ); + } + + if( usecache && runnow ) + { + fprintf( stderr, "Okashii! usechache=%d, runnow=%d\n", usecache, runnow ); + exit( 1 ); + } + + sprintf( com, "%s.rashout", pairid ); + fp = fopen( com, "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s\n", com ); + exit( 1 ); + } + + readrash( fp, *mseq1, *mseq2, equiv ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + + return( value ); +} + +static void preparetmalign( FILE *fp, char ***strfiles, char ***chainids, char ***seqpt, char ***mseq1pt, char ***mseq2pt, double **equivpt, int *alloclenpt ) +{ + int i, res; + char *dumseq; + char line[1000]; + char fname[1000]; + char command[1000]; + int linenum, istr, nstr; + FILE *checkfp; + char *sline; + int use[10000]; + linenum = 0; + nstr = 0; + while( 1 ) + { + fgets( line, 999, fp ); + if( feof( fp ) ) break; + sline = strip( line ); + use[linenum] = 1; + if( sline[0] == '#' || strlen( sline ) < 2 ) + { + use[linenum] = 0; + linenum++; + continue; + } + extractfirstword( sline ); + checkfp = fopen( sline, "r" ); + if( checkfp == NULL ) + { + fprintf( stderr, "Cannot open %s.\n", sline ); + exit( 1 ); + } +#if 0 + fgets( linec, 999, checkfp ); + if( strncmp( "HEADER ", linec, 7 ) ) + { + fprintf( stderr, "Check the format of %s.\n", sline ); + exit( 1 ); + } +#endif + if( checkcbeta( checkfp ) ) + { + fprintf( stderr, "%s has no C-beta atoms.\n", sline ); + exit( 1 ); + } + else + nstr++; + fclose( checkfp ); + linenum++; + } + njob = nstr; + fprintf( stderr, "nstr = %d\n", nstr ); + + *strfiles = AllocateCharMtx( nstr, 1000 ); + *chainids = AllocateCharMtx( nstr, 2 ); + + rewind( fp ); + istr = 0; + linenum = 0; + while( 1 ) + { + fgets( line, 999, fp ); + if( feof( fp ) ) break; + sline = strip( line ); + if( use[linenum++] ) + { + (*chainids)[istr][0] = getchainid( sline ); + (*chainids)[istr][1] = 0; + extractfirstword( sline ); + sprintf( fname, "%s", sline ); + cutpath( fname ); + sprintf( command, "cp %s %s.pdb", sline, fname ); + system( command ); + sprintf( command, "perl \"%s/clean.pl\" %s.pdb", whereispairalign, fname ); + res = system( command ); + if( res ) + { + fprintf( stderr, "error: Install clean.pl\n" ); + exit( 1 ); + } + strcpy( (*strfiles)[istr++], fname ); + } + } + + *seqpt = AllocateCharMtx( njob, nlenmax*2+1 ); + *mseq1pt = AllocateCharMtx( njob, 0 ); + *mseq2pt = AllocateCharMtx( njob, 0 ); + *equivpt = AllocateDoubleVec( nlenmax*2+1 ); + *alloclenpt = nlenmax*2; + dumseq = AllocateCharVec( nlenmax*2+1 ); + alreadyoutput = AllocateIntVec( njob ); + for( i=0; i%d_%s-%s\n%s\n", i+1, (*strfiles)[i], (*chainids)[i], (*seqpt)[i] ); + alreadyoutput[i] = 1; + } +} + +static void prepareash( FILE *fp, char *inputfile, char ***strfiles, char ***chainids, char ***seqpt, char ***mseq1pt, char ***mseq2pt, double **equivpt, int *alloclenpt ) +{ + int i, res; + char *dumseq; + char line[1000]; + char fname[1000]; + char command[1000]; + int linenum, istr, nstr; +// FILE *checkfp; + char *sline; + int use[10000]; + linenum = 0; + nstr = 0; + + fprintf( stderr, "inputfile = %s\n", inputfile ); + while( 1 ) + { + fgets( line, 999, fp ); + if( feof( fp ) ) break; + sline = strip( line ); + use[linenum] = 1; + if( sline[0] == '#' || strlen( sline ) < 2 ) + { + use[linenum] = 0; + linenum++; + continue; + } + extractfirstword( sline ); +#if 0 + checkfp = fopen( sline, "r" ); + if( checkfp == NULL ) + { + fprintf( stderr, "Cannot open %s.\n", sline ); + exit( 1 ); + } + if( checkcbeta( checkfp ) ) + { + fprintf( stderr, "%s has no C-beta atoms.\n", sline ); + exit( 1 ); + } + else + nstr++; + fclose( checkfp ); +#else + nstr++; +#endif + linenum++; + } + njob = nstr; + fprintf( stderr, "nstr = %d\n", nstr ); + + *strfiles = AllocateCharMtx( nstr, 1000 ); + *chainids = AllocateCharMtx( nstr, 2 ); + + rewind( fp ); + istr = 0; + linenum = 0; + while( 1 ) + { + fgets( line, 999, fp ); + if( feof( fp ) ) break; + sline = strip( line ); + fprintf( stderr, "sline = %s\n", sline ); + if( use[linenum++] ) + { + (*chainids)[istr][0] = getchainid( sline ); + (*chainids)[istr][1] = 0; + extractfirstword( sline ); + sprintf( fname, "%s", sline ); + cutpath( fname ); +#if 0 + sprintf( command, "cp %s %s.pdb", sline, fname ); + system( command ); + sprintf( command, "perl \"%s/clean.pl\" %s.pdb", whereispairalign, fname ); + res = system( command ); + if( res ) + { + fprintf( stderr, "error: Install clean.pl\n" ); + exit( 1 ); + } +#endif + strcpy( (*strfiles)[istr++], fname ); + } + } + + *seqpt = AllocateCharMtx( njob, nlenmax*2+1 ); + *mseq1pt = AllocateCharMtx( njob, 0 ); + *mseq2pt = AllocateCharMtx( njob, 0 ); + *equivpt = AllocateDoubleVec( nlenmax*2+1 ); + *alloclenpt = nlenmax*2; + dumseq = AllocateCharVec( nlenmax*2+1 ); + alreadyoutput = AllocateIntVec( njob ); + for( i=0; i%d_%s\n%s\n", i+1, (*strfiles)[i], (*seqpt)[i] ); + alreadyoutput[i] = 1; + } +} + +void arguments( int argc, char *argv[] ) +{ + int c; + + usecache = 0; + scale = 1.0; + equivthreshold = 5; + equivwinsize = 5; + equivshortestlen = 1; + inputfile = NULL; + fftkeika = 0; + pslocal = -1000.0; + constraint = 0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'R'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'x'; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; + divpairscore = 0; + dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + ppenalty_OP = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + ppenalty_EX = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + RNAppenalty = NOTSPECIFIED; + RNApthr = NOTSPECIFIED; + odir = ""; + pdir = ""; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; + case 'd': + whereispairalign = *++argv; + fprintf( stderr, "whereispairalign = %s\n", whereispairalign ); + --argc; + goto nextoption; + case 'o': + odir = *++argv; + fprintf( stderr, "odir = %s\n", odir ); + --argc; + goto nextoption; + case 'p': + pdir = *++argv; + fprintf( stderr, "pdir = %s\n", pdir ); + --argc; + goto nextoption; + case 't': + equivthreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + equivwinsize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'l': + equivshortestlen = myatoi( *++argv ); + --argc; + goto nextoption; + case 's': + scale = atof( *++argv ); + --argc; + goto nextoption; + case 'c': + usecache = 1; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'r': + fmodel = -1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'e': + fftscore = 0; + break; +#if 0 + case 'O': + fftNoAnchStop = 1; + break; +#endif + case 'Q': + calledByXced = 1; + break; + case 'x': + disp = 1; + break; +#if 0 + case 'a': + alg = 'a'; + break; +#endif + case 'S': + alg = 'S'; + break; + case 'L': + alg = 'L'; + break; + case 'B': + alg = 'B'; + break; + case 'T': + alg = 'T'; + break; + case 'H': + alg = 'H'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'N': + alg = 'N'; + break; + case 'K': + alg = 'K'; + break; + case 'A': + alg = 'A'; + break; + case 'V': + alg = 'V'; + break; + case 'C': + alg = 'C'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'y': + divpairscore = 1; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ +#if 0 + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; +#endif + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + +int countamino( char *s, int end ) +{ + int val = 0; + while( end-- ) + if( *s++ != '-' ) val++; + return( val ); +} + +static void pairalign( char **name, int nlen[M], char **seq, char **aseq, char **mseq1, char **mseq2, double *equiv, double *effarr, char **strfiles, char **chainids, int alloclen ) +{ + int i, j, ilim; + int clus1, clus2; + int off1, off2; + double pscore = 0.0; // by D.Mathog + static char *indication1, *indication2; + FILE *hat2p, *hat3p; + static double **distancemtx; + static double *effarr1 = NULL; + static double *effarr2 = NULL; + char *pt; + char *hat2file = "hat2"; + LocalHom **localhomtable, *tmpptr; + static char **pair; +// int intdum; + double bunbo; + char **checkseq; + + + localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); + for( i=0; i%d_%s\n%s\n", i+1, strfiles[i], seq[i] ); + strcpy( checkseq[i], seq[i] ); + } + else + { + gappick0( seq[i], mseq1[0] ); + fprintf( stderr, "checking seq%d\n", i ); + +// fprintf( stderr, " seq=%s\n", seq[i] ); +// fprintf( stderr, "checkseq=%s\n", checkseq[i] ); + + if( strcmp( checkseq[i], seq[i] ) ) + { + fprintf( stderr, "\n\nWARNING: Sequence changed!!\n" ); + fprintf( stderr, "i=%d\n", i ); + fprintf( stderr, " seq=%s\n", seq[i] ); + fprintf( stderr, "checkseq=%s\n", checkseq[i] ); + exit( 1 ); + } + } + if( alreadyoutput[j] == 0 ) + { + alreadyoutput[j] = 1; + gappick0( seq[j], mseq2[0] ); + fprintf( stdout, ">%d_%s-%s\n%s\n", j+1, strfiles[j], chainids[j], seq[j] ); + strcpy( checkseq[j], seq[j] ); + } + else + { + gappick0( seq[j], mseq2[0] ); + fprintf( stderr, "checking seq%d\n", j ); + if( strcmp( checkseq[j], seq[j] ) ) + { + fprintf( stderr, "\n\nWARNING: Sequence changed!!\n" ); + fprintf( stderr, "j=%d\n", j ); + fprintf( stderr, " seq=%s\n", seq[j] ); + fprintf( stderr, "checkseq=%s\n", checkseq[j] ); + exit( 1 ); + } + } +#endif + } + } + for( i=0; inext ) + { + if( tmpptr->opt == -1.0 ) continue; + fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d k\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2 ); + } + } + } + fclose( hat3p ); +#if DEBUG + fprintf( stderr, "calling FreeLocalHomTable\n" ); +#endif + FreeLocalHomTable( localhomtable, njob ); +#if DEBUG + fprintf( stderr, "done. FreeLocalHomTable\n" ); +#endif +} + +static void WriteOptions( FILE *fp ) +{ + + if( dorp == 'd' ) fprintf( fp, "DNA\n" ); + else + { + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "BLOSUM %d\n", nblosum ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + } + fprintf( stderr, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + if( use_fft ) fprintf( fp, "FFT on\n" ); + + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Algorithm A+\n" ); + else if( alg == 'S' ) + fprintf( fp, "Apgorithm S\n" ); + else if( alg == 'C' ) + fprintf( fp, "Apgorithm A+/C\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( dorp == 'd' ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + + +int main( int argc, char *argv[] ) +{ + static int nlen[M]; + static char **name, **seq; + static char **mseq1, **mseq2; + static char **aseq; + static char **bseq; + static double *eff; + static double *equiv; + char **strfiles; + char **chainids; + int i; + FILE *infp; + char c; + int alloclen; + + arguments( argc, argv ); + + if( equivthreshold < 1 || 9 < equivthreshold ) + { + fprintf( stderr, "-t n, n must be 1..9\n" ); + exit( 1 ); + } + + if( ( equivwinsize + 1 ) % 2 != 0 ) + { + fprintf( stderr, "equivwinsize = %d\n", equivwinsize ); + fprintf( stderr, "It must be an odd number.\n" ); + exit( 1 ); + } + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + nlenmax = 10000; // tekitou + + if( alg == 'R' ) + prepareash( infp, inputfile, &strfiles, &chainids, &seq, &mseq1, &mseq2, &equiv, &alloclen ); + else if( alg == 'T' ) + preparetmalign( infp, &strfiles, &chainids, &seq, &mseq1, &mseq2, &equiv, &alloclen ); + + fclose( infp ); + + name = AllocateCharMtx( njob, B+1 ); + aseq = AllocateCharMtx( njob, nlenmax*2+1 ); + bseq = AllocateCharMtx( njob, nlenmax*2+1 ); + eff = AllocateDoubleVec( njob ); + + for( i=0; i M ) + { + fprintf( stderr, "The number of structures must be < %d\n", M ); + fprintf( stderr, "Please try sequence-based methods for such large data.\n" ); + exit( 1 ); + } + + + +#if 0 + readData( infp, name, nlen, seq ); +#endif + + constants( njob, seq ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illegal character %c\n", c ); + exit( 1 ); + } + +// writePre( njob, name, nlen, seq, 0 ); + + for( i=0; inaln; + apt = lastresx->aln; + + if( naln == 0 ) return; + while( naln-- ) + { + rpt1 = apt->reg1; + rpt2 = apt->reg2; + nreg = apt->nreg; + isumscore = 0; + sumoverlap = 0; + while( nreg-- ) + { + if( nlocalhom++ > 0 ) + { +// fprintf( stderr, "reallocating ...\n" ); + tmppt->next = (LocalHom *)calloc( 1, sizeof( LocalHom ) ); +// fprintf( stderr, "done\n" ); + tmppt = tmppt->next; + tmppt->next = NULL; + } + tmppt->start1 = rpt1->start; + tmppt->start2 = rpt2->start; + tmppt->end1 = rpt1->end; + tmppt->end2 = rpt2->end; + tmppt->korh = 'h'; + if( rpt1 == apt->reg1 ) localhompt0 = tmppt; // ? + +// fprintf( stderr, "in putlocalhom, reg1: %d-%d (nreg=%d)\n", rpt1->start, rpt1->end, lastresx->nreg ); +// fprintf( stderr, "in putlocalhom, reg2: %d-%d (nreg=%d)\n", rpt2->start, rpt2->end, lastresx->nreg ); + + len = tmppt->end1 - tmppt->start1 + 1; + +// fprintf( stderr, "tmppt->start1=%d\n", tmppt->start1 ); +// fprintf( stderr, "tmppt->start2=%d\n", tmppt->start2 ); + +// fprintf( stderr, "s1+tmppt->start1=%*.*s\n", len, len, s1+tmppt->start1 ); +// fprintf( stderr, "s2+tmppt->start2=%*.*s\n", len, len, s2+tmppt->start2 ); + + pt1 = s1 + tmppt->start1; + pt2 = s2 + tmppt->start2; + iscore = 0; + while( len-- ) + { + iscore += n_dis[(int)amino_n[(unsigned char)*pt1++]][(int)amino_n[(unsigned char)*pt2++]]; // - offset $B$O$$$i$J$$$+$b(B +// fprintf( stderr, "len=%d, %c-%c, iscore(0) = %d\n", len, *(pt1-1), *(pt2-1), iscore ); + } + + if( divpairscore ) + { + tmppt->overlapaa = tmppt->end2-tmppt->start2+1; + tmppt->opt = (double)iscore / tmppt->overlapaa * 5.8 / 600; + } + else + { + isumscore += iscore; + sumoverlap += tmppt->end2-tmppt->start2+1; + } + rpt1++; + rpt2++; + } +#if 0 + fprintf( stderr, "iscore (1)= %d\n", iscore ); + fprintf( stderr, "al1: %d - %d\n", start1, end1 ); + fprintf( stderr, "al2: %d - %d\n", start2, end2 ); +#endif + + if( !divpairscore ) + { + for( tmppt2=localhompt0; tmppt2; tmppt2=tmppt2->next ) + { + tmppt2->overlapaa = sumoverlap; + tmppt2->opt = (double)isumscore * 5.8 / ( 600 * sumoverlap ); +// fprintf( stderr, "tmpptr->opt = %f\n", tmppt->opt ); + } + } + apt++; + } +} + +static int countcomma( char *s ) +{ + int v = 0; + while( *s ) if( *s++ == ',' ) v++; + return( v ); +} + +static double recallpairfoldalign( char **mseq1, char **mseq2, int m1, int m2, int *of1pt, int *of2pt, int alloclen ) +{ + static FILE *fp = NULL; + double value; + char *aln1; + char *aln2; + int of1tmp, of2tmp; + + if( fp == NULL ) + { + fp = fopen( "_foldalignout", "r" ); + if( fp == NULL ) + { + fprintf( stderr, "Cannot open _foldalignout\n" ); + exit( 1 ); + } + } + + aln1 = calloc( alloclen, sizeof( char ) ); + aln2 = calloc( alloclen, sizeof( char ) ); + + readpairfoldalign( fp, *mseq1, *mseq2, aln1, aln2, m1, m2, &of1tmp, &of2tmp, alloclen ); + + if( strstr( foldalignopt, "-global") ) + { + fprintf( stderr, "Calling G__align11\n" ); + value = G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + *of1pt = 0; + *of2pt = 0; + } + else + { + fprintf( stderr, "Calling L__align11\n" ); + value = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, of1pt, of2pt ); + } + +// value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); // nennnotame + + if( aln1[0] == 0 ) + { + fprintf( stderr, "FOLDALIGN returned no alignment between %d and %d. Sequence alignment is used instead.\n", m1+1, m2+1 ); + } + else + { + strcpy( *mseq1, aln1 ); + strcpy( *mseq2, aln2 ); + *of1pt = of1tmp; + *of2pt = of2tmp; + } + +// value = naivepairscore11( *mseq1, *mseq2, penalty ); // v6.511 ha kore wo tsukau, global nomi dakara. + +// fclose( fp ); // saigo dake yatta houga yoi. + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + + free( aln1 ); + free( aln2 ); + + return( value ); +} + +static void block2reg( char *block, Reg *reg1, Reg *reg2, int start1, int start2 ) +{ + Reg *rpt1, *rpt2; + char *tpt, *npt; + int pos1, pos2; + int len, glen1, glen2; + pos1 = start1; + pos2 = start2; + rpt1 = reg1; + rpt2 = reg2; + while( block ) + { + block++; +// fprintf( stderr, "block = %s\n", block ); + tpt = strchr( block, ':' ); + npt = strchr( block, ',' ); + if( !tpt || tpt > npt ) + { + len = atoi( block ); + reg1->start = pos1; + reg2->start = pos2; + pos1 += len - 1; + pos2 += len - 1; + reg1->end = pos1; + reg2->end = pos2; +// fprintf( stderr, "in loop reg1: %d-%d\n", reg1->start, reg1->end ); +// fprintf( stderr, "in loop reg2: %d-%d\n", reg2->start, reg2->end ); + reg1++; + reg2++; + } + else + { + sscanf( block, "%d:%d", &glen1, &glen2 ); + pos1 += glen1 + 1; + pos2 += glen2 + 1; + } + block = npt; + + } + reg1->start = reg1->end = reg2->start = reg2->end = -1; + + while( rpt1->start != -1 ) + { +// fprintf( stderr, "reg1: %d-%d\n", rpt1->start, rpt1->end ); +// fprintf( stderr, "reg2: %d-%d\n", rpt2->start, rpt2->end ); + rpt1++; + rpt2++; + } +// *apt1 = *apt2 = 0; +// fprintf( stderr, "aln1 = %s\n", aln1 ); +// fprintf( stderr, "aln2 = %s\n", aln2 ); +} + + +static void readlastresx_singleq( FILE *fp, int n1, int nameq, Lastresx **lastresx ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + if( name2 != nameq ) + { + fprintf( stderr, "BUG!!!\n" ); + exit( 1 ); + } + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 1 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 1 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 1 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 1 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} + +#ifdef enablemultithread +#if 0 +static void readlastresx_group( FILE *fp, Lastresx **lastresx ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 3 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 3 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 3 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 3 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} +#endif +#endif + +static void readlastresx( FILE *fp, int n1, int n2, Lastresx **lastresx, char **seq1, char **seq2 ) +{ + char *gett; + Aln *tmpaln; + int prevnaln, naln, nreg; +#if 0 + int i, pstart, pend, end1, end2; +#endif + int score, name1, start1, alnSize1, seqSize1; + int name2, start2, alnSize2, seqSize2; + char strand1, strand2; + int includeintoscore; + gett = calloc( 10000, sizeof( char ) ); + +// fprintf( stderr, "seq2[0] = %s\n", seq2[0] ); +// fprintf( stderr, "seq1[0] = %s\n", seq1[0] ); + + while( 1 ) + { + fgets( gett, 9999, fp ); + if( feof( fp ) ) break; + if( gett[0] == '#' ) continue; +// fprintf( stdout, "gett = %s\n", gett ); + if( gett[strlen(gett)-1] != '\n' ) + { + fprintf( stderr, "Too long line?\n" ); + exit( 1 ); + } + + sscanf( gett, "%d %d %d %d %c %d %d %d %d %c %d", + &score, &name1, &start1, &alnSize1, &strand1, &seqSize1, + &name2, &start2, &alnSize2, &strand2, &seqSize2 ); + + if( alg == 'R' && name2 <= name1 ) continue; + +// if( lastresx[name1][name2].score ) continue; // dame!!!! + + prevnaln = lastresx[name1][name2].naln; +#if 0 + for( i=0; i 3 ) break; + if( pstart <= end1 && end1 <= pend && end1 - pstart > 3 ) break; + + pstart = lastresx[name1][name2].aln[i].reg2[0].start + 0; + pend = lastresx[name1][name2].aln[i].reg2[nreg-1].end - 0; + end2 = start2 + alnSize2; +// fprintf( stderr, "pstart = %d, pend = %d\n", pstart, pend ); + if( pstart <= start2 && start2 <= pend && pend - start2 > 3 ) break; + if( pstart <= end2 && end2 <= pend && end2 - pstart > 3 ) break; + } + includeintoscore = ( i == prevnaln ); +#else + if( prevnaln ) includeintoscore = 0; + else includeintoscore = 1; +#endif + if( !includeintoscore && !lastsubopt ) + continue; + + naln = prevnaln + 1; + lastresx[name1][name2].naln = naln; +// fprintf( stderr, "OK! add this alignment to hat3, %d-%d, naln = %d->%d\n", name1, name2, prevnaln, naln ); + + if( ( tmpaln = (Aln *)realloc( lastresx[name1][name2].aln, (naln) * sizeof( Aln ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].aln\n" ); + exit( 1 ); + } + else + lastresx[name1][name2].aln = tmpaln; + + + + nreg = countcomma( gett )/2 + 1; + lastresx[name1][name2].aln[prevnaln].nreg = nreg; +// lastresx[name1][name2].aln[naln].nreg = -1; +// lastresx[name1][name2].aln[naln].reg1 = NULL; +// lastresx[name1][name2].aln[naln].reg2 = NULL; +// fprintf( stderr, "name1=%d, name2=%d, nreg=%d, prevnaln=%d\n", name1, name2, nreg, prevnaln ); + + if( ( lastresx[name1][name2].aln[prevnaln].reg1 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + + if( ( lastresx[name1][name2].aln[prevnaln].reg2 = (Reg *)calloc( nreg+1, sizeof( Reg ) ) ) == NULL ) // yoyu nashi + { + fprintf( stderr, "Cannot reallocate lastresx[][].reg2\n" ); + exit( 1 ); + } + +// lastresx[name1][name2].aln[prevnaln].reg1[0].start = -1; // iranai? +// lastresx[name1][name2].aln[prevnaln].reg2[0].start = -1; // iranai? + block2reg( strrchr( gett, '\t' ), lastresx[name1][name2].aln[prevnaln].reg1, lastresx[name1][name2].aln[prevnaln].reg2, start1, start2 ); + + if( includeintoscore ) + { + if( lastresx[name1][name2].score ) score += penalty; + lastresx[name1][name2].score += score; + } + +// fprintf( stderr, "score(%d,%d) = %d\n", name1, name2, lastresx[name1][name2].score ); + } + free( gett ); +} + +#ifdef enablemultithread +#if 0 +static void *lastcallthread_group( void *arg ) +{ + lastcallthread_arg_t *targ = (lastcallthread_arg_t *)arg; + int k, i; + int nq = targ->nq; + int nd = targ->nd; +#ifdef enablemultithread + int thread_no = targ->thread_no; + int *kshare = targ->kshare; +#endif + Lastresx **lastresx = targ->lastresx; + char **dseq = targ->dseq; + char **qseq = targ->qseq; + char command[5000]; + FILE *lfp; + int msize; + int klim; + int qstart, qend, shou, amari; + char kd[1000]; + + if( nthread ) + { + shou = nq / nthread; + amari = nq - shou * nthread; + fprintf( stderr, "shou: %d, amari: %d\n", shou, amari ); + + qstart = thread_no * shou; + if( thread_no - 1 < amari ) qstart += thread_no; + else qstart += amari; + + qend = qstart + shou - 1; + if( thread_no < amari ) qend += 1; + fprintf( stderr, "%d: %d-%d\n", thread_no, qstart, qend ); + } + k = -1; + while( 1 ) + { + if( nthread ) + { + if( qstart > qend ) break; + if( k == thread_no ) break; + fprintf( stderr, "\n%d-%d / %d (thread %d) \n", qstart, qend, nq, thread_no ); + k = thread_no; + } + else + { + k++; + if( k == nq ) break; + fprintf( stderr, "\r%d / %d \r", k, nq ); + } + + if( alg == 'R' ) // if 'r' -> calllast_fast + { + fprintf( stderr, "Not supported\n" ); + exit( 1 ); + } + else // 'r' + { + kd[0] = 0; + } + + sprintf( command, "_q%d", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open %s", command ); + exit( 1 ); + } + for( i=qstart; i<=qend; i++ ) + fprintf( lfp, ">%d\n%s\n", i, qseq[i] ); + fclose( lfp ); + +// if( alg == 'R' ) msize = MAX(10,k+nq); +// else msize = MAX(10,nd+nq); + if( alg == 'R' ) msize = MAX(10,k*lastm); + else msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from lastcallthread, msize = %d, k=%d\n", msize, k ); +// sprintf( command, "grep '>' _db%sd", kd ); +// system( command ); + sprintf( command, "%s/lastal -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db%sd _q%d > _lastres%d", whereispairalign, msize, laste, -penalty, -penalty_ex, kd, k, k ); + if( system( command ) ) exit( 1 ); + + sprintf( command, "_lastres%d", k ); + lfp = fopen( command, "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres%d", k ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); +// fprintf( stderr, "Reading lastres\n" ); + readlastresx_group( lfp, lastresx ); + fclose( lfp ); + } + return( NULL ); +} +#endif +#endif + +static void *lastcallthread( void *arg ) +{ + lastcallthread_arg_t *targ = (lastcallthread_arg_t *)arg; + int k, i; + int nq = targ->nq; + int nd = targ->nd; +#ifdef enablemultithread + int thread_no = targ->thread_no; + int *kshare = targ->kshare; +#endif + Lastresx **lastresx = targ->lastresx; + char **dseq = targ->dseq; + char **qseq = targ->qseq; + char command[5000]; + FILE *lfp; + int msize; + int klim; + char kd[1000]; + + k = -1; + while( 1 ) + { + +#ifdef enablemultithread + if( nthread ) + { + pthread_mutex_lock( targ->mutex ); + k = *kshare; + if( k == nq ) + { + pthread_mutex_unlock( targ->mutex ); + break; + } + fprintf( stderr, "\r%d / %d (thread %d) \r", k, nq, thread_no ); + ++(*kshare); + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + k++; + if( k == nq ) break; + fprintf( stderr, "\r%d / %d \r", k, nq ); + } + + if( alg == 'R' ) // if 'r' -> calllast_fast + { + klim = MIN( k, njob-nadd ); +// klim = k; // dochira demo yoi + if( klim == k ) + { + sprintf( command, "_db%dd", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _db." ); + exit( 1 ); + } + for( i=0; i%d\n%s\n", i, dseq[i] ); + fclose( lfp ); + +// sprintf( command, "md5sum _db%dd > /dev/tty", k ); +// system( command ); + + if( dorp == 'd' ) + sprintf( command, "%s/lastdb _db%dd _db%dd", whereispairalign, k, k ); + else + sprintf( command, "%s/lastdb -p _db%dd _db%dd", whereispairalign, k, k ); + system( command ); + sprintf( kd, "%d", k ); + } + else // calllast_fast de tsukutta nowo riyou + { + kd[0] = 0; +// fprintf( stderr, "klim=%d, njob=%d, nadd=%d, skip!\n", klim, njob, nadd ); + } + } + else // 'r' + { + kd[0] = 0; + } + + sprintf( command, "_q%d", k ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open %s", command ); + exit( 1 ); + } + fprintf( lfp, ">%d\n%s\n", k, qseq[k] ); + fclose( lfp ); + +// if( alg == 'R' ) msize = MAX(10,k+nq); +// else msize = MAX(10,nd+nq); + if( alg == 'R' ) msize = MAX(10,k*lastm); + else msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from lastcallthread, msize = %d, k=%d\n", msize, k ); +// sprintf( command, "grep '>' _db%sd", kd ); +// system( command ); + sprintf( command, "%s/lastal -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db%sd _q%d > _lastres%d", whereispairalign, msize, laste, -penalty, -penalty_ex, kd, k, k ); + if( system( command ) ) exit( 1 ); + + sprintf( command, "_lastres%d", k ); + lfp = fopen( command, "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres%d", k ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); +// fprintf( stderr, "Reading lastres\n" ); + readlastresx_singleq( lfp, nd, k, lastresx ); + fclose( lfp ); + } + return( NULL ); +} + + +static void calllast_fast( int nd, char **dseq, int nq, char **qseq, Lastresx **lastresx ) +{ + int i, j; + FILE *lfp; + char command[1000]; + + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + if( dorp == 'd' ) + { + fprintf( lfp, " " ); + for( j=0; j<4; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<4; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<4; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + } + else + { + fprintf( lfp, " " ); + for( j=0; j<20; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<20; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<20; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + } + fclose( lfp ); + +// if( alg == 'r' ) // if 'R' -> lastcallthread, kokonoha nadd>0 no toki nomi shiyou + { + sprintf( command, "_dbd" ); + lfp = fopen( command, "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _dbd" ); + exit( 1 ); + } + if( alg == 'R' ) + j = njob-nadd; + else + j = nd; + for( i=0; i%d\n%s\n", i, dseq[i] ); + + fclose( lfp ); + if( dorp == 'd' ) + sprintf( command, "%s/lastdb _dbd _dbd", whereispairalign ); + else + sprintf( command, "%s/lastdb -p _dbd _dbd", whereispairalign ); + system( command ); + } + +#ifdef enablemultithread + if( nthread ) + { + pthread_t *handle; + pthread_mutex_t mutex; + lastcallthread_arg_t *targ; + int *ksharept; + targ = (lastcallthread_arg_t *)calloc( nthread, sizeof( lastcallthread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + ksharept = calloc( 1, sizeof(int) ); + *ksharept = 0; + pthread_mutex_init( &mutex, NULL ); + for( i=0; i%d\n%s\n", i, dseq[i] ); + fclose( lfp ); + + if( dorp == 'd' ) + { + sprintf( command, "%s/lastdb _db _db", whereispairalign ); + system( command ); + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + fprintf( lfp, " " ); + for( j=0; j<4; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<4; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<4; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + fclose( lfp ); +#if 0 + sprintf( command, "lastex -s 2 -a %d -b %d -p _scoringmatrixforlast -E 10000 _db.prj _db.prj > _lastex", -penalty, -penalty_ex ); + system( command ); + lfp = fopen( "_lastex", "r" ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + fgets( command, 4999, lfp ); + laste = atoi( command ); + fclose( lfp ); + fprintf( stderr, "laste = %d\n", laste ); + sleep( 10 ); +#else +// laste = 5000; +#endif + } + else + { + sprintf( command, "%s/lastdb -p _db _db", whereispairalign ); + system( command ); + lfp = fopen( "_scoringmatrixforlast", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _scoringmatrixforlast" ); + exit( 1 ); + } + fprintf( lfp, " " ); + for( j=0; j<20; j++ ) fprintf( lfp, " %c ", amino[j] ); + fprintf( lfp, "\n" ); + for( i=0; i<20; i++ ) + { + fprintf( lfp, "%c ", amino[i] ); + for( j=0; j<20; j++ ) fprintf( lfp, " %d ", n_dis[i][j] ); + fprintf( lfp, "\n" ); + } + fclose( lfp ); +// fprintf( stderr, "Not written yet\n" ); + } + + lfp = fopen( "_q", "w" ); + if( !lfp ) + { + fprintf( stderr, "Cannot open _q" ); + exit( 1 ); + } + for( i=0; i%d\n%s\n", i, qseq[i] ); + } + fclose( lfp ); + + msize = MAX(10,nd*lastm); + +// fprintf( stderr, "Calling lastal from calllast_once, msize=%d\n", msize ); + sprintf( command, "%s/lastal -v -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", whereispairalign, msize, laste, -penalty, -penalty_ex ); +// sprintf( command, "lastal -v -m %d -e %d -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", 1, laste, -penalty, -penalty_ex ); +// sprintf( command, "lastal -v -e 40 -f 0 -s 1 -p _scoringmatrixforlast -a %d -b %d _db _q > _lastres", -penalty, -penalty_ex ); + res = system( command ); + if( res ) + { + fprintf( stderr, "LAST aborted\n" ); + exit( 1 ); + } + + lfp = fopen( "_lastres", "r" ); + if( !lfp ) + { + fprintf( stderr, "Cannot read _lastres" ); + exit( 1 ); + } +// readlastres( lfp, nd, nq, lastres, dseq, qseq ); + fprintf( stderr, "Reading lastres\n" ); + readlastresx( lfp, nd, nq, lastresx, dseq, qseq ); + fclose( lfp ); +} + +static void callfoldalign( int nseq, char **mseq ) +{ + FILE *fp; + int i; + int res; + static char com[10000]; + + for( i=0; i%d\n", i+1 ); + fprintf( fp, "%s\n", mseq[i] ); + } + fclose( fp ); + + sprintf( com, "env PATH=%s foldalign210 %s _foldalignin > _foldalignout ", whereispairalign, foldalignopt ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in foldalign\n" ); + exit( 1 ); + } + +} + +static void calllara( int nseq, char **mseq, char *laraarg ) +{ + FILE *fp; + int i; + int res; + static char com[10000]; + +// for( i=0; i%d\n", i+1 ); + fprintf( fp, "%s\n", mseq[i] ); + } + fclose( fp ); + + +// fprintf( stderr, "calling LaRA\n" ); + sprintf( com, "env PATH=%s:/bin:/usr/bin mafft_lara -i _larain -w _laraout -o _lara.params %s", whereispairalign, laraarg ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in lara\n" ); + exit( 1 ); + } +} + +static double recalllara( char **mseq1, char **mseq2, int alloclen ) +{ + static FILE *fp = NULL; + static char *ungap1; + static char *ungap2; + static char *ori1; + static char *ori2; +// int res; + static char com[10000]; + double value; + + + if( fp == NULL ) + { + fp = fopen( "_laraout", "r" ); + if( fp == NULL ) + { + fprintf( stderr, "Cannot open _laraout\n" ); + exit( 1 ); + } + ungap1 = AllocateCharVec( alloclen ); + ungap2 = AllocateCharVec( alloclen ); + ori1 = AllocateCharVec( alloclen ); + ori2 = AllocateCharVec( alloclen ); + } + + + strcpy( ori1, *mseq1 ); + strcpy( ori2, *mseq2 ); + + fgets( com, 999, fp ); + myfgets( com, 9999, fp ); + strcpy( *mseq1, com ); + myfgets( com, 9999, fp ); + strcpy( *mseq2, com ); + + gappick0( ungap1, *mseq1 ); + gappick0( ungap2, *mseq2 ); + t2u( ungap1 ); + t2u( ungap2 ); + t2u( ori1 ); + t2u( ori2 ); + + if( strcmp( ungap1, ori1 ) || strcmp( ungap2, ori2 ) ) + { + fprintf( stderr, "SEQUENCE CHANGED!!\n" ); + fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); + fprintf( stderr, "ungap1 = %s\n", ungap1 ); + fprintf( stderr, "ori1 = %s\n", ori1 ); + fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + fprintf( stderr, "ungap2 = %s\n", ungap2 ); + fprintf( stderr, "ori2 = %s\n", ori2 ); + exit( 1 ); + } + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +// fclose( fp ); // saigo dake yatta houga yoi. + + return( value ); +} + + +static double calldafs_giving_bpp( char **mseq1, char **mseq2, char **bpp1, char **bpp2, int alloclen, int i, int j ) +{ + FILE *fp; + int res; + char *com; + double value; + char *dirname; + + + dirname = calloc( 100, sizeof( char ) ); + com = calloc( 1000, sizeof( char ) ); + sprintf( dirname, "_%d-%d", i, j ); + sprintf( com, "rm -rf %s", dirname ); + system( com ); + sprintf( com, "mkdir %s", dirname ); + system( com ); + + + sprintf( com, "%s/_bpporg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot write to %s/_bpporg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">a\n" ); + while( *bpp1 ) + fprintf( fp, "%s", *bpp1++ ); + + fprintf( fp, ">b\n" ); + while( *bpp2 ) + fprintf( fp, "%s", *bpp2++ ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_bpporg > %s/_bpp", dirname, dirname ); + system( com ); // for cygwin, wakaran + + t2u( *mseq1 ); + t2u( *mseq2 ); + + sprintf( com, "%s/_dafsinorg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_dafsinorg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">1\n" ); +// fprintf( fp, "%s\n", *mseq1 ); + write1seq( fp, *mseq1 ); + fprintf( fp, ">2\n" ); +// fprintf( fp, "%s\n", *mseq2 ); + write1seq( fp, *mseq2 ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_dafsinorg > %s/_dafsin", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "_dafssh%s", dirname ); + fp = fopen( com, "w" ); + fprintf( fp, "cd %s\n", dirname ); + fprintf( fp, "%s/dafs --mafft-in _bpp _dafsin > _dafsout 2>_dum\n", whereispairalign ); + fprintf( fp, "exit $tatus\n" ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < _dafssh%s > _dafssh%s.unix", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "sh _dafssh%s.unix 2>_dum%s", dirname, dirname ); + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in dafs\n" ); + exit( 1 ); + } + + sprintf( com, "%s/_dafsout", dirname ); + + fp = fopen( com, "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_dafsout\n", dirname ); + exit( 1 ); + } + + myfgets( com, 999, fp ); // nagai kanousei ga arunode + fgets( com, 999, fp ); + myfgets( com, 999, fp ); // nagai kanousei ga arunode + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq1 ); + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq2 ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +#if 0 + sprintf( com, "rm -rf %s > /dev/null 2>&1", dirname ); + if( system( com ) ) + { + fprintf( stderr, "retrying to rmdir\n" ); + usleep( 2000 ); + system( com ); + } +#endif + + free( dirname ); + free( com ); + + + return( value ); +} + +static double callmxscarna_giving_bpp( char **mseq1, char **mseq2, char **bpp1, char **bpp2, int alloclen, int i, int j ) +{ + FILE *fp; + int res; + char *com; + double value; + char *dirname; + + + dirname = calloc( 100, sizeof( char ) ); + com = calloc( 1000, sizeof( char ) ); + sprintf( dirname, "_%d-%d", i, j ); + sprintf( com, "rm -rf %s", dirname ); + system( com ); + sprintf( com, "mkdir %s", dirname ); + system( com ); + + + sprintf( com, "%s/_bpporg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot write to %s/_bpporg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">a\n" ); + while( *bpp1 ) + fprintf( fp, "%s", *bpp1++ ); + + fprintf( fp, ">b\n" ); + while( *bpp2 ) + fprintf( fp, "%s", *bpp2++ ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_bpporg > %s/_bpp", dirname, dirname ); + system( com ); // for cygwin, wakaran + + t2u( *mseq1 ); + t2u( *mseq2 ); + + sprintf( com, "%s/_mxscarnainorg", dirname ); + fp = fopen( com, "w" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_mxscarnainorg\n", dirname ); + exit( 1 ); + } + fprintf( fp, ">1\n" ); +// fprintf( fp, "%s\n", *mseq1 ); + write1seq( fp, *mseq1 ); + fprintf( fp, ">2\n" ); +// fprintf( fp, "%s\n", *mseq2 ); + write1seq( fp, *mseq2 ); + fclose( fp ); + + sprintf( com, "tr -d '\\r' < %s/_mxscarnainorg > %s/_mxscarnain", dirname, dirname ); + system( com ); // for cygwin, wakaran + +#if 0 + sprintf( com, "cd %s; %s/mxscarnamod -readbpp _mxscarnain > _mxscarnaout 2>_dum", dirname, whereispairalign ); +#else + sprintf( com, "_mxscarnash%s", dirname ); + fp = fopen( com, "w" ); + fprintf( fp, "cd %s\n", dirname ); + fprintf( fp, "%s/mxscarnamod -readbpp _mxscarnain > _mxscarnaout 2>_dum\n", whereispairalign ); + fprintf( fp, "exit $tatus\n" ); + fclose( fp ); +//sleep( 10000 ); + + sprintf( com, "tr -d '\\r' < _mxscarnash%s > _mxscarnash%s.unix", dirname, dirname ); + system( com ); // for cygwin, wakaran + + sprintf( com, "sh _mxscarnash%s.unix 2>_dum%s", dirname, dirname ); +#endif + res = system( com ); + if( res ) + { + fprintf( stderr, "Error in mxscarna\n" ); + exit( 1 ); + } + + sprintf( com, "%s/_mxscarnaout", dirname ); + + fp = fopen( com, "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open %s/_mxscarnaout\n", dirname ); + exit( 1 ); + } + + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq1 ); + fgets( com, 999, fp ); + load1SeqWithoutName_new( fp, *mseq2 ); + + fclose( fp ); + +// fprintf( stderr, "*mseq1 = %s\n", *mseq1 ); +// fprintf( stderr, "*mseq2 = %s\n", *mseq2 ); + + value = (double)naivepairscore11( *mseq1, *mseq2, penalty ); + +#if 0 + sprintf( com, "rm -rf %s > /dev/null 2>&1", dirname ); + if( system( com ) ) + { + fprintf( stderr, "retrying to rmdir\n" ); + usleep( 2000 ); + system( com ); + } +#endif + + free( dirname ); + free( com ); + + + return( value ); +} + +static void readhat4( FILE *fp, char ***bpp ) +{ + char oneline[1000]; + int bppsize; + int onechar; +// double prob; +// int posi, posj; + + bppsize = 0; +// fprintf( stderr, "reading hat4\n" ); + onechar = getc(fp); +// fprintf( stderr, "onechar = %c\n", onechar ); + if( onechar != '>' ) + { + fprintf( stderr, "Format error\n" ); + exit( 1 ); + } + ungetc( onechar, fp ); + fgets( oneline, 999, fp ); + while( 1 ) + { + onechar = getc(fp); + ungetc( onechar, fp ); + if( onechar == '>' || onechar == EOF ) + { +// fprintf( stderr, "Next\n" ); + *bpp = realloc( *bpp, (bppsize+2) * sizeof( char * ) ); + (*bpp)[bppsize] = NULL; + break; + } + fgets( oneline, 999, fp ); +// fprintf( stderr, "oneline=%s\n", oneline ); +// sscanf( oneline, "%d %d %lf", &posi, &posj, &prob ); +// fprintf( stderr, "%d %d -> %f\n", posi, posj, prob ); + *bpp = realloc( *bpp, (bppsize+2) * sizeof( char * ) ); + (*bpp)[bppsize] = calloc( 100, sizeof( char ) ); + strcpy( (*bpp)[bppsize], oneline ); + bppsize++; + } +} + +static void preparebpp( int nseq, char ***bpp ) +{ + FILE *fp; + int i; + + fp = fopen( "hat4", "r" ); + if( !fp ) + { + fprintf( stderr, "Cannot open hat4\n" ); + exit( 1 ); + } + for( i=0; i 0 && (*++argv)[0] == '-' ) + { +// reporterr( "(*argv)[0] in while loop = %s\n", (*argv) ); + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; +#if 0 + case 'l': + ppslocal = (int)( atof( *++argv ) * 1000 + 0.5 ); + pslocal = (int)( 600.0 / 1000.0 * ppslocal + 0.5); +// fprintf( stderr, "ppslocal = %d\n", ppslocal ); +// fprintf( stderr, "pslocal = %d\n", pslocal ); + --argc; + goto nextoption; +#else + case 'l': + if( atof( *++argv ) < 0.00001 ) store_localhom = 0; + --argc; + goto nextoption; +#endif + case 'd': + whereispairalign = *++argv; + fprintf( stderr, "whereispairalign = %s\n", whereispairalign ); + --argc; + goto nextoption; + case 'p': + laraparams = *++argv; + fprintf( stderr, "laraparams = %s\n", laraparams ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; +#ifndef enablemultithread + nthread = 0; +#endif + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); +// fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'w': + lastm = myatoi( *++argv ); + fprintf( stderr, "lastm = %d\n", lastm ); + --argc; + goto nextoption; + case 'e': + laste = myatoi( *++argv ); + fprintf( stderr, "laste = %d\n", laste ); + --argc; + goto nextoption; + case 'u': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; + case 'K': // Hontou ha iranai. disttbfast.c, tbfast.c to awaserutame. + break; + case 'c': + stdout_dist = 1; + break; + case 'n': + stdout_align = 1; + break; + case 'x': + store_localhom = 0; + store_dist = 0; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif +#if 0 + case 'r': + fmodel = -1; + break; +#endif + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; +#endif +#if 0 + case 'Q': + calledByXced = 1; + break; + case 'x': + disp = 1; + break; + case 'a': + alg = 'a'; + break; + case 'S': + alg = 'S'; + break; +#endif + case 'U': + lastonce = 1; + break; + case 'S': + lastsubopt = 1; + break; + case 't': + alg = 't'; + store_localhom = 0; + break; + case 'L': + alg = 'L'; + break; + case 'Y': + alg = 'Y'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> L; + break; + case 'Z': + usenaivescoreinsteadofalignmentscore = 1; + break; + case 's': + alg = 's'; + break; + case 'G': + alg = 'G'; + break; + case 'B': + alg = 'B'; + break; + case 'T': + alg = 'T'; + break; + case 'H': + alg = 'H'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'r': + alg = 'r'; // nadd>0 no toki nomi. moto no hairetsu to atarashii hairetsuno alignmnt -> R, last + break; + case 'N': + alg = 'N'; + break; + case 'A': + alg = 'A'; + break; + case 'V': + alg = 'V'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'y': + divpairscore = 1; + break; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'o': +// foldalignopt = *++argv; + strcat( foldalignopt, " " ); + strcat( foldalignopt, *++argv ); + fprintf( stderr, "foldalignopt = %s\n", foldalignopt ); + --argc; + goto nextoption; +#if 0 + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; +#endif + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "pairlocalalign options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } +} + +int countamino( char *s, int end ) +{ + int val = 0; + while( end-- ) + if( *s++ != '-' ) val++; + return( val ); +} + +static double score2dist( double pscore, double selfscore1, double selfscore2) +{ + double val; + double bunbo; +// fprintf( stderr, "In score2dist\n" ); + + if( (bunbo=MIN( selfscore1, selfscore2 )) == 0.0 ) + val = 2.0; + else if( bunbo < pscore ) // mondai ari + val = 0.0; + else + val = ( 1.0 - pscore / bunbo ) * 2.0; + return( val ); +} + +#if enablemultithread +static void *athread( void *arg ) // alg='R', alg='r' -> tsukawarenai. +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int i, ilim, j, jst; + int off1, off2, dum1, dum2, thereisx; + int intdum; + double pscore = 0.0; // by D.Mathog + double *effarr1; + double *effarr2; + char **mseq1, **mseq2, **distseq1, **distseq2, **dumseq1, **dumseq2; + char **aseq; + double **dynamicmtx = NULL; + double dist; + double scoreoffset; + +// thread_arg + int thread_no = targ->thread_no; + int njob = targ->njob; + Jobtable *jobpospt = targ->jobpospt; + char **name = targ->name; + char **seq = targ->seq; + char **dseq = targ->dseq; + int *thereisxineachseq = targ->thereisxineachseq; + LocalHom **localhomtable = targ->localhomtable; + double **distancemtx = targ->distancemtx; + double *selfscore = targ->selfscore; + char ***bpp = targ->bpp; + Lastresx **lastresx = targ->lastresx; + int alloclen = targ->alloclen; + int *targetmap = targ->targetmap; + double **expdist = targ->expdist; + +// fprintf( stderr, "thread %d start!\n", thread_no ); + + effarr1 = AllocateDoubleVec( 1 ); + effarr2 = AllocateDoubleVec( 1 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + if( alg == 'N' ) + { + dumseq1 = AllocateCharMtx( 1, alloclen+10 ); + dumseq2 = AllocateCharMtx( 1, alloclen+10 ); + } + distseq1 = AllocateCharMtx( 1, 0 ); + distseq2 = AllocateCharMtx( 1, 0 ); + aseq = AllocateCharMtx( 2, alloclen+10 ); + if( specificityconsideration > 0.0 ) dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + + if( alg == 'Y' || alg == 'r' ) ilim = njob - nadd; + else ilim = njob - 1; + + + while( 1 ) + { + pthread_mutex_lock( targ->mutex_counter ); + j = jobpospt->j; + i = jobpospt->i; + j++; + if( j == njob ) + { + i++; + + if( alg == 'Y' || alg == 'r' ) jst = njob - nadd; + else jst = i + 1; + j = jst; + + if( i == ilim ) + { +// fprintf( stderr, "thread %d end!\n", thread_no ); + pthread_mutex_unlock( targ->mutex_counter ); + + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + if( commonJP ) FreeIntMtx( commonJP ); + commonJP = NULL; + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // 20130603 + G__align11_noalign( NULL, 0, 0, NULL, NULL, 0 ); + L__align11( NULL, 0.0, NULL, NULL, 0, NULL, NULL ); + L__align11_noalign( NULL, NULL, NULL ); + genL__align11( NULL, NULL, NULL, 0, NULL, NULL ); + free( effarr1 ); + free( effarr2 ); + free( mseq1 ); + free( mseq2 ); + if( alg == 'N' ) + { + FreeCharMtx( dumseq1 ); + FreeCharMtx( dumseq2 ); + } + free( distseq1 ); + free( distseq2 ); + FreeCharMtx( aseq ); + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + return( NULL ); + } + } + jobpospt->j = j; + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex_counter ); + + +// if( j == i+1 || j % 100 == 0 ) + if( j == i+1 && i % 10 == 0 ) + { + fprintf( stderr, "% 5d / %d (by thread %3d) \r", i, njob-nadd, thread_no ); +// fprintf( stderr, "% 5d - %5d / %d (thread %d)\n", i, j, njob, thread_no ); + } + + + if( strlen( seq[i] ) == 0 || strlen( seq[j] ) == 0 ) + { + if( store_dist ) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = 3.0; + else distancemtx[i][j-i] = 3.0; + } + if( stdout_dist) + { + pthread_mutex_lock( targ->mutex_stdout ); + fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, 3.0 ); + pthread_mutex_unlock( targ->mutex_stdout ); + } + continue; + } + + strcpy( aseq[0], seq[i] ); + strcpy( aseq[1], seq[j] ); +// clus1 = conjuctionfortbfast( pair, i, aseq, mseq1, effarr1, effarr, indication1 ); +// clus2 = conjuctionfortbfast( pair, j, aseq, mseq2, effarr2, effarr, indication2 ); +// fprintf( stderr, "Skipping conjuction..\n" ); + + effarr1[0] = 1.0; + effarr2[0] = 1.0; + mseq1[0] = aseq[0]; + mseq2[0] = aseq[1]; + + thereisx = thereisxineachseq[i] + thereisxineachseq[j]; +// strcpy( distseq1[0], dseq[i] ); // nen no tame +// strcpy( distseq2[0], dseq[j] ); // nen no tame + distseq1[0] = dseq[i]; + distseq2[0] = dseq[j]; + +// fprintf( stderr, "mseq1 = %s\n", mseq1[0] ); +// fprintf( stderr, "mseq2 = %s\n", mseq2[0] ); + +#if 0 + fprintf( stderr, "group1 = %.66s", indication1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + fprintf( stderr, "\n" ); +#endif +// for( l=0; l 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( ( scoreoffset = dist2offset( dist ) ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + L__align11( dynamicmtx, scoreoffset, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // CHUUI!!!!!! + break; + case( 'Y' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) // new sequence vs exiting sequence nomi keisan + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + if( store_localhom ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // uwagaki + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } + else + pscore = 0.0; + break; + case( 'A' ): + if( usenaivescoreinsteadofalignmentscore ) + { + G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// if( store_localhom ) + if( store_localhom && ( targetmap[i] != -1 || targetmap[j] != -1 ) ) + { + pscore = G__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, outgap, outgap ); + if( thereisx ) pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); +// dist = score2dist( L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ), selfscore[i], selfscore[j] ); // 2014/Feb/20 + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + G__align11( dynamicmtx, mseq1, mseq2, alloclen, outgap, outgap ); + + } +// pscore = (double)naivepairscore11( *mseq1, *mseq2, 0.0 ); + } +// +#endif + } + else + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki + } + off1 = off2 = 0; + break; + case( 'N' ): + if( usenaivescoreinsteadofalignmentscore ) + { + genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + pscore = genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) + { + strcpy( dumseq1[0], distseq1[0] ); + strcpy( dumseq2[0], distseq2[0] ); + pscore = genL__align11( n_dis_consweight_multi, dumseq1, dumseq2, alloclen, &dum1, &dum2 ); // uwagaki + } +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + genL__align11( dynamicmtx, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + break; + case( 't' ): + off1 = off2 = 0; +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // tsuneni distseq shiyou + break; + case( 's' ): + pscore = callmxscarna_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'G' ): + pscore = calldafs_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; +#if 0 + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen ); + off1 = off2 = 0; + break; + case( 'K' ): + pscore = genG__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 'H' ): + pscore = recallpairfoldalign( mseq1, mseq2, i, j, &off1, &off2, alloclen ); + break; + case( 'B' ): + case( 'T' ): + pscore = recalllara( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 'M' ): + pscore = MSalign11( mseq1, mseq2, alloclen ); + break; +#endif + default: + ErrorExit( "\n\nERROR IN SOURCE FILE\n\n" ); + } + } + + if( alg == 't' || ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) // 't' no jouken ha iranai to omou. if( ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) + { +#if SCOREOUT + fprintf( stderr, "score = %10.2f (%d,%d)\n", pscore, i, j ); +#endif +// if( pscore > 0.0 && ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) x-ins-i de seido teika + if( ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) + { + if( !store_localhom ) + ; + else if( specifictarget && targetmap[i] == -1 && targetmap[j] == -1) + ; + else if( alg == 'R' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j, lastresx[i]+j, 'h' ); + else if( alg == 'r' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), lastresx[i]+j-(njob-nadd), 'h' );// ????? + else if( alg == 'H' ) + putlocalhom_ext( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( alg == 'Y' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( !specifictarget && alg != 'S' && alg != 'V' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-i, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else +// putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ) ); + { + if( targetmap[i] != -1 && targetmap[j] != -1 ) + { + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); // sukoshi muda. + } + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + else if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); +#if 0 + if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); +#endif + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + } + } + pscore = score2dist( pscore, selfscore[i], selfscore[j] ); + +// pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); +// pscore = score2dist( pscore, selfscore[i], selfscore[j] ); +// reporterr( "->pscore = %f\n", pscore ); + + } + else + { + pscore = 2.0; + } + +#if 1 // mutex + if( stdout_align ) + { + pthread_mutex_lock( targ->mutex_stdout ); + if( alg != 't' ) + { + fprintf( stdout, "sequence %d - sequence %d, pairwise distance = %10.5f\n", i+1, j+1, pscore ); + fprintf( stdout, ">%s\n", name[i] ); + write1seq( stdout, mseq1[0] ); + fprintf( stdout, ">%s\n", name[j] ); + write1seq( stdout, mseq2[0] ); + fprintf( stdout, "\n" ); + } + pthread_mutex_unlock( targ->mutex_stdout ); + } + if( stdout_dist ) + { + pthread_mutex_lock( targ->mutex_stdout ); + if( j == i+1 ) fprintf( stdout, "%d %d d=%.3f\n", i+1, i+1, 0.0 ); + fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, pscore ); + pthread_mutex_unlock( targ->mutex_stdout ); + } +#endif // mutex + if( store_dist ) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = pscore; + else distancemtx[i][j-i] = pscore; + } + } +} +#endif + +static void pairalign( char **name, int *nlen, char **seq, char **aseq, char **dseq, int *thereisxineachseq, char **mseq1, char **mseq2, int alloclen, Lastresx **lastresx, double **distancemtx, LocalHom **localhomtable, double **expdist, int ngui ) +{ + int i, j, ilim, jst, jj; + int off1, off2, dum1, dum2, thereisx; + double pscore = 0.0; // by D.Mathog + FILE *hat2p, *hat3p; +// double **distancemtx; + double *selfscore; + double *effarr1; + double *effarr2; + char *pt; + char *hat2file = "hat2"; +// LocalHom **localhomtable = NULL, + LocalHom *tmpptr; + int intdum; + char ***bpp = NULL; // mxscarna no toki dake + char **distseq1, **distseq2; + char **dumseq1, **dumseq2; + double dist; + double scoreoffset; + int ntarget; + int *targetmap, *targetmapr; + + + if( specifictarget ) + { + targetmap = calloc( njob, sizeof( int ) ); + ntarget = 0; + for( i=0; i_focus_' to the title lines of the sequences to be focused on.\n\n" ); + exit( 1 ); + } + else + { + reporterr( "nfocus = %d \n", ntarget ); + } + } + else + { + ntarget = njob; + targetmap = calloc( njob, sizeof( int ) ); + targetmapr = calloc( njob, sizeof( int ) ); + for( i=0; i 0 ) // alg=='r' || alg=='R' -> nthread:=0 (sukoshi ue) + { + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex_counter; + pthread_mutex_t mutex_stdout; + thread_arg_t *targ; + + if( alg == 'Y' || alg == 'r' ) jobpos.j = njob - nadd - 1; + else jobpos.j = 0; + jobpos.i = 0; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex_counter, NULL ); + pthread_mutex_init( &mutex_stdout, NULL ); + + for( i=0; i 0.0 ) dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + + if( alg == 'Y' || alg == 'r' ) ilim = njob - nadd; + else ilim = njob - 1; + for( i=0; i 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); +// dist = score2dist( L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ), selfscore[i], selfscore[j] ); // 2014/Feb/20 +// reporterr( "dist(%d,%d)=%f\n", i, j, dist ); + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + G__align11( dynamicmtx, mseq1, mseq2, alloclen, outgap, outgap ); + } +// pscore = (double)naivepairscore11( *mseq1, *mseq2, 0.0 ); + } +#endif + } + else + pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // uwagaki + } + off1 = off2 = 0; + break; + case( 'N' ): +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, alloclen ); + if( usenaivescoreinsteadofalignmentscore ) + { + genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + pscore = genL__align11( n_dis_consweight_multi, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) + { + strcpy( dumseq1[0], distseq1[0] ); + strcpy( dumseq2[0], distseq2[0] ); + pscore = genL__align11( n_dis_consweight_multi, dumseq1, dumseq2, alloclen, &dum1, &dum2 ); // uwagaki + } +#if 1 + if( specificityconsideration > 0.0 ) + { +// fprintf( stderr, "dist = %f\n", score2dist( pscore, selfscore[i], selfscore[j] ) ); + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( dist2offset( dist ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + genL__align11( dynamicmtx, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + break; + case( 'R' ): + if( nadd && njob-nadd <= j && njob-nadd <= i ) // new sequence doushi ha mushi + pscore = 0.0; + else + pscore = (double)lastresx[i][j].score; // all pair + break; + case( 'r' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) + pscore = (double)lastresx[i][j-(njob-nadd)].score; + else + pscore = 0.0; + break; + case( 'L' ): + if( nadd && njob-nadd <= j && njob-nadd <= i ) // new sequence doushi ha mushi + pscore = 0.0; + else + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { +// if( store_localhom ) + if( store_localhom && ( targetmap[i] != -1 || targetmap[j] != -1 ) ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); // all pair + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // all pair +#if 1 + if( specificityconsideration > 0.0 ) + { + if( expdist ) + dist = expdist[i][j]; + else + dist = score2dist( pscore, selfscore[i], selfscore[j] ); + if( ( scoreoffset = dist2offset( dist ) ) < 0.0 ) + { + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, 0.5 * dist ); // upgma ni awaseru. + strcpy( mseq1[0], seq[i] ); + strcpy( mseq2[0], seq[j] ); + L__align11( dynamicmtx, scoreoffset, mseq1, mseq2, alloclen, &off1, &off2 ); + } + } +#endif + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // all pair + } + } +// pscore = G__align11_noalign( n_dis_consweight_multi, penalty, penalty_ex, distseq1, distseq2, alloclen ); // CHUUI!!!!!! + break; + case( 'Y' ): + if( nadd == 0 || ( i < njob-nadd && njob-nadd <= j ) ) // new sequence vs exiting sequence nomi keisan + { + if( usenaivescoreinsteadofalignmentscore ) + { + L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + pscore = (double)naivepairscore11( mseq1[0], mseq2[0], 0.0 ); // uwagaki + } + else + { + if( store_localhom ) + { + pscore = L__align11( n_dis_consweight_multi, 0.0, mseq1, mseq2, alloclen, &off1, &off2 ); + if( thereisx ) pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); // uwagaki + } + else + pscore = L__align11_noalign( n_dis_consweight_multi, distseq1, distseq2 ); + } + } + else + pscore = 0.0; + break; + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, 1, 1, alloclen ); + off1 = off2 = 0; + break; +#if 0 + case( 'K' ): + pscore = genG__align11( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; +#endif + case( 'H' ): + pscore = recallpairfoldalign( mseq1, mseq2, i, j, &off1, &off2, alloclen ); + break; + case( 'B' ): + case( 'T' ): + pscore = recalllara( mseq1, mseq2, alloclen ); + off1 = off2 = 0; + break; + case( 's' ): + pscore = callmxscarna_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'G' ): + pscore = calldafs_giving_bpp( mseq1, mseq2, bpp[i], bpp[j], alloclen, i, j ); + off1 = off2 = 0; + break; + case( 'M' ): + pscore = MSalign11( mseq1, mseq2, alloclen ); + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + + if( alg == 't' || ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) // 't' no jouken ha iranai to omou. if( ( mseq1[0][0] != 0 && mseq2[0][0] != 0 ) ) + { +#if SCOREOUT + fprintf( stderr, "score = %10.2f (%d,%d)\n", pscore, i, j ); +#endif +// if( pscore > 0.0 && ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) // x-ins-i de seido teika + if( ( nadd == 0 || ( alg != 'Y' && alg != 'r' ) || ( i < njob-nadd && njob-nadd <= j ) ) ) + { + if( !store_localhom ) + ; + else if( specifictarget && targetmap[i] == -1 && targetmap[j] == -1) + ; + else if( alg == 'R' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j, lastresx[i]+j, 'h' ); + else if( alg == 'r' ) + putlocalhom_last( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), lastresx[i]+j-(njob-nadd), 'h' );// ????? + else if( alg == 'H' ) + putlocalhom_ext( mseq1[0], mseq2[0], localhomtable[i]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( alg == 'Y' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-(njob-nadd), off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else if( !specifictarget && alg != 'S' && alg != 'V' ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[i]+j-i, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else + { + if( targetmap[i] != -1 && targetmap[j] != -1 ) + { + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); // sukoshi muda. + } + else if( targetmap[j] != -1 ) + putlocalhom2( mseq2[0], mseq1[0], localhomtable[targetmap[j]]+i, off2, off1, (int)pscore, strlen( mseq2[0] ), 'h' ); + else if( targetmap[i] != -1 ) + putlocalhom2( mseq1[0], mseq2[0], localhomtable[targetmap[i]]+j, off1, off2, (int)pscore, strlen( mseq1[0] ), 'h' ); + else + { + reporterr( "okashii\n" ); + exit( 1 ); + } + } + } + + pscore = score2dist( pscore, selfscore[i], selfscore[j] ); + } + else + { + pscore = 2.0; + } + + if( stdout_align ) + { + if( alg != 't' ) + { + fprintf( stdout, "sequence %d - sequence %d, pairwise distance = %10.5f\n", i+1, j+1, pscore ); + fprintf( stdout, ">%s\n", name[i] ); + write1seq( stdout, mseq1[0] ); + fprintf( stdout, ">%s\n", name[j] ); + write1seq( stdout, mseq2[0] ); + fprintf( stdout, "\n" ); + } + } + if( stdout_dist ) fprintf( stdout, "%d %d d=%.3f\n", i+1, j+1, pscore ); + if( store_dist) + { + if( alg == 'Y' || alg == 'r' ) distancemtx[i][j-(njob-nadd)] = pscore; + else distancemtx[i][j-i] = pscore; + } + } + } + if( dynamicmtx ) FreeDoubleMtx( dynamicmtx ); + } + + + if( store_dist && ngui == 0 ) + { + hat2p = fopen( hat2file, "w" ); + if( !hat2p ) ErrorExit( "Cannot open hat2." ); + if( alg == 'Y' || alg == 'r' ) + WriteHat2_part_pointer( hat2p, njob, nadd, name, distancemtx ); + else +// WriteHat2_pointer( hat2p, njob, name, distancemtx ); + WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, distancemtx ); // jissiha double + fclose( hat2p ); + } + + hat3p = fopen( "hat3", "w" ); + if( !hat3p ) ErrorExit( "Cannot open hat3." ); + if( store_localhom && ngui == 0 ) + { + + fprintf( stderr, "\n\n##### writing hat3\n" ); + if( alg == 'Y' || alg == 'r' ) + ilim = njob-nadd; + else if( specifictarget ) + ilim = ntarget; + else + ilim = njob-1; + for( i=0; inext ) + { +// fprintf( stderr, "j=%d, jj=%d\n", j, jj ); + if( tmpptr->opt == -1.0 ) continue; +// tmptmptmptmptmp +// if( alg == 'B' || alg == 'T' ) +// fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, 1.0, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, (void *)tmpptr->next ); +// else + if( targetmap[j] == -1 || targetmap[i] < targetmap[j] ) + fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d h\n", targetmapr[i], j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2 ); +// fprintf( hat3p, "%d %d %d %7.5f %d %d %d %d h\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2+1, tmpptr->end2+1 ); // zettai dame!!!! + } + } + } +// if( ngui == 0 ) +// { +#if DEBUG + fprintf( stderr, "calling FreeLocalHomTable\n" ); +#endif + if( alg == 'Y' || alg == 'r' ) + FreeLocalHomTable_part( localhomtable, (njob-nadd), nadd ); + else if( specifictarget ) + FreeLocalHomTable_part( localhomtable, ntarget, njob ); + else + FreeLocalHomTable_half( localhomtable, njob ); +#if DEBUG + fprintf( stderr, "done. FreeLocalHomTable\n" ); +#endif +// } + } + fclose( hat3p ); + + if( alg == 's' ) + { + char **ptpt; + for( i=0; i M ) + { + fprintf( stderr, "The number of sequences must be < %d\n", M ); + fprintf( stderr, "Please try the splittbfast program for such large data.\n" ); + exit( 1 ); + } + } + + if( ( alg == 'r' || alg == 'R' ) && dorp == 'p' ) + { + fprintf( stderr, "Not yet supported\n" ); + exit( 1 ); + } + + alloclen = nlenmax*2; + if( ngui ) + { + seq = seqgui; + name = namegui; + } + else + { + seq = AllocateCharMtx( njob, alloclen+10 ); + name = AllocateCharMtx( njob, B ); + } + + aseq = AllocateCharMtx( 2, alloclen+10 ); + bseq = AllocateCharMtx( njob, alloclen+10 ); + dseq = AllocateCharMtx( njob, alloclen+10 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + nlen = AllocateIntVec( njob ); + thereisxineachseq = AllocateIntVec( njob ); + + + if( alg == 'R' ) + { + lastresx = calloc( njob+1, sizeof( Lastresx * ) ); + for( i=0; i 0 ) // protein, not text. hitsuyou? + { + for( i=0; i 1 ) + { + fprintf( stderr, "\nThe order of distances is not identical to that in the input file, because of the parallel calculation. Reorder them by yourself, using sort -n -k 2 | sort -n -k 1 -s\n" ); + } + if( stdout_align && nthread > 1 ) + { + fprintf( stderr, "\nThe order of pairwise alignments is not identical to that in the input file, because of the parallel calculation. Reorder them by yourself.\n" ); + } + +#if 1 + if( lastresx ) + { + for( i=0; lastresx[i]; i++ ) + { + for( j=0; lastresx[i][j].naln!=-1; j++ ) + { + for( k=0; k0; i-- ) + { + if( alignmentlength != strlen( seq[i] ) ) + { + fprintf( stderr, "#################################################################################\n" ); + fprintf( stderr, "# ERROR! \n" ); + fprintf( stderr, "# For the --add option, the original%4d sequences must be aligned \n", njob-nadd ); + fprintf( stderr, "#################################################################################\n" ); + exit( 1 ); + } + } + } + + if( specifictarget ) + { + reporterr( "specifictarget\n" ); + + ntarget = 0; + for( i=0; i_focus_' to the title lines of the sequences to be focused on.\n\n" ); + exit( 1 ); + } + else + { + reporterr( "nfocus = %d \n", ntarget ); + } + } + else + { + ntarget = njob; +// targetmap = calloc( njob, sizeof( int ) ); +// targetmapr = calloc( njob, sizeof( int ) ); + +// for( i=0; i impmtx=%f\n", i1, j1, impmtx[i1][j1] ); + return( impmtx[i1][j1] ); +#if 0 + if( i1 == l1 || j1 == l2 ) return( 0.0 ); + return( impmtx[i1+start1][j1+start2] ); +#endif +} +static void part_imp_match_out_vead_gapmap( double *imp, int i1, int lgth2, int start2, int *gapmap2 ) +{ +#if FASTMACHCALC + double *pt = imp; + int *gapmappt = gapmap2; + while( lgth2-- ) + *pt++ += impmtx[i1][start2+*gapmappt++]; +#else + int j; + for( j=0; j-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + // simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } +#endif +} + + +static void fillzero( double *s, int l ) +{ + while( l-- ) *s++ = 0.0; +} + + +static void match_calc_del( int **which, double ***matrices, double *match, int n1, char **seq1, double *eff1, int n2, char **seq2, double *eff2, int i1, int lgth2, int mid, int nmask, int *mask1, int *mask2 ) +{ +// osoi! + int i, j, k, m; + int c1, c2; +// fprintf( stderr, "\nmatch_calc_dynamicmtx... %d", i1 ); +// fprintf( stderr, "\nseq1[0]=%s\n", seq1[0] ); +// fprintf( stderr, "\nseq2[0]=%s\n", seq2[0] ); +// for( i=0; i ", match[k], mid ); + match[k] -= matrices[mid][c1][c2] * eff1[i] * eff2[j]; +// fprintf( stderr, "match[k] = %f (mid=%d)\n", match[k], mid ); + } + } +// fprintf( stderr, "done\n" ); + return; +} + +static void match_calc_add( double **scoreingmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) +{ +#if FASTMATCHCALC +// fprintf( stderr, "\nmatch_calc... %d", i1 ); + int j, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *matchpt, *cpmxpdpt, **cpmxpdptpt; + int *cpmxpdnpt, **cpmxpdnptpt; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); + if( initialize ) + { + int count = 0; + for( j=0; j-1 ) + *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; + matchpt++; + } + } + free( scarr ); +// fprintf( stderr, "done\n" ); +#else + int j, k, l; +// double scarr[26]; + double **cpmxpd = doublework; + int **cpmxpdn = intwork; + double *scarr; + scarr = calloc( nalphabets, sizeof( double ) ); +// simple + if( initialize ) + { + int count = 0; + for( j=0; j-1; k++ ) + match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; + } + free( scarr ); +#endif +} + +static void Atracking_localhom( double *impwmpt, double *lasthorizontalw, double *lastverticalw, + char **seq1, char **seq2, + char **mseq1, char **mseq2, + int **ijp, int icyc, int jcyc, + int start1, int end1, int start2, int end2, + int *gapmap1, int *gapmap2, + int *warpis, int *warpjs, int warpbase ) +{ + int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, limk; +// char gap[] = "-"; + char *gap; + double wm; + gap = newgapstr; + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + +#if 0 + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + for( i=0; i= 0 ) + { + for( i=0; i= wm ) + { + wm = lastverticalw[i]; + iin = i; jin = lgth2-1; + ijp[lgth1][lgth2] = +( lgth1 - i ); + } + } + for( j=0; j= wm ) + { + wm = lasthorizontalw[j]; + iin = lgth1-1; jin = j; + ijp[lgth1][lgth2] = -( lgth2 - j ); + } + } + } + + for( i=0; i= warpbase ) + { + ifi = warpis[ijp[iin][jin]-warpbase]; + jfi = warpjs[ijp[iin][jin]-warpbase]; + } + else if( ijp[iin][jin] < 0 ) + { + ifi = iin-1; jfi = jin+ijp[iin][jin]; + } + else if( ijp[iin][jin] > 0 ) + { + ifi = iin-ijp[iin][jin]; jfi = jin-1; + } + else + { + ifi = iin-1; jfi = jin-1; + } + if( ifi == -warpbase && jfi == -warpbase ) + { + l = iin; + while( --l >= 0 ) + { + for( i=0; i= 0 ) + { + for( i=0; i lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double *ogcp1; + static TLS double *ogcp2; + static TLS double *fgcp1; + static TLS double *fgcp2; + static TLS double **cpmx1; + static TLS double **cpmx2; + static TLS double *gapfreq1; + static TLS double *gapfreq2; + static TLS int **intwork; + static TLS double **doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + double fpenalty = (double)penalty; + double fpenalty_shift = (double)penalty_shift; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; +#endif + double *fgcp2pt; + double *ogcp2pt; + double fgcp1va; + double ogcp1va; + double *gf2pt; + double *gf2ptpre; + double gf1va; + double gf1vapre; + double headgapfreq1; + double headgapfreq2; + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + + + if( seq1 == NULL ) + { + if( orlgth1 ) + { +// fprintf( stderr, "## Freeing local arrays in A__align\n" ); + orlgth1 = 0; + orlgth2 = 0; + + part_imp_match_init_strict( NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL ); + + free( mseq1 ); + free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + + } + else + { +// fprintf( stderr, "## Not allocated\n" ); + } + return( 0.0 ); + } +// fprintf( stderr, "IN partA__align\n" ); + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); +#if 1 +// if( lgth1 == 0 ) fprintf( stderr, "WARNING: lgth1=0 in partA__align\n" ); +// if( lgth2 == 0 ) fprintf( stderr, "WARNING: lgth2=0 in partA__align\n" ); + + if( lgth1 == 0 && lgth2 == 0 ) + return( 0.0 ); + + if( lgth1 == 0 ) + { + for( i=0; i orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + ogcp1 = AllocateFloatVec( ll1+2 ); + ogcp2 = AllocateFloatVec( ll2+2 ); + fgcp1 = AllocateFloatVec( ll1+2 ); + fgcp2 = AllocateFloatVec( ll2+2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + + gapfreq1 = AllocateFloatVec( ll1+2 ); + gapfreq2 = AllocateFloatVec( ll2+2 ); + +#if FASTMATCHCALC + doublework = AllocateFloatMtx( MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntMtx( MAX( ll1, ll2 )+2, nalphabets ); +#else + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); +#endif + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + + cpmx_calc_new( seq1, cpmx1, eff1, lgth1, icyc ); + cpmx_calc_new( seq2, cpmx2, eff2, lgth2, jcyc ); + + if( sgap1 ) + { + new_OpeningGapCount( ogcp1, icyc, seq1, eff1, lgth1, sgap1 ); + new_OpeningGapCount( ogcp2, jcyc, seq2, eff2, lgth2, sgap2 ); + new_FinalGapCount( fgcp1, icyc, seq1, eff1, lgth1, egap1 ); + new_FinalGapCount( fgcp2, jcyc, seq2, eff2, lgth2, egap2 ); + outgapcount( &headgapfreq1, icyc, sgap1, eff1 ); + outgapcount( &headgapfreq2, jcyc, sgap2, eff2 ); + outgapcount( gapfreq1+lgth1, icyc, egap1, eff1 ); + outgapcount( gapfreq2+lgth2, jcyc, egap2, eff2 ); + } + else + { + st_OpeningGapCount( ogcp1, icyc, seq1, eff1, lgth1 ); + st_OpeningGapCount( ogcp2, jcyc, seq2, eff2, lgth2 ); + st_FinalGapCount( fgcp1, icyc, seq1, eff1, lgth1 ); + st_FinalGapCount( fgcp2, jcyc, seq2, eff2, lgth2 ); + headgapfreq1 = 0.0; + headgapfreq2 = 0.0; + gapfreq1[lgth1] = 0.0; + gapfreq2[lgth2] = 0.0; + } + + if( legacygapcost == 0 ) + { + gapcountf( gapfreq1, seq1, icyc, eff1, lgth1 ); + gapcountf( gapfreq2, seq2, jcyc, eff2, lgth2 ); + for( i=0; i tbfast.c + if( localhom ) + imp_match_calc( currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + + if( outgap == 1 ) + { + for( i=1; i", wm ); +#endif +// g = mi + *fgcp2pt * gapfreq1[i]; + if( (g = mi + *fgcp2pt * gf1va) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } +// g = *prept + *ogcp2pt * gapfreq1[i-1]; +// if( (g = *prept + *ogcp2pt * gf1vapre) >= mi ) + if( (g = *prept + *ogcp2pt * gf1vapre) > mi ) // 2018/Apr + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// g = *mjpt + fgcp1va * gapfreq2[j]; + if( (g = *mjpt + fgcp1va * *gf2pt) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } +// g = *prept + ogcp1va * gapfreq2[j-1]; +// if( (g = *prept + ogcp1va * *gf2ptpre) >= *mjpt ) + if( (g = *prept + ogcp1va * *gf2ptpre) > *mjpt ) // 2018/Apr + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { +// fprintf( stderr, "WARP in partA__align\n" ); + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + curm = *curpt + wm; + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + curpt++; + fgcp2pt++; + ogcp2pt++; + gf2ptpre++; + gf2pt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + } + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + for( i=0; i lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; /* int ?????? */ + double g; + double *currentw, *previousw; +#if 1 + double *wtmp; + int *ijppt; + double *mjpt, *prept, *curpt; + int *mpjpt; +#endif + static TLS double mi, *m; + static TLS int **ijp; + static TLS int mpi, *mp; + static TLS double *w1, *w2; + static TLS double *match; + static TLS double *initverticalw; /* kufuu sureba iranai */ + static TLS double *lastverticalw; /* kufuu sureba iranai */ + static TLS char **mseq1; + static TLS char **mseq2; + static TLS char **mseq; + static TLS double *ogcp1; + static TLS double *ogcp2; + static TLS double *fgcp1; + static TLS double *fgcp2; + static TLS double ***cpmx1s; + static TLS double ***cpmx2s; + static TLS double *gapfreq1; + static TLS double *gapfreq2; + static TLS int ***intwork; + static TLS double ***doublework; + static TLS int orlgth1 = 0, orlgth2 = 0; + double fpenalty = (double)penalty; + double fpenalty_shift = (double)penalty_shift; +#if USE_PENALTY_EX + double fpenalty_ex = (double)penalty_ex; +#endif + double *fgcp2pt; + double *ogcp2pt; + double fgcp1va; + double ogcp1va; + double *gf2pt; + double *gf2ptpre; + double gf1va; + double gf1vapre; + double headgapfreq1; + double headgapfreq2; + + int *warpis = NULL; + int *warpjs = NULL; + int *warpi = NULL; + int *warpj = NULL; + int *prevwarpi = NULL; + int *prevwarpj = NULL; + double *wmrecords = NULL; + double *prevwmrecords = NULL; + int warpn = 0; + int warpbase; + double curm = 0.0; + double *wmrecordspt, *wmrecords1pt, *prevwmrecordspt; + int *warpipt, *warpjpt; + int *nmask, **masklist1, **masklist2; + + + if( seq1 == NULL ) + { + if( orlgth1 ) + { +// fprintf( stderr, "## Freeing local arrays in A__align\n" ); + orlgth1 = 0; + orlgth2 = 0; + + part_imp_match_init_strict( NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL ); + + free( mseq1 ); + free( mseq2 ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatCub( cpmx1s ); + FreeFloatCub( cpmx2s ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatCub( doublework ); + FreeIntCub( intwork ); + + } + else + { +// fprintf( stderr, "## Not allocated\n" ); + } + return( 0.0 ); + } + + masklist1 = AllocateIntMtx( maxdistclass, 0 ); + masklist2 = AllocateIntMtx( maxdistclass, 0 ); + nmask = calloc( maxdistclass, sizeof( int ) ); + + for( c=0; c orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + if( orlgth1 > 0 && orlgth2 > 0 ) + { + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); + FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + + FreeCharMtx( mseq ); + + FreeFloatVec( ogcp1 ); + FreeFloatVec( ogcp2 ); + FreeFloatVec( fgcp1 ); + FreeFloatVec( fgcp2 ); + + + FreeFloatCub( cpmx1s ); + FreeFloatCub( cpmx2s ); + + FreeFloatVec( gapfreq1 ); + FreeFloatVec( gapfreq2 ); + + FreeFloatCub( doublework ); + FreeIntCub( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); + match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + + mseq = AllocateCharMtx( njob, ll1+ll2 ); + + ogcp1 = AllocateFloatVec( ll1+2 ); + ogcp2 = AllocateFloatVec( ll2+2 ); + fgcp1 = AllocateFloatVec( ll1+2 ); + fgcp2 = AllocateFloatVec( ll2+2 ); + + cpmx1s = AllocateFloatCub( maxdistclass, nalphabets, ll1+2 ); + cpmx2s = AllocateFloatCub( maxdistclass, nalphabets, ll2+2 ); + + gapfreq1 = AllocateFloatVec( ll1+2 ); + gapfreq2 = AllocateFloatVec( ll2+2 ); + + doublework = AllocateFloatCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets ); + intwork = AllocateIntCub( maxdistclass, MAX( ll1, ll2 )+2, nalphabets ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + + + for( i=0; i commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijp = commonIP; + +// cpmx_calc_new( seq1, cpmx1, eff1, lgth1, icyc ); +// cpmx_calc_new( seq2, cpmx2, eff2, lgth2, jcyc ); + for( c=0; c tbfast.c, localhom ga hitsuyou + if( localhom ) + imp_match_calc( currentw, icyc, jcyc, lgth1, lgth2, seq1, seq2, eff1, eff2, localhom, 1, 0 ); + +#endif + + if( outgap == 1 ) + { + for( i=1; i", wm ); +#endif +// g = mi + *fgcp2pt * gapfreq1[i]; + if( (g = mi + *fgcp2pt * gf1va) > wm ) + { + wm = g; + *ijppt = -( j - mpi ); + } +// g = *prept + *ogcp2pt * gapfreq1[i-1]; +// if( (g = *prept + *ogcp2pt * gf1vapre) >= mi ) + if( (g = *prept + *ogcp2pt * gf1vapre) > mi ) // 2018/Apr + { + mi = g; + mpi = j-1; + } +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +// g = *mjpt + fgcp1va * gapfreq2[j]; + if( (g = *mjpt + fgcp1va * *gf2pt) > wm ) + { + wm = g; + *ijppt = +( i - *mpjpt ); + } +// g = *prept + ogcp1va * gapfreq2[j-1]; +// if( (g = *prept + ogcp1va * *gf2ptpre) >= *mjpt ) + if( (g = *prept + ogcp1va * *gf2ptpre) > *mjpt ) // 2018/Apr + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + m[j] += fpenalty_ex; +#endif + if( trywarp ) + { +#if USE_PENALTY_EX + if( ( g=*prevwmrecordspt++ + fpenalty_shift + fpenalty_ex * ( i - prevwarpi[j-1] + j - prevwarpj[j-1] ) ) > wm ) // naka ha osokute kamawanai +#else + if( ( g=*prevwmrecordspt++ + fpenalty_shift ) > wm ) // naka ha osokute kamawanai +#endif + { + if( warpn && prevwarpi[j-1] == warpis[warpn-1] && prevwarpj[j-1] == warpjs[warpn-1] ) + { + *ijppt = warpbase + warpn - 1; + } + else + { + *ijppt = warpbase + warpn; + warpis = realloc( warpis, sizeof(int) * ( warpn+1 ) ); + warpjs = realloc( warpjs, sizeof(int) * ( warpn+1 ) ); + warpis[warpn] = prevwarpi[j-1]; + warpjs[warpn] = prevwarpj[j-1]; + warpn++; + } + wm = g; + } + + curm = *curpt + wm; + if( *wmrecords1pt > *wmrecordspt ) + { + *wmrecordspt = *wmrecords1pt; + *warpipt = *(warpipt-1); + *warpjpt = *(warpjpt-1); + } + if( curm > *wmrecordspt ) + { + *wmrecordspt = curm; + *warpipt = i; + *warpjpt = j; + } + wmrecordspt++; + wmrecords1pt++; + warpipt++; + warpjpt++; + } + +#if 0 + fprintf( stderr, "%5.0f ", wm ); +#endif + *curpt += wm; + ijppt++; + mjpt++; + prept++; + mpjpt++; + curpt++; + fgcp2pt++; + ogcp2pt++; + gf2ptpre++; + gf2pt++; + + } + lastverticalw[i] = currentw[lgth2-1]; + + if( trywarp ) + { + fltncpy( prevwmrecords, wmrecords, lastj ); + intncpy( prevwarpi, warpi, lastj ); + intncpy( prevwarpj, warpj, lastj ); + } + } + if( trywarp ) + { +// fprintf( stderr, "wm = %f\n", wm ); +// fprintf( stderr, "warpn = %d\n", warpn ); + free( wmrecords ); + free( prevwmrecords ); + free( warpi ); + free( warpj ); + free( prevwarpi ); + free( prevwarpj ); + } + +#if OUTGAP0TRY + if( !outgap ) + { + for( j=1; j" ); + for( i=0; i N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + for( i=0; i output +# See http://mafft.cbrc.jp/alignment/software/regionalrealignment.html +# +# v0.2, 2013/Sep/21, Fixed a windows-specific bug. +# +##################################################################### + + +def readfasta( fp, name, seq ) + nseq = 0 + tmpseq = "" + while fp.gets + if $_ =~ /^>/ then + name.push( $_.sub(/>/,"").strip ) + seq.push( tmpseq ) if nseq > 0 + nseq += 1 + tmpseq = "" + else + tmpseq += $_.strip + end + end + seq.push( tmpseq ) + return nseq +end + +def resolve( tree ) + while 1 +# p tree + tree.sub!( /\,([0-9]+):(\-?[0-9\.]+)\,([0-9]+):(\-?[0-9\.]+)/, ",XXX" ) + hit1 = $1 + hit2 = $2 + hit3 = $3 + hit4 = $4 + +# p hit1 +# p hit2 +# p hit3 +# p hit4 + +# puts "introduce XXX" +# p tree + + break unless tree.index(/XXX/) + + poshit = tree.index(/XXX/) +# puts "poshit=" + poshit.to_s + + i = poshit + height = 0 + while i >= 0 + break if height == 0 && tree[i..i] == '(' + if tree[i..i] == ')' then + height += 1 + elsif tree[i..i] == '(' then + height -= 1 + end + i -= 1 + end + + poskakko = i +# puts "poskakko = " + poskakko.to_s + zenhan = tree[0..poskakko] + zenhan = "" if poskakko == -1 +# puts "zenhan = " + zenhan + + treelen = tree.length + tree = zenhan + "(" + tree[poskakko+1..treelen] +# puts "add (" +# p tree + tree.sub!( /XXX/, "#{hit1}:#{hit2}):0,#{hit3}:#{hit4}" ) + +# p tree +end + + +return tree + +end + +if ARGV.length != 2 then + STDERR.puts "" + STDERR.puts "Usage: ruby #{$0} setingfile inputfile > output" + STDERR.puts "" + exit 1 +end + +infilename = ARGV[1] +tname = [] +tseq = [] +infp = File.open( infilename, "r" ) +tin = readfasta( infp, tname, tseq ) +infp.close + +if tin == 0 then + STDERR.puts "" + STDERR.puts "Error in the '#{infilename}' file. Is this FASTA format?\n" + STDERR.puts "" + exit 1 +end + +alnlen = tseq[0].length +if alnlen == 0 then + STDERR.puts "" + STDERR.puts "Error in the '#{infilename}' file. Is this FASTA format?\n" + STDERR.puts "" + exit 1 +end + + +for i in 0..(tin-1) + if alnlen != tseq[i].length then + STDERR.puts "" + STDERR.puts "Please insert gaps such that all the input sequences have the same length.\n" + STDERR.puts "" + exit 1 + end +end + +checkmap = [] +for i in 0..(alnlen-1) + checkmap.push(0) +end + +outputseq = [] +for i in 0..(tin-1) + outputseq.push("") +end + + +settingfile = ARGV[0].to_s +reg = [] +startpos = [] +endpos = [] +realign = [] +options = [] +treeoption = "" +revwarn = 0 +sfp = File.open( settingfile, "r" ) +while line = sfp.gets + line.sub!(/#.*/,"") + next if line.length < 2 + if line.strip =~ /^treeoption / then + treeoption = line.strip.sub(/.*treeoption/,"") + break + end +end +sfp.close +sfp = File.open( settingfile, "r" ) +while line = sfp.gets + line.sub!(/#.*/,"") + next if line.length < 2 + next if line.strip =~ /^treeoption/ + startposv = line.split(' ')[0].to_i - 1 + endposv = line.split(' ')[1].to_i - 1 + if startposv < 0 || endposv < 0 then + STDERR.puts "\nError in the '#{settingfile}' file. Please check this line:\n" + STDERR.puts line + STDERR.puts "Sites must be numbered as 1, 2, ...\n" + STDERR.puts "\n" + exit 1 + end + if startposv >= alnlen || endposv >= alnlen then + STDERR.puts "\nError in the '#{settingfile}' file. Please check this line:\n" + STDERR.puts line + STDERR.puts "Sites must be numbered as 1, 2, ... #{alnlen}\n" + STDERR.puts "\n" + exit 1 + end + if startposv > endposv then + STDERR.puts "\nWarning. Please check this line:\n" + STDERR.puts line + STDERR.puts "Start position > End position ?\n" + STDERR.puts "\n" + revwarn = 1 +# exit 1 + end + startpos.push( startposv ) + endpos.push( endposv ) + if startposv > endposv + for k in (endposv)..(startposv) + checkmap[k] += 1 + end + else + for k in (startposv)..(endposv) + checkmap[k] += 1 + end + end + if line.split(' ')[2] == "realign" then + realign.push( 1 ) + elsif line.split(' ')[2] == "preserve" then + realign.push( 0 ) + else + STDERR.puts "\n" + STDERR.puts "The third column must be 'realign' or 'preserve'\n" + STDERR.puts "Please check this line:\n" + STDERR.puts line + STDERR.puts "\n" + exit 1 + end + if line =~ / \-\-/ && line =~ /realign/ then + options.push( line.sub(/.*realign/,"").strip ) + else + options.push( treeoption ) + end +end +sfp.close + +#p startpos +#p endpos +#p options + + +#res = system "#{$MAFFTCOMMAND} #{treeoption} --treeout --retree 0 --thread -1 #{infilename} > _dum" +res = system "#{$MAFFTCOMMAND} #{treeoption} --treeout --retree 0 #{infilename} > _dum" + +if res == false then + STDERR.puts "\n" + STDERR.puts "ERROR in building a guide tree" + STDERR.puts "\n" + exit 1 +end + +treefp = File.open( "#{infilename}.tree", "r" ) + +tree = "" +while line = treefp.gets + tree += line.strip + break if tree =~ /;$/ +end +treefp.close + +tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9]\.[0-9]*e-[0-9][0-9]/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "") +scale = 1.0 +mtreefp = File.open("_tree", "w") + + +#STDERR.puts "Tree = " + tree + +memi = [-1,-1] +leni = [-1,-1] + +while tree.index( /\(/ ) + + tree = resolve( tree ) + + tree.sub!( /\(([0-9]+):(\-?[0-9\.]+),([0-9]+):(\-?[0-9\.]+)\)/, "XXX" ) + memi[0] = $1.to_i + leni[0] = $2.to_f * scale + memi[1] = $3.to_i + leni[1] = $4.to_f * scale + + if leni[0] > 10 || leni[1] > 10 then + STDERR.puts "" + STDERR.puts "Please check the scale of branch length!" + STDERR.puts "The unit of branch lengths must be 'substitution/site'" + STDERR.puts "If the unit is 'substition' in your tree, please" + STDERR.puts "use the scale argument," + STDERR.puts "% newick2mafft scale in > out" + STDERR.puts "where scale = 1/(alignment length)" + STDERR.puts "" + exit 1 + end + +# STDERR.puts "subtree = " + $& + + if memi[1] < memi[0] then + memi.reverse! + leni.reverse! + end + + tree.sub!( /XXX/, memi[0].to_s ) + +# STDERR.puts "Tree = " + tree + + mtreefp.printf( "%5d %5d %10.5f %10.5f\n", memi[0], memi[1], leni[0], leni[1] ) + +end + + +mtreefp.close + +numreg = startpos.length + +for i in 0..(numreg-1) + + partfp = File.open( "_part", "w" ) + for j in 0..(tin-1) + partfp.puts ">" + tname[j] + if startpos[i] > endpos[i] then + partfp.puts tseq[j][endpos[i]..startpos[i]].reverse + else + partfp.puts tseq[j][startpos[i]..endpos[i]] + end + end + partfp.close + + if( realign[i] == 1 ) then + STDERR.puts "Aligning region #{startpos[i]+1} - #{endpos[i]+1}" + res = system "#{$MAFFTCOMMAND} #{options[i]} --inputorder --treein _tree _part > _partout" + if res == false then + STDERR.puts "\n" + STDERR.puts "ERROR in aligning region #{startpos[i]+1} - #{endpos[i]+1}" + STDERR.puts "Please check the option:" + STDERR.puts "#{options[i]}" + STDERR.puts "\n" + exit 1 + end + + else + STDERR.puts "Copying region #{startpos[i]+1} - #{endpos[i]+1}" +# system "cp _part _partout" + File.rename( "_part", "_partout" ) + end + + pname = [] + pseq = [] + partfp = File.open( "_partout", "r" ) + pin = readfasta( partfp, pname, pseq ) + partfp.close + for j in 0..(tin-1) + outputseq[j] += pseq[j] + end +end + +for j in 0..(tin-1) + puts ">" + tname[j] + puts outputseq[j] +end + +STDERR.puts "Done." + +numdupsites = checkmap.select{|x| x>1}.length +if numdupsites > 0 then + STDERR.puts "" + STDERR.puts "#########################################################" + STDERR.puts "# Warning: #{numdupsites} sites were duplicatedly selected." + STDERR.puts "#########################################################" + STDERR.puts "" +end + +numunselectedsites = checkmap.select{|x| x==0}.length +if numunselectedsites > 0 then + STDERR.puts "" + STDERR.puts "#########################################################" + STDERR.puts "# Warning: #{numunselectedsites} sites were not selected." + STDERR.puts "#########################################################" + STDERR.puts "" +end + +if revwarn == 1 then + STDERR.puts "" + STDERR.puts "#########################################################" + STDERR.puts "# Warning: The order of sites were reversed." + STDERR.puts "#########################################################" + STDERR.puts "" +end + + +STDERR.puts "" +STDERR.puts " Tree: computed with #{treeoption} --treeout " +for i in 0..(numreg-1) + range = sprintf( "%6d - %6d", startpos[i]+1, endpos[i]+1 ) + if realign[i] == 1 then + STDERR.puts "#{range}: realigned with #{options[i]} --treein (tree)" + else + STDERR.puts "#{range}: preserved" + end +end +STDERR.puts "" + +File.delete( "_dum" ) +File.delete( "_tree" ) +File.delete( "_part" ) +File.delete( "_partout" ) + diff --git a/mafft/src/mafft-7.487-with-extensions/core/regtable2seq.c b/mafft/src/mafft-7.487-with-extensions/core/regtable2seq.c new file mode 100644 index 0000000000..a4faa3662b --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/regtable2seq.c @@ -0,0 +1,216 @@ +#include "mltaln.h" + +#define DEBUG 0 + +char *regfile; +char *eregfile; + +void arguments( int argc, char *argv[] ) +{ + int c; + + outnumber = 0; + inputfile = NULL; + regfile = NULL; + eregfile = NULL; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'e': + eregfile = *++argv; + fprintf( stderr, "eregfile = %s\n", eregfile ); + --argc; + goto nextoption; + case 'r': + regfile = *++argv; + fprintf( stderr, "regfile = %s\n", regfile ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'n' : + outnumber = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + +void readereg( FILE *regfp, int **regtable, char **revtable, int *outtable, int *noutpt, int *loutpt ) +{ + char gett[1000]; + int j; + int mem; + char cmem; + char reg[5][100]; + char out[100]; + int startpos, endpos; + + *noutpt = 0; + *loutpt = 0; + fgets( gett, 999, regfp ); + reg[0][0] = reg[1][0] = reg[2][0] = reg[3][0] = reg[4][0] = 'n'; + reg[0][1] = reg[1][1] = reg[2][1] = reg[3][1] = reg[4][1] = 0; + sscanf( gett, "%c %s %s %s %s %s", &cmem, reg[0], reg[1], reg[2], reg[3], reg[4] ); + if( cmem != 'e' ) + { + fprintf( stderr, "Format error\n" ); + exit( 1 ); + } + for( j=0; j<5; j++ ) + { +// reporterr( "reg[j]=%s\n", reg[j] ); + sscanf( reg[j], "%d-%d-%c", regtable[0]+(j*2), regtable[0]+(j*2)+1, revtable[0]+j ); + fprintf( stderr, "%d %d-%d\n", 0, regtable[0][j*2], regtable[0][j*2+1] ); + startpos = regtable[0][j*2]; + endpos = regtable[0][j*2+1]; +// reporterr( "startpod=%d, endpos=%d, *loutpt=%d\n", startpos, endpos, *loutpt ); + if( startpos > endpos ) + { + endpos = regtable[0][j*2]; + startpos = regtable[0][j*2+1]; + } + if( startpos != -1 && endpos != -1 ) + *loutpt += endpos - startpos + 1; + } + + while( 1 ) + { + fgets( gett, 999, regfp ); + if( feof( regfp ) ) break; + sscanf( gett, "%d o=%s", &mem, out ); + if( mem >= njob ) + { + fprintf( stderr, "Out of range\n" ); + exit( 1 ); + } + outtable[mem] = atoi( out ); + if( outtable[mem] ) *noutpt += 1; + } +} + +void readreg( FILE *regfp, int **regtable, char **revtable, int *outtable ) +{ + char gett[1000]; + int j; + int mem; + char reg[5][100]; + char out[100]; + + while( 1 ) + { + fgets( gett, 999, regfp ); + if( feof( regfp ) ) break; + sscanf( gett, "%d %s %s %s %s %s o=%s", &mem, reg[0], reg[1], reg[2], reg[3], reg[4], out ); + if( mem >= njob ) + { + fprintf( stderr, "Out of range\n" ); + exit( 1 ); + } + for( j=0; j<5; j++ ) + { + sscanf( reg[j], "%d-%d-%c", regtable[mem]+(j*2), regtable[mem]+(j*2)+1, revtable[mem]+j ); + fprintf( stderr, "%d %d-%d\n", mem, regtable[mem][j*2], regtable[mem][j*2+1] ); + } + outtable[mem] = atoi( out ); + } +} + +int main( int argc, char *argv[] ) +{ + FILE *infp; + FILE *regfp; + int nlenmin; + int **regtable; + char **revtable; + int *outtable; + int i, nout, lout; + char **outseq; + char **name; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + dorp = NOTSPECIFIED; + getnumlen_nogap( infp, &nlenmin ); + + if( regfile ) + { + regfp = fopen( regfile, "r" ); + if( !regfp ) + { + fprintf( stderr, "Cannot open %s\n", regfile ); + exit( 1 ); + } + regtable = AllocateIntMtx( njob, 5*2 ); + revtable = AllocateCharMtx( njob, 5 ); + outtable = AllocateIntVec( njob ); + readreg( regfp, regtable, revtable, outtable ); + cutData( infp, regtable, revtable, outtable ); + } + else if( eregfile ) + { + regfp = fopen( eregfile, "r" ); + if( !regfp ) + { + fprintf( stderr, "Cannot open %s\n", eregfile ); + exit( 1 ); + } + regtable = AllocateIntMtx( 1, 5*2 ); + revtable = AllocateCharMtx( 1, 5 ); + outtable = AllocateIntVec( njob ); + readereg( regfp, regtable, revtable, outtable, &nout, &lout ); + fprintf( stderr, "nout = %d, lout = %d\n", nout, lout ); + + outseq = AllocateCharMtx( nout, lout+1 ); + name = AllocateCharMtx( nout, B ); + + cutAlignment( infp, regtable, revtable, outtable, name, outseq ); + fprintf( stderr, "gappick! nout = %d\n", nout ); + commongappick( nout, outseq ); + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'o': + seedoffset = myatoi( *++argv ); + fprintf( stderr, "seedoffset = %d\n", seedoffset ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + int nlenmin; + char **name; + char **seq; + int *nlen; + int i; + char *usual; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + +// dorp = NOTSPECIFIED; + getnumlen_casepreserve( infp, &nlenmin ); + + fprintf( stderr, "%d x %d - %d %c\n", njob, nlenmax, nlenmin, dorp ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + + readData_pointer_casepreserve( infp, name, nlen, seq ); + fclose( infp ); + +// for( i=0; i%s\n", name[i]+1 ); + if( seq[i][nlen[i]-1] == '\n' ) seq[i][nlen[i]-1] = 0; + fprintf( origfp, "%s\n", seq[i] ); + } + fclose( origfp ); +#endif + + if( dorp == 'p' ) + { + usual = "ARNDCQEGHILKMFPSTWYVarndcqeghilkmfpstwyv-."; + replace_unusual( njob, seq, usual, 'X', toupper ); + } + else + { + usual = "ATGCUatgcuBDHKMNRSVWYXbdhkmnrsvwyx-"; + replace_unusual( njob, seq, usual, 'n', tolower ); + } + + + + for( i=0; i_os_%d_oe_%s\n", i+seedoffset, name[i]+1 ); + fprintf( stdout, "%s\n", seq[i] ); + } + + free( nlen ); + FreeCharMtx( seq ); + FreeCharMtx( name ); + + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/restoreu.c b/mafft/src/mafft-7.487-with-extensions/core/restoreu.c new file mode 100644 index 0000000000..eb2b66591d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/restoreu.c @@ -0,0 +1,319 @@ +#include "mltaln.h" + +#define DEBUG 0 + +char *alignmentfile; +int keeplength; + +static void fillorichar( int nseq, int *oripos, char **a, char **s ) +{ + int i; + char *pta, *pts; + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + --argc; + goto nextoption; + case 'a': + alignmentfile = *++argv; + --argc; + goto nextoption; + case 'Z': // add2ndharfarg wo tsukau tame. + break; + case 'p': // add2ndharfarg wo tsukau tame. + break; + case 'Y': + keeplength = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + FILE *alfp; + FILE *dlfp; + char **name; + char **aname; + char **oname; + char **seq; + char **aseq; + int *nlen; + int *oripos; + char *npt, *npt0, *npt2, *pt, *pt2; + int i, o, prelen; + int nlenmin; + int njobs, njoba; +// int **dlist; +// int *ndel; + char *gett; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( alignmentfile ) + { + alfp = fopen( alignmentfile, "r" ); + if( !alfp ) + { + fprintf( stderr, "Cannot open %s\n", alignmentfile ); + exit( 1 ); + } + } + else + { + fprintf( stderr, "No alignment is given.\n" ); + exit( 1 ); + } + + if( keeplength ) + { + dlfp = fopen( "_deletelist", "r" ); + if( !dlfp ) + { + fprintf( stderr, "Cannot open _deletefile\n" ); + exit( 1 ); + } + } + + dorp = NOTSPECIFIED; + getnumlen_casepreserve( infp, &nlenmin ); + njobs = njob; +// fprintf( stderr, "in infp, %d x %d - %d %c\n", njob, nlenmin, nlenmax, dorp ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + oripos = AllocateIntVec( njob ); + readData_pointer_casepreserve( infp, name, nlen, seq ); + fclose( infp ); + + dorp = NOTSPECIFIED; + getnumlen( alfp ); + njoba = njob; +// fprintf( stderr, "in alfp, %d x %d %c\n", njob, nlenmax, dorp ); + aseq = AllocateCharMtx( njob, nlenmax+1 ); + aname = AllocateCharMtx( njob, B+1 ); + oname = AllocateCharMtx( njob, B+1 ); + readData_pointer( alfp, aname, nlen, aseq ); + fclose( alfp ); + + for( i=0; i 3 ) code1 = 36; + code2 = amino_n[(int)s2[j][p2]]; + if( code2 > 3 ) code2 = 36; + +// fprintf( stderr, "'l'%c-%c: %f\n", s1[i][p1], s2[j][p2], (double)ribosumdis[code1][code2] ); + + val += (double)ribosumdis[code1][code2] * eff1[i] * eff2[j]; + } + return( val ); +} +static double pairedribosumscore53( int n1, int n2, char **s1, char **s2, double *eff1, double *eff2, int p1, int p2, int c1, int c2 ) +{ + double val; + int i, j; + int code1o, code1u, code2o, code2u, code1, code2; + + val = 0.0; + for( i=0; i 3 ) code1 = code1o = 36; + else if( code1u > 3 ) code1 = 36; + else code1 = 4 + code1o * 4 + code1u; + + code2o = amino_n[(int)s2[j][p2]]; + code2u = amino_n[(int)s2[j][c2]]; + if( code2o > 3 ) code2 = code1o = 36; + else if( code2u > 3 ) code2 = 36; + else code2 = 4 + code2o * 4 + code2u; + + +// fprintf( stderr, "%c%c-%c%c: %f\n", s1[i][p1], s1[i][c1], s2[j][p2], s2[j][c2], (double)ribosumdis[code1][code2] ); + + if( code1 == 36 || code2 == 36 ) + val += (double)n_dis[code1o][code2o] * eff1[i] * eff2[j]; + else + val += (double)ribosumdis[code1][code2] * eff1[i] * eff2[j]; + } + return( val ); +} + +static double pairedribosumscore35( int n1, int n2, char **s1, char **s2, double *eff1, double *eff2, int p1, int p2, int c1, int c2 ) +{ + double val; + int i, j; + int code1o, code1u, code2o, code2u, code1, code2; + + val = 0.0; + for( i=0; i 3 ) code1 = code1o = 36; + else if( code1u > 3 ) code1 = 36; + else code1 = 4 + code1u * 4 + code1o; + + code2o = amino_n[(int)s2[j][p2]]; + code2u = amino_n[(int)s2[j][c2]]; + if( code2o > 3 ) code2 = code1o = 36; + else if( code2u > 3 ) code2 = 36; + else code2 = 4 + code2u * 4 + code2o; + + +// fprintf( stderr, "%c%c-%c%c: %f\n", s1[i][p1], s1[i][c1], s2[j][p2], s2[j][c2], (double)ribosumdis[code1][code2] ); + + if( code1 == 36 || code2 == 36 ) + val += (double)n_dis[code1o][code2o] * eff1[i] * eff2[j]; + else + val += (double)ribosumdis[code1][code2] * eff1[i] * eff2[j]; + } + return( val ); +} +#endif + + +static void mccaskillextract( char **seq, char **nogap, int nseq, RNApair **pairprob, RNApair ***single, int **sgapmap, double *eff ) +{ + int lgth; + int nogaplgth; + int i, j; + int left, right, adpos; + double prob; + static TLS int *pairnum; + RNApair *pt, *pt2; + + lgth = strlen( seq[0] ); + pairnum = calloc( lgth, sizeof( int ) ); + for( i=0; ibestpos!=-1; pt++ ) + { + left = sgapmap[i][j]; + right = sgapmap[i][pt->bestpos]; + prob = pt->bestscore; + + + for( pt2=pairprob[left]; pt2->bestpos!=-1; pt2++ ) + if( pt2->bestpos == right ) break; + +// fprintf( stderr, "i,j=%d,%d, left=%d, right=%d, pt=%d, pt2->bestpos = %d\n", i, j, left, right, pt-single[i][j], pt2->bestpos ); + if( pt2->bestpos == -1 ) + { + pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) ); + adpos = pairnum[left]; + pairnum[left]++; + pairprob[left][adpos].bestscore = 0.0; + pairprob[left][adpos].bestpos = right; + pairprob[left][adpos+1].bestscore = -1.0; + pairprob[left][adpos+1].bestpos = -1; + pt2 = pairprob[left]+adpos; + } + else + adpos = pt2-pairprob[left]; + + pt2->bestscore += prob * eff[i]; + + if( pt2->bestpos != right ) + { + fprintf( stderr, "okashii!\n" ); + exit( 1 ); + } +// fprintf( stderr, "adding %d-%d, %f\n", left, right, prob ); +// fprintf( stderr, "pairprob[0][0].bestpos=%d\n", pairprob[0][0].bestpos ); +// fprintf( stderr, "pairprob[0][0].bestscore=%f\n", pairprob[0][0].bestscore ); + } + } + +// fprintf( stderr, "before taikakuka\n" ); + for( i=0; i -1 ) + { +// pairprob[i][j].bestscore /= (double)nseq; +// fprintf( stderr, "pair of %d = %d (%f) %c:%c\n", i, pairprob[i][j].bestpos, pairprob[i][j].bestscore, seq[0][i], seq[0][pairprob[i][j].bestpos] ); + } + } + +#if 0 + for( i=0; i %d\n", i, j, right, i ); + pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) ); + pairprob[right][pairnum[right]].bestscore = pairprob[i][j].bestscore; + pairprob[right][pairnum[right]].bestpos = i; + pairnum[right]++; + pairprob[right][pairnum[right]].bestscore = -1.0; + pairprob[right][pairnum[right]].bestpos = -1; + } +#endif + + free( pairnum ); + +} + + +void rnaalifoldcall( char **seq, int nseq, RNApair **pairprob ) +{ + int lgth; + int i; + static TLS int *order = NULL; + static TLS char **name = NULL; + char gett[1000]; + FILE *fp; + int left, right, dumm; + double prob; + static TLS int pid; + static TLS char fnamein[100]; + static TLS char cmd[1000]; + static TLS int *pairnum; + + lgth = strlen( seq[0] ); + if( order == NULL ) + { + pid = (int)getpid(); + sprintf( fnamein, "/tmp/_rnaalifoldin.%d", pid ); + order = AllocateIntVec( njob ); + name = AllocateCharMtx( njob, 10 ); + for( i=0; i 50.0 && prob > pairprob[left][0].bestscore ) + { + pairprob[left][0].bestscore = prob; + pairprob[left][0].bestpos = right; +#else + if( prob > 0.0 ) + { + pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) ); + pairprob[left][pairnum[left]].bestscore = prob / 100.0; + pairprob[left][pairnum[left]].bestpos = right; + pairnum[left]++; + pairprob[left][pairnum[left]].bestscore = -1.0; + pairprob[left][pairnum[left]].bestpos = -1; + fprintf( stderr, "%d-%d, %f\n", left, right, prob ); + + pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) ); + pairprob[right][pairnum[right]].bestscore = prob / 100.0; + pairprob[right][pairnum[right]].bestpos = left; + pairnum[right]++; + pairprob[right][pairnum[right]].bestscore = -1.0; + pairprob[right][pairnum[right]].bestpos = -1; + fprintf( stderr, "%d-%d, %f\n", left, right, prob ); +#endif + } + } + fclose( fp ); + sprintf( cmd, "rm -f %s", fnamein ); + system( cmd ); + + for( i=0; i -1 ) + { + pairprob[right][0].bestpos = i; + pairprob[right][0].bestscore = pairprob[i][0].bestscore; + } + } + +#if 0 + for( i=0; i -1 ) pairprob[i][0].bestscore = 1.0; // atode kesu +#endif + +// fprintf( stderr, "after taikakuka in rnaalifoldcall\n" ); +// for( i=0; iori\n%s\n", oseq1[0] ); + fprintf( stdout, ">rev\n%s\n", oseq1r[0] ); + } +#endif + +/* similarity score */ + Lalignmm_hmout( oseq1, oseq2, eff1, eff2, nseq1, nseq2, 10000, NULL, NULL, NULL, NULL, map ); + + if( 1 ) + { + if( RNAscoremtx == 'n' ) + { + for( i=0; ibestpos!=-1; pairpt1++ ) + { + +// if( pairprob1[i] == NULL ) continue; + + for( j=0; jbestpos!=-1; pairpt2++ ) + { +// fprintf( stderr, "i=%d, j=%d, pn1=%d, pn2=%d\n", i, j, pairpt1-pairprob1[i], pairpt2-pairprob2[j] ); +// if( pairprob2[j] == NULL ) continue; + + uido = pairpt1->bestpos; + ujdo = pairpt2->bestpos; + prob = pairpt1->bestscore * pairpt2->bestscore; +// prob = 1.0; +// fprintf( stderr, "i=%d->uido=%d, j=%d->ujdo=%d\n", i, uido, j, ujdo ); + +// fprintf( stderr, "impmtx2[%d][%d] = %f\n", i, j, impmtx2[i][j] ); + +// if( i < uido && j > ujdo ) continue; +// if( i > uido && j < ujdo ) continue; + + +// posdistj = abs( ujdo-j ); + +// if( uido > -1 && ujdo > -1 ) + if( uido > -1 && ujdo > -1 && ( ( i > uido && j > ujdo ) || ( i < uido && j < ujdo ) ) ) + { + { + impmtx2[i][j] += MAX( 0, map[uido][ujdo] ) * consweight_rna * 600 * prob; // osoi + } + } + + } + } + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'o': + RNAppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'O': + ppenalty_OP = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'E': + ppenalty_EX = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; + fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "TM %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + ppslocal = (int)( atof( *++argv ) * 1000 + 0.5 ); + pslocal = (int)( 600.0 / 1000.0 * ppslocal + 0.5); +// fprintf( stderr, "ppslocal = %d\n", ppslocal ); +// fprintf( stderr, "pslocal = %d\n", pslocal ); + --argc; + goto nextoption; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'r': + fmodel = -1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; + case 'R': + fftRepeatStop = 1; + break; +#endif + case 'Q': + calledByXced = 1; + break; + case 's': + treemethod = 's'; + break; + case 'x': + disp = 1; + break; + case 'p': + treemethod = 'p'; + break; +#if 0 + case 'a': + alg = 'a'; + break; +#endif + case 'S': + alg = 'S'; + break; + case 'L': + alg = 'L'; + break; + case 'M': + alg = 'M'; + break; + case 'R': + alg = 'R'; + break; + case 'N': + alg = 'N'; + break; + case 'A': + alg = 'A'; + break; + case 'V': + alg = 'V'; + break; + case 'C': + alg = 'C'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + divpairscore = 1; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + +int countamino( char *s, int end ) +{ + int val = 0; + while( end-- ) + if( *s++ != '-' ) val++; + return( val ); +} + + +static void WriteOptions( FILE *fp ) +{ + + if( dorp == 'd' ) fprintf( fp, "DNA\n" ); + else + { + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "BLOSUM %d\n", nblosum ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + } + fprintf( stderr, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + if( use_fft ) fprintf( fp, "FFT on\n" ); + + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Algorithm A+\n" ); + else if( alg == 'S' ) + fprintf( fp, "Apgorithm S\n" ); + else if( alg == 'C' ) + fprintf( fp, "Apgorithm A+/C\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( treemethod == 'x' ) + fprintf( fp, "Tree = UPGMA (3).\n" ); + else if( treemethod == 's' ) + fprintf( fp, "Tree = UPGMA (2).\n" ); + else if( treemethod == 'p' ) + fprintf( fp, "Tree = UPGMA (1).\n" ); + else + fprintf( fp, "Unknown tree.\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( dorp == 'd' ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + + +int main( int argc, char *argv[] ) +{ + static int *nlen; + static char **name, **seq, **useq; + static char **mseq1, **mseq2; + static char **aseq; + static char **bseq; + static double *eff; + int i; + FILE *infp; + char c; + int alloclen; + RNApair **pair1; + RNApair **pair2; + double **map; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + getnumlen( infp ); + rewind( infp ); + + if( njob > M ) + { + fprintf( stderr, "The number of sequences must be < %d\n", M ); + fprintf( stderr, "Please try the splittbfast program for such large data.\n" ); + exit( 1 ); + } + + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + + seq = AllocateCharMtx( njob, nlenmax*5+1 ); + useq = AllocateCharMtx( njob, nlenmax*5+1 ); + aseq = AllocateCharMtx( njob, nlenmax*5+1 ); + bseq = AllocateCharMtx( njob, nlenmax*5+1 ); + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + alloclen = nlenmax*5; + + pair1 = calloc( nlenmax*5+1, sizeof( RNApair *) ); + pair2 = calloc( nlenmax*5+1, sizeof( RNApair *) ); + map = AllocateFloatMtx( nlenmax+1, nlenmax ); + + eff = AllocateDoubleVec( njob ); + + readData_pointer( infp, name, nlen, seq ); + fclose( infp ); + + for( i=0; i %c ", seq[0][pair1[i].pos], seq[1][map12[pair1[i].pos].pos] ); + if( pair2[map12[pair1[i].pos].pos].pos == -1 ) continue; + fprintf( stderr, "%d:%d (%c)", map12[pair1[i].pos].pos, pair2[map12[pair1[i].pos].pos].pos, seq[1][pair2[map12[pair1[i].pos].pos].pos] ); + } +#endif + + + exit( 1 ); + + + pairalign( name, nlen, bseq, aseq, mseq1, mseq2, eff, alloclen ); + fprintf( trap_g, "done.\n" ); +#if DEBUG + fprintf( stderr, "closing trap_g\n" ); +#endif + fclose( trap_g ); + +// writePre( njob, name, nlen, aseq, !contin ); +#if 0 + writeData( stdout, njob, name, nlen, aseq ); +#endif +#if IODEBUG + fprintf( stderr, "OSHIMAI\n" ); +#endif + SHOWVERSION; + return( 0 ); +#endif +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/score.c b/mafft/src/mafft-7.487-with-extensions/core/score.c new file mode 100644 index 0000000000..1b19a921fc --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/score.c @@ -0,0 +1,98 @@ +#include "mltaln.h" + +#define DEBUG 0 + +void arguments( int argc, char *argv[] ) +{ + int c; + + ppenalty = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + scoremtx = NOTSPECIFIED; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'D': + scoremtx = -1; + break; + case 'P': + scoremtx = 0; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } +} + + +int main( int ac, char **av ) +{ + int *nlen; + static char **name, **seq; + double score; + extern double score_calc_for_score( int, char ** ); + + arguments( ac, av ); + + getnumlen( stdin ); + rewind( stdin ); + + nlen = AllocateIntVec( njob ); + name = AllocateCharMtx( njob, B+1 ); + seq = AllocateCharMtx( njob, nlenmax+2 ); + + readData_pointer( stdin, name, nlen, seq ); + + if( !isaligned( njob, seq ) ) ErrorExit( "Not aligned." ); + + constants( njob, seq ); + + score = score_calc_for_score( njob, seq ); + if( scoremtx == 0 ) score += offset; + + fprintf( stdout, "score = %f\n", score ); + if ( scoremtx == 0 ) fprintf( stdout, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( stdout, "Dayhoff( machigai ga aru )\n" ); + else if( scoremtx == 2 ) fprintf( stdout, "M-Y\n" ); + else if( scoremtx == -1 ) fprintf( stdout, "DNA 1:%d\n", kimuraR ); + + fprintf( stdout, "gap penalty = %+6.2f, %+6.2f, %+6.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + exit( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/seekquencer_premafft.tmpl b/mafft/src/mafft-7.487-with-extensions/core/seekquencer_premafft.tmpl new file mode 100644 index 0000000000..a9040fdd19 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/seekquencer_premafft.tmpl @@ -0,0 +1,600 @@ +#!/usr/bin/perl + +#################################################################################### +# Author: KM Amada (kmamada@ifrec.osaka-u.ac.jp) +# +# Ver. Date Changelog +#################################################################################### +# 1.0 11.01.13 Initial release +# +# **Skipped version 2 to standardise version numbers to seekquencer.pl script** +# +# 3.0 04.24.14 Added split option -mod for output +# Uses seekquencer_v3 backend +# +# 4.0 05.12.14 Added new options: -run -trd -noin +# Sets -seqa fast in seekquencer.pl +# Uses seekquencer_v4 backend +# +# 4.1 05.19.14 Added a check on running REST requests before proceeding +# to avoid server load problems +# +# 4.2 05.27.14 Seq limit processing done in seekquencer.pl script +# to avoid server load problems +# +# 4.3 07.22.14 Added new option: -seqd +# Blast limit changed from factor of 10 to -blim option +# Timing on sleep changed; added srand() for making seed +# Moved the job limit processing to server side +# +# 4.4 08.05.14 Modified to work in multiple OS +# +# +#################################################################################### + +use strict; +use Getopt::Long; +use File::Path qw(make_path remove_tree); +use Cwd; +use LWP::Simple; +use LWP::UserAgent; + +# to prevent error: Header line too long (limit is 8192) +use LWP::Protocol::http; +push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 0); + + + +my $BASEURL = "http://sysimm.ifrec.osaka-u.ac.jp/seekquencer/REST/service.cgi/premafft"; +my ( $INPUTFILE, $IDLISTFILE, $SEQFASTAFILE, $OUTPUTFILE, $SEQFLAG, $STRFLAG, $EVALFLAG, $NOINFLAG ); +my $OUTTYPE = "mafftash"; + +my $SEQDATABASE = "uniref100"; +my $SEQLIMIT = 100; +my $SEQBLASTLIMIT = 100; + +my $RUNMODE = "normal"; # thread|normal +my $THREADCOUNT = 3; + + +GetOptions +( + 'inp=s' => \$INPUTFILE, + 'idf=s' => \$IDLISTFILE, + 'seqf=s' => \$SEQFASTAFILE, + 'out=s' => \$OUTPUTFILE, + 'str' => \$STRFLAG, + 'seq' => \$SEQFLAG, + 'seqd=s' => \$SEQDATABASE, + 'lim=i' => \$SEQLIMIT, + 'blim=i' => \$SEQBLASTLIMIT, + 'pre' => \$EVALFLAG, + 'noin' => \$NOINFLAG, + 'mod=s' => \$OUTTYPE, + 'run=s' => \$RUNMODE, + 'trd=i' => \$THREADCOUNT, + + +); + +my $ISWINDOWS = ( $^O =~ /^MSWin/ ) ? 1 : 0; +print STDERR "[Seekquencer-premafft 4.4 on $^O]\n"; + + +# set temp directory +my $CWD = getcwd; +my $TMP = "$CWD/seekpremafft$$"; +make_path($TMP) unless -d $TMP; + + + +###### +# validation +help("Required parameter: define input as '-inp' or '-idf' or '-seqf'") if ( !defined $INPUTFILE && !defined $IDLISTFILE && !defined $SEQFASTAFILE ); +help("'-inp' is already defined") if ( defined $INPUTFILE && (defined $IDLISTFILE || defined $SEQFASTAFILE) ); +help("Input file $INPUTFILE does not exist (or filesize is 0)") if ( defined $INPUTFILE && (! -e $INPUTFILE || !-s $INPUTFILE) ); +help("Input file $IDLISTFILE does not exist (or filesize is 0)") if ( defined $IDLISTFILE && (! -e $IDLISTFILE || !-s $IDLISTFILE) ); +help("Input file $SEQFASTAFILE does not exist (or filesize is 0)") if ( defined $SEQFASTAFILE && (! -e $SEQFASTAFILE || !-s $SEQFASTAFILE) ); +help("Required parameter: output file '-out'") unless ( defined $OUTPUTFILE ); +help("Set either '-str' or '-seq' or dont set any at all") if ( defined $STRFLAG && defined $SEQFLAG ); + +help("Invalid value for '-seqd '") if ( $SEQDATABASE ne "uniref100" && $SEQDATABASE ne "uniref90" && $SEQDATABASE ne "uniref70" && $SEQDATABASE ne "uniprot"); +help("Invalid value for '-mod '") if ( $OUTTYPE ne "fasta" && $OUTTYPE ne "mafftash" && $OUTTYPE ne "mafftash-split" ); +help("Invalid value for '-run '") if ( $RUNMODE ne "thread" && $RUNMODE ne "normal" ); +help("Invalid value for '-trd '; count should be between 1 and 5 (inclusive)") if ( $RUNMODE eq "thread" && ($THREADCOUNT <= 0 || $THREADCOUNT > 5) ); + + +###### +# check existing requests +print STDERR "Checking server status...\n"; + +# generate seed +srand($$); + +# sleep a bit to give time for lsf response +sleep(int(rand(6))+1); + + +my $browser = LWP::UserAgent->new; +$browser->timeout(0); + +# get: check if you can send a new request this time +my $jobsResponse = $browser->get("$BASEURL/isAllowed"); + +if ( $jobsResponse->is_success ) +{ + my $status = parseJobQueryResponse($jobsResponse->content); + bail("Max jobs reached. The server cannot process your request right now; try again later.", 0) unless $status > 0; +} +else +{ + bail(sprintf("[%d] %s\n", $jobsResponse->code, parseError($jobsResponse->content))); +} + + +###### +# make a temporary input if lists were provided +unless ( defined $INPUTFILE ) +{ + $INPUTFILE = "$TMP/input.homemade"; + open INPF, ">$INPUTFILE" or bail("Error writing to input file."); + + if ( defined $IDLISTFILE ) + { + open IDLIST, "<$IDLISTFILE" or bail("Error reading input file."); + while( ) + { + chomp; + if ( /(\w{5})/ ) + { + print INPF ">PDBID\n$1\n"; + } + } + close IDLIST; + } + + + if ( defined $SEQFASTAFILE ) + { + open FASTA, "<$SEQFASTAFILE" or bail("Error reading input file."); + while( ) + { + chomp; + print INPF "$_\n"; + } + close FASTA; + } + + close INPF; +} + + +###### +# prepare parameters +print STDERR "Preparing parameters for service request...\n"; + +my @parameters = (); +push(@parameters, "fileinput" => ["$INPUTFILE"]); +push(@parameters, "out_type" => $OUTTYPE); + +push(@parameters, "rest_flag" => "1"); +push(@parameters, "cls_flag" => "1"); +push(@parameters, "pre_flag" => "1") if defined $EVALFLAG; +push(@parameters, "noin_flag" => "1") if defined $NOINFLAG; + +push(@parameters, "run_mode" => $RUNMODE); +push(@parameters, "thread_count" => $THREADCOUNT) if $RUNMODE eq "thread"; + + +if ( defined $STRFLAG ) +{ + push(@parameters, "str_flag" => "1"); + push(@parameters, "ash_flag" => "1"); +} +elsif ( defined $SEQFLAG ) +{ + push(@parameters, "seq_flag" => "1"); + push(@parameters, "seq_algorithm" => "fast"); + push(@parameters, "seq_database" => $SEQDATABASE); + push(@parameters, "seq_blastlimit" => $SEQBLASTLIMIT); + push(@parameters, "seq_outputlimit" => $SEQLIMIT); +} +else +{ + push(@parameters, "str_flag" => "1"); + push(@parameters, "ash_flag" => "1"); + push(@parameters, "seq_flag" => "1"); + push(@parameters, "seq_algorithm" => "fast"); + push(@parameters, "seq_database" => $SEQDATABASE); + push(@parameters, "seq_blastlimit" => $SEQBLASTLIMIT); + push(@parameters, "seq_outputlimit" => $SEQLIMIT); +} + + + +###### +# start rest service +print STDERR "Sending service request...\n"; + +# post: running a mafftash job +my $postResponse = $browser->post( $BASEURL, \@parameters, 'Content_Type' => 'form-data' ); +bail(sprintf("[%d] %s\n", $postResponse->code, parseError($postResponse->content))) unless($postResponse->is_success); + + +# get response from post request +my ($status, $seekid) = parseResponse($postResponse->content); + +my $MAXTRIES = 3; +my $STIMER = 5; +my $timer = 0; + +print STDERR "Request sent! Waiting for response...[$seekid]\n"; + +my $checklist = {}; + +# wait for results until it becomes available +while(1) +{ + # sleeps for 5+random, 10+random, 15+random, 20+random, 25+random, 30+random ,,, 60+random, 60+random,,, + $timer = $timer >= 60 ? 60 : $timer+$STIMER; + sleep($timer+int(rand(4))); + + # get: get results for mafftash job + my $getResponse = $browser->get("$BASEURL/$seekid"); + + if ( $getResponse->is_success ) + { + + # get response from get request + ($status, $seekid) = parseResponse($getResponse->content); + next unless ( $status eq "done" ); + + + # if job is finished and ready + print STDERR "Results found!\n"; + my $csfile = "$TMP/checksum"; + my $try1 = 1; + + + while(1) + { + print STDERR "Fetching Results... [Trial $try1]\n"; + + if ( is_success(getstore("$BASEURL/get/$seekid/checksum", $csfile)) && -e $csfile && -s $csfile ) + { + # get response from get request + $checklist = extractchecksum($csfile); + bail("Error retrieving list of compressed files!") unless ( scalar %$checklist > 0 ); + + + foreach my $id ( sort keys %$checklist ) + { + sleep 1; + my $checkfile = "$TMP/$id"; + my $checkid = $checklist->{$id}; + my $try2 = 1; + + while(1) + { + unlink $checkfile if -e $checkfile; + + if ( is_success(getstore("$BASEURL/get/$seekid/$id", $checkfile)) && -e $checkfile && -s $checkfile ) + { + last if $ISWINDOWS; + + my $hashid = getchecksum($checkfile); + #print STDERR "[hashid]$hashid [checkid]$checkid\n"; + + if ($hashid ne "" && $hashid ne $checkid ) + { + #unlink $checkfile if -e $checkfile; + bail("Error retrieving compressed file from server! [Checksum Failed]") if $try2 >= $MAXTRIES; + $try2++; + sleep $STIMER; + } + else + { + last; + } + } + else + { + bail("Error retrieving compressed file from server!") if $try2 >= $MAXTRIES; + $try2++; + sleep $STIMER; + } + } + } + + last; + } + else + { + bail("Error retrieving list of compressed files from server!") if $try1 >= $MAXTRIES; + $try1++; + sleep $STIMER; + } + } + + last; + + } + else + { + bail(sprintf("[%d] %s\n", $getResponse->code, parseError($getResponse->content))); + } + +} + + +# make sure outputs were generated +# decompress +print STDERR "Assembling final results...\n"; + +foreach my $id ( sort keys %$checklist ) +{ + if ( $id =~ /^$seekid\.out(\.str|\.seq)?/ ) + { + bail("Error: Output file corrupted!") unless -e "$TMP/$id"; + appendToFile("$TMP/$id","$OUTPUTFILE".$1); + } +} + +cleanup(); + + + +#################### +#################### + + +sub parseResponse +{ + my $response = shift; + my $status = ""; + my $seekid = ""; + + if ( $response =~ /^([^\s:]+):([^\s:]+)$/ ) + { + $seekid = $1; + $status = $2; + } + + return ($status, $seekid); +} + + +sub parseJobQueryResponse +{ + my $response = shift; + my $jobs = 100; + + if ( $response =~ /^(\d+)$/ ) + { + $jobs = $1; + } + + return $jobs; +} + + +sub extractchecksum +{ + my $infile = shift; + my %dataset = (); + + #open CSUM, "tar -zxf $infile -O|" or return \%dataset; + open CSUM, "<$infile" or return \%dataset; + + while() + { + chomp; + if ( /^(\S+)\s+(\S+)$/ ) + { + $dataset{$2} = $1; + } + } + + close CSUM; + + return \%dataset; +} + + +sub parseError +{ + my $response = shift; + + #"error":"Invalid number of inputs found." + my $errorstr = ( $response =~ /\"error\"\s*:\s*\"([^\"]+)\"/ ) ? $1 : $response; + return $errorstr; +} + + +sub getchecksum +{ + my $infile = shift; + + # md5 binary check + my $MD5BIN = ""; + + if ( -x "/usr/bin/md5sum" ) + { + $MD5BIN = "/usr/bin/md5sum"; + } + elsif ( -x "/sbin/md5" ) + { + $MD5BIN = "/sbin/md5 -q"; + } + + return "" if $MD5BIN eq ""; + + + my $checksum = ""; + open MD5EXE, "$MD5BIN $infile|" or return ""; + + while() + { + if (/^(\S+)\s+(\S+)$/) + { + $checksum = $1; + last; + } + elsif (/^(\S+)$/) + { + $checksum = $1; + last; + } + } + + close MD5EXE; + + return $checksum; + +} + + +sub backticks +{ + my $command = shift; + + `$command`; + return ($? == -1) ? 0 : 1; +} + + +sub bail +{ + my $str = shift; + my $status = shift; + + #0 for success and 1 for error + $status = 1 unless defined; + + print STDERR "$str\n" if defined $str; + + cleanup(); + + exit($status); +} + + +sub cleanup +{ + return if ($TMP eq "" || !-d $TMP); + + opendir(MAINDIR, $TMP); + my @files = readdir(MAINDIR); + closedir(MAINDIR); + + foreach my $file (@files) + { + unlink "$TMP/$file" if -e "$TMP/$file"; + } + + remove_tree($TMP); + +} + + +sub appendToFile +{ + my $inpfile = shift; + my $outfile = shift; + + open INPF, "<$inpfile" or bail("Server Error: Error in reading file."); + open OUTF, ">>$outfile" or bail("Server Error: Error in writing to file."); + + while() + { + print OUTF $_; + } + + close OUTF; + close INPF; +} + + + +sub help +{ + my $str = shift; + + print <<'HELPME'; + +USAGE + ./seekquencer_premafft.pl -inp -out [-str|-seq] + ./seekquencer_premafft.pl -idf -seqf -out [-str|-seq] + + +PARAMETERS + -inp + INFILE is a FASTA-formatted file + PDB entries are written as: + >PDBID + [5-character pdbid+chain] + + While sequence entries are written as: + >[id] + [sequence] + + -idf + IDLISTFILE is a file containing a list of pdbids + pdbids should be a 5-character pdbid + chain + + -seqf + SEQFASTA is a fasta file + entries are written as: + >[id] + [sequence] + + -out + Results are writen to a file named OUTFILE + + -str + Only structures will be collected by Seekquencer + If neither -str nor -seq is set, both structures and sequences will be collected by Seekquencer + + -seq + Only sequences will be collected by Seekquencer + If neither -str nor -seq is set, both structures and sequences will be collected by Seekquencer + + +OPTIONAL PARAMETERS: + -seqd + Search Database for sequence homologs. Default value: uniref100 + + -lim + this sets the maximum number of sequence homologs collected. Default value: 100 + + -blim + this sets the -b and -v value when running blastall. Default value: 100 + + -pre + When -str is set, this will compare all structures against all using pdp-ash + This would ensure that all structures collected are matching + All structures that do not match will be removed + + -noin + When set, inputs will not be included in the output + + -mod + Defines the output format + mafftash (default) will print a mafftash-formatted fasta file + mafftash-split will make 2 files separating the structures (OUTFILE.str) from sequences (OUTFILE.seq) + fasta will print a regular fasta file + + -run + thread will run simultaneous jobs during blast queries (faster but takes more nodes) + normal will run sequential blast queries (slower but takes less nodes) + Default value: normal + + -trd + if -run is defined, this sets the number of parallel jobs to run. Default value: 3 + + +HELPME + + bail($str); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/seq2regtable.c b/mafft/src/mafft-7.487-with-extensions/core/seq2regtable.c new file mode 100644 index 0000000000..58b9cc86ce --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/seq2regtable.c @@ -0,0 +1,88 @@ +#include "mltaln.h" + +#define DEBUG 0 + +char *weboutfile = NULL; + + +void arguments( int argc, char *argv[] ) +{ + int c; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'w': + weboutfile = *++argv; + fprintf( stderr, "weboutfile = %s\n", weboutfile ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + FILE *weboutfp; + int nlenmin; + int isaligned = 0; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( weboutfile ) + { + weboutfp = fopen( weboutfile, "w" ); + if( !weboutfp ) + { + fprintf( stderr, "Cannot open %s\n", weboutfile ); + exit( 1 ); + } + } + + dorp = NOTSPECIFIED; + if( weboutfile ) + { + getnumlen_nogap_outallreg_web( infp, weboutfp, &nlenmin, &isaligned ); + if( isaligned ) fprintf( stdout, "Aligned\n" ); + else fprintf( stdout, "Not aligned\n" ); + } + else + getnumlen_nogap_outallreg( infp, &nlenmin ); + + return( 0 ); + +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/setcore.c b/mafft/src/mafft-7.487-with-extensions/core/setcore.c new file mode 100644 index 0000000000..f01652c692 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/setcore.c @@ -0,0 +1,503 @@ +#include "mltaln.h" + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 1 + +double corethr; +int coreext; + +void arguments( int argc, char *argv[] ) +{ + int c; + + fftkeika = 1; + constraint = 0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'x'; + contin = 0; + scoremtx = 0; + kobetsubunkatsu = 0; + dorp = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + ppenalty_ex = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + corethr = .5; + coreext = 0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; + fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + fastathreshold = atof( *++argv ); + constraint = 2; + fprintf( stderr, "weighti = %f\n", fastathreshold ); + --argc; + goto nextoption; + case 'i': + corethr = atof( *++argv ); + fprintf( stderr, "corethr = %f\n", corethr ); + --argc; + goto nextoption; + case 'm': + fmodel = 1; + break; + case 'c': + coreext = 1; + break; + case 'r': + fmodel = -1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; + case 'R': + fftRepeatStop = 1; + break; + case 'Q': + calledByXced = 1; + break; + case 's': + treemethod = 's'; + break; + case 'x': + treemethod = 'x'; + break; + case 'p': + treemethod = 'p'; + break; + case 'a': + alg = 'a'; + break; + case 'A': + alg = 'A'; + break; + case 'S': + alg = 'S'; + break; + case 'C': + alg = 'C'; + break; + case 'F': + use_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + disp = 1; + break; + case 'o': + outgap = 0; + break; +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'Z': + checkC = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + + + +static void WriteOptions( FILE *fp ) +{ + + if( dorp == 'd' ) fprintf( fp, "DNA\n" ); + else + { + if ( scoremtx == 0 ) fprintf( fp, "JTT %dPAM\n", pamN ); + else if( scoremtx == 1 ) fprintf( fp, "BLOSUM %d\n", nblosum ); + else if( scoremtx == 2 ) fprintf( fp, "M-Y\n" ); + } + fprintf( stderr, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + if( use_fft ) fprintf( fp, "FFT on\n" ); + + fprintf( fp, "tree-base method\n" ); + if( tbrweight == 0 ) fprintf( fp, "unweighted\n" ); + else if( tbrweight == 3 ) fprintf( fp, "clustalw-like weighting\n" ); + if( tbitr || tbweight ) + { + fprintf( fp, "iterate at each step\n" ); + if( tbitr && tbrweight == 0 ) fprintf( fp, " unweighted\n" ); + if( tbitr && tbrweight == 3 ) fprintf( fp, " reversely weighted\n" ); + if( tbweight ) fprintf( fp, " weighted\n" ); + fprintf( fp, "\n" ); + } + + fprintf( fp, "Gap Penalty = %+5.2f, %+5.2f, %+5.2f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 ); + + if( alg == 'a' ) + fprintf( fp, "Algorithm A\n" ); + else if( alg == 'A' ) + fprintf( fp, "Algorithm A+\n" ); + else if( alg == 'S' ) + fprintf( fp, "Apgorithm S\n" ); + else if( alg == 'C' ) + fprintf( fp, "Apgorithm A+/C\n" ); + else + fprintf( fp, "Unknown algorithm\n" ); + + if( treemethod == 'x' ) + fprintf( fp, "Tree = UPGMA (3).\n" ); + else if( treemethod == 's' ) + fprintf( fp, "Tree = UPGMA (2).\n" ); + else if( treemethod == 'p' ) + fprintf( fp, "Tree = UPGMA (1).\n" ); + else + fprintf( fp, "Unknown tree.\n" ); + + if( use_fft ) + { + fprintf( fp, "FFT on\n" ); + if( dorp == 'd' ) + fprintf( fp, "Basis : 4 nucleotides\n" ); + else + { + if( fftscore ) + fprintf( fp, "Basis : Polarity and Volume\n" ); + else + fprintf( fp, "Basis : 20 amino acids\n" ); + } + fprintf( fp, "Threshold of anchors = %d%%\n", fftThreshold ); + fprintf( fp, "window size of anchors = %dsites\n", fftWinSize ); + } + else + fprintf( fp, "FFT off\n" ); + fflush( fp ); +} + + +int main( int argc, char *argv[] ) +{ + static int nlen[M]; + static char **name, **seq; + static char **oseq; + static double **pscore; + static double *eff; + static double **node0, **node1; + static double *gapc; + static double *avgap; + double tmpavgap; + int i, j, m, goffset; + static int ***topol; + static double **len; + FILE *prep; + char c; + int corestart, coreend; + int alloclen; + int winsize; + char *pt, *ot; + double gapmin; + + arguments( argc, argv ); + + getnumlen( stdin ); + rewind( stdin ); + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + seq = AllocateCharMtx( njob, nlenmax*9+1 ); + name = AllocateCharMtx( njob, B+1 ); + oseq = AllocateCharMtx( njob, nlenmax*9+1 ); + alloclen = nlenmax*9; + + topol = AllocateIntCub( njob, 2, njob ); + len = AllocateDoubleMtx( njob, 2 ); + pscore = AllocateDoubleMtx( njob, njob ); + eff = AllocateDoubleVec( njob ); + node0 = AllocateDoubleMtx( njob, njob ); + node1 = AllocateDoubleMtx( njob, njob ); + gapc = AllocateDoubleVec( alloclen ); + avgap = AllocateDoubleVec( alloclen ); + +#if 0 + Read( name, nlen, seq ); +#else + readData_pointer( stdin, name, nlen, seq ); +#endif + + constants( njob, seq ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illeagal character %c\n", c ); + exit( 1 ); + } + + writePre( njob, name, nlen, seq, 0 ); + + if( tbutree == 0 ) + { + for( i=1; i seq[i] ) + if( *pt != '-' ) + { + *ot-- = *pt; + m--; + } + + ot = oseq[i]+winsize+coreend-corestart+1; + pt = seq[i]+coreend; + if( coreext ) m = winsize; + else m = 0; + while( m && *(++pt) ) + { + if( *pt != '-' ) + { + *ot++ = *pt; + m--; + } + } + fprintf( stdout, ">%s\n", name[i] ); + fprintf( stdout, "%s\n", oseq[i] ); + } + + exit( 1 ); + + SHOWVERSION; + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/setdirection.c b/mafft/src/mafft-7.487-with-extensions/core/setdirection.c new file mode 100644 index 0000000000..cd8221a8b0 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/setdirection.c @@ -0,0 +1,213 @@ +#include "mltaln.h" + +#define DEBUG 0 + +char *directionfile; +static int show_R_ = 1; + +static int subalignment; +static int subalignmentoffset; + +void arguments( int argc, char *argv[] ) +{ + int c; + + inputfile = NULL; + directionfile = NULL; + subalignment = 0; + subalignmentoffset = 0; + show_R_ = 1; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'd': + directionfile = *++argv; + fprintf( stderr, "directionfile = %s\n", directionfile ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'H': + subalignment = 1; + subalignmentoffset = myatoi( *++argv ); + --argc; + goto nextoption; + case 'r': + show_R_ = 0; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + FILE *difp; + int nlenmin; + char **name; + char **seq; + char *tmpseq; + char line[100]; + int *nlen; + int i, j; + int nsubalignments, maxmem; + int **subtable = NULL; + int *preservegaps = NULL; + char firstdir; + char *directions; + + arguments( argc, argv ); + + reporterr( "subalignment = %d\n", subalignment ); + reporterr( "subalignmentoffset = %d\n", subalignmentoffset ); + + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( directionfile ) + { + difp = fopen( directionfile, "r" ); + if( !difp ) + { + fprintf( stderr, "Cannot open %s\n", directionfile ); + exit( 1 ); + } + } + else + { + fprintf( stderr, "Give directionfile!\n" ); + } + + + dorp = NOTSPECIFIED; + getnumlen_casepreserve( infp, &nlenmin ); + + fprintf( stderr, "%d x %d - %d %c\n", njob, nlenmax, nlenmin, dorp ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + tmpseq = AllocateCharVec( MAX( B, nlenmax )+1 ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + directions = calloc( njob, sizeof( int ) ); + + readData_pointer_casepreserve( infp, name, nlen, seq ); + + + + + + for( i=0; i-1; i++ ) + { + if( directions[subtable[j][i]] != firstdir ) + { + reporterr( "\n\n#############################################################################\n" ); + reporterr( "\nDirection of nucleotide sequences seems to be inconsistent.\n" ); + reporterr( "Please check the following two sequences:\n" ); + reporterr( " Sequece no.%d (%s)\n", subtable[j][0]+1, name[subtable[j][0]] ); + reporterr( " Sequece no.%d (%s)\n", subtable[j][i]+1, name[subtable[j][i]] ); + reporterr( "\nThese sequences are in sub alignment no.%d in your setting of --merge,\nbut their directions seem to be different.\n\n", j+1 ); + reporterr( "#############################################################################\n\n\n\n" ); + exit( 1 ); + } + } + reporterr( "OK!\n" ); + } + } + + + for( i=0; i%s\n", name[i]+1 ); + fprintf( stdout, "%s\n", seq[i] ); + } + + free( nlen ); + FreeCharMtx( seq ); + FreeCharMtx( name ); + free( tmpseq ); + + return( 0 ); +} diff --git a/mafft/src/mafft-7.487-with-extensions/core/sextet5.c b/mafft/src/mafft-7.487-with-extensions/core/sextet5.c new file mode 100644 index 0000000000..0a734f81a9 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/sextet5.c @@ -0,0 +1,317 @@ +#include "mltaln.h" +#include "mtxutl.h" + +#define DEBUG 0 +#define TEST 0 + +#define END_OF_VEC -1 + + +void arguments( int argc, char *argv[] ) +{ + int c; + + inputfile = NULL; + disopt = 0; + scoremtx = 1; + nblosum = 62; + dorp = NOTSPECIFIED; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'I': + disopt = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: -i\n" ); + exit( 1 ); + } +} + +void seq_grp_nuc( int *grp, char *seq ) +{ + int tmp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 4 ) + *grp++ = tmp; + else + fprintf( stderr, "WARNING : Unknown character %c\n", *(seq-1) ); + } + *grp = END_OF_VEC; +} + +void seq_grp( int *grp, char *seq ) +{ + int tmp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 6 ) + *grp++ = tmp; + else + fprintf( stderr, "WARNING : Unknown character %c\n", *(seq-1) ); + } + *grp = END_OF_VEC; +} + +void makecompositiontable_p( short *table, int *pointt ) +{ + int point; + + while( ( point = *pointt++ ) != END_OF_VEC ) + table[point]++; +} + +static int localcommonsextet_p( short *table, int *pointt ) +{ + int value = 0; + short tmp; + int point; + static short *memo = NULL; + static int *ct = NULL; + static int *cp; + + if( !memo ) + { + memo = (short *)calloc( tsize, sizeof( short ) ); + if( !memo ) ErrorExit( "Cannot allocate memo\n" ); + ct = (int *)calloc( MIN( maxl, tsize)+1, sizeof( int ) ); + if( !ct ) ErrorExit( "Cannot allocate memo\n" ); + } + + cp = ct; + while( ( point = *pointt++ ) != END_OF_VEC ) + { + tmp = memo[point]++; + if( tmp < table[point] ) + value++; + if( tmp == 0 ) *cp++ = point; +// fprintf( stderr, "cp - ct = %d (tsize = %d)\n", cp - ct, tsize ); + } + *cp = END_OF_VEC; + + cp = ct; + while( *cp != END_OF_VEC ) + memo[*cp++] = 0; + + return( value ); +} + +void makepointtable_nuc( int *pointt, int *n ) +{ + int point; + register int *p; + + p = n; + point = *n++ * 1024; + point += *n++ * 256; + point += *n++ * 64; + point += *n++ * 16; + point += *n++ * 4; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 1024; + point *= 4; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +void makepointtable( int *pointt, int *n ) +{ + int point; + register int *p; + + p = n; + point = *n++ * 7776; + point += *n++ * 1296; + point += *n++ * 216; + point += *n++ * 36; + point += *n++ * 6; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 7776; + point *= 6; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +int main( int argc, char **argv ) +{ + int i, j; + FILE *fp, *infp; + char **seq; + int *grpseq; + char *tmpseq; + int **pointt; + static char **name; + static int nlen[M]; + double **mtx; + double **mtx2; + double score, score0; + static short *table1; + char b[B]; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( infp ); +#endif + rewind( infp ); + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + name = AllocateCharMtx( njob, B+1 ); + tmpseq = AllocateCharVec( nlenmax+1 ); + seq = AllocateCharMtx( njob, nlenmax+1 ); + grpseq = AllocateIntVec( nlenmax+1 ); + pointt = AllocateIntMtx( njob, nlenmax+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + mtx2 = AllocateDoubleMtx( njob, njob ); + pamN = NOTSPECIFIED; + +#if 0 + FRead( infp, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); +#endif + + fclose( infp ); + + constants( njob, seq ); + + if( dorp == 'd' ) tsize = (int)pow( 4, 6 ); + else tsize = (int)pow( 6, 6 ); + + maxl = 0; + for( i=0; i maxl ) maxl = nlen[i]; + if( dorp == 'd' ) /* nuc */ + { + seq_grp_nuc( grpseq, tmpseq ); + makepointtable_nuc( pointt[i], grpseq ); + } + else /* amino */ + { + seq_grp( grpseq, tmpseq ); + makepointtable( pointt[i], grpseq ); + } + } + for( i=0; i +#include +#include + +#endif +#define IMA_YONDERU 'x' /* iranai */ +#define IMA_KAITERU 0 /* iranai */ +#define KAKIOWATTA 'w' +#define YOMIOWATTA 'r' +#define OSHIMAI 'd' +#define ISRUNNING 0 +#define SEMAPHORE 1 +#define STATUS 2 + +#define IPC_ALLOC 0100000 diff --git a/mafft/src/mafft-7.487-with-extensions/core/splittbfast.c b/mafft/src/mafft-7.487-with-extensions/core/splittbfast.c new file mode 100644 index 0000000000..6ac47687f8 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/splittbfast.c @@ -0,0 +1,3224 @@ +#include "mltaln.h" + + +#define TREE 1 +#define PICKSIZE 50 // must be >= 3 +#define WEIGHT 0 +#define TOKYORIPARA 0.70 // 0.70 +#define TOKYORIPARA_A 0.70 // changed +#define LENFAC 1 +#define HUKINTOTREE 1 +#define DIANA 0 +#define MAX6DIST 10.0 + +// kouzoutai ni sasareru pointer ha static + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 + +#define END_OF_VEC -1 + +static char *fastapath; +static int doalign; +static int fromaln; +static int uselongest; +static int treeout; +static int classsize; +static int picksize; +static int reorder; +static int pid; +static int maxdepth = 0; +static double tokyoripara; + +#define PLENFACA 0.01 +#define PLENFACB 10000 +#define PLENFACC 10000 +#define PLENFACD 0.1 +#define DLENFACA 0.01 +#define DLENFACB 2500 +#define DLENFACC 2500 +#define DLENFACD 0.1 + +static char datafile[1000]; +static char queryfile[1000]; +static char resultfile[1000]; + +typedef struct _scores +{ + double score; + int selfscore; + int orilen; + int *pointt; + int numinseq; + char *name; +// char *seq; // reallo +// char **seqpt; + int shimon; +} Scores; + +int intcompare( const int *a, const int *b ) +{ + return( *a - *b ); +} + +int lcompare( const Scores *a, const Scores *b ) +{ + if( a->orilen < b->orilen ) return 1; + else if( a->orilen > b->orilen ) return -1; + else return 0; +} + +int dcompare( const Scores *a, const Scores *b ) +{ + if( a->score > b->score ) return 1; + else if( a->score < b->score ) return -1; + else + { + if( a->selfscore < b->selfscore ) return 1; + else if( a->selfscore > b->selfscore ) return -1; + else + { + if( a->orilen < b->orilen ) return 1; + else if( a->orilen > b->orilen ) return -1; + else return 0; + } + } +} + + +static void getfastascoremtx( int **tmpaminodis ) +{ + FILE *qfp; + FILE *dfp; + FILE *rfp; + int i, j; + char aa; + int slen; + int res; + char com[10000]; + static char *tmpseq; + static char *tmpname; + double *resvec; + + if( scoremtx == -1 ) + { + tmpaminodis['a']['a'] = 5; + tmpaminodis['g']['g'] = 5; + tmpaminodis['c']['c'] = 5; + tmpaminodis['t']['t'] = 5; + tmpaminodis['n']['n'] = -1; + + return; + } + + + tmpseq = calloc( 2000, sizeof( char ) ); + tmpname = calloc( B, sizeof( char ) ); + resvec = calloc( 1, sizeof( double ) ); + +// fprintf( stderr, "xformatting .. " ); + dfp = fopen( datafile, "w" ); + if( !dfp ) ErrorExit( "Cannot open datafile." ); + sprintf( tmpname, ">+===========+%d ", 0 ); + strcpy( tmpseq, "AAAAAAXXXXXX" ); + strcat( tmpseq, "CCCCCCXXXXXX" ); + strcat( tmpseq, "DDDDDDXXXXXX" ); + strcat( tmpseq, "EEEEEEXXXXXX" ); + strcat( tmpseq, "FFFFFFXXXXXX" ); + strcat( tmpseq, "GGGGGGXXXXXX" ); + strcat( tmpseq, "HHHHHHXXXXXX" ); + strcat( tmpseq, "IIIIIIXXXXXX" ); + strcat( tmpseq, "KKKKKKXXXXXX" ); + strcat( tmpseq, "LLLLLLXXXXXX" ); + strcat( tmpseq, "MMMMMMXXXXXX" ); + strcat( tmpseq, "NNNNNNXXXXXX" ); + strcat( tmpseq, "PPPPPPXXXXXX" ); + strcat( tmpseq, "QQQQQQXXXXXX" ); + strcat( tmpseq, "RRRRRRXXXXXX" ); + strcat( tmpseq, "SSSSSSXXXXXX" ); + strcat( tmpseq, "TTTTTTXXXXXX" ); + strcat( tmpseq, "VVVVVVXXXXXX" ); + strcat( tmpseq, "WWWWWWXXXXXX" ); + strcat( tmpseq, "YYYYYYXXXXXX" ); + slen = strlen( tmpseq ); + writeData_pointer( dfp, 1, &tmpname, &slen, &tmpseq ); + fclose( dfp ); + fprintf( stderr, "done.\n" ); + + for( i=0; i<20; i++ ) + { + aa = amino[i]; +// fprintf( stderr, "checking %c\n", aa ); + *tmpseq = 0; + sprintf( tmpname, ">+===========+%d ", 0 ); + for( j=0; j<6; j++ ) + sprintf( tmpseq+strlen( tmpseq ), "%c", aa ); + qfp = fopen( queryfile, "w" ); + if( !qfp ) ErrorExit( "Cannot open queryfile." ); + writeData_pointer( qfp, 1, &tmpname, &slen, &tmpseq ); + fclose( qfp ); + + if( scoremtx == -1 ) + sprintf( com, "%s -z3 -m10 -n -Q -H -b%d -E%d -d%d %s %s %d > %s", fastapath, M, M, 0, queryfile, datafile, 6, resultfile ); + else + sprintf( com, "%s -z3 -m10 -p -Q -H -b%d -E%d -d%d %s %s %d > %s", fastapath, M, M, 0, queryfile, datafile, 2, resultfile ); + res = system( com ); + if( res ) + { + fprintf( stderr, "error in %s", fastapath ); + exit( 1 ); + } + + rfp = fopen( resultfile, "r" ); + if( rfp == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + res = ReadFasta34m10_scoreonly( rfp, resvec, 1 ); + fprintf( stderr, "%c: %f\n", 'A'+i, *resvec/6 ); + fclose( rfp ); + if( ( (int)*resvec % 6 ) > 0.0 ) + { + fprintf( stderr, "Error in blast, *resvec=%f\n", *resvec ); + fprintf( stderr, "Error in blast, *resvec/6=%f\n", *resvec/6 ); + exit( 1 ); + } + tmpaminodis[(int)aa][(int)aa] = (int)( *resvec / 6 ); +// fprintf( stderr, "*resvec=%f, tmpaminodis[aa][aa] = %d\n", *resvec, tmpaminodis[aa][aa] ); + } + tmpaminodis['X']['X'] = -1; + free( tmpname ); + free( tmpseq ); + free( resvec ); +} + +#if 0 +static void getblastscoremtx( int **tmpaminodis ) +{ + FILE *qfp; + FILE *dfp; + FILE *rfp; + int i, j; + char aa; + int slen; + int res; + char com[10000]; + static char *tmpseq; + static char *tmpname; + double *resvec; + + if( scoremtx == -1 ) + { + tmpaminodis['a']['a'] = 1; + tmpaminodis['g']['g'] = 1; + tmpaminodis['c']['c'] = 1; + tmpaminodis['t']['t'] = 1; + + return; + } + + + tmpseq = calloc( 2000, sizeof( char ) ); + tmpname = calloc( B, sizeof( char ) ); + resvec = calloc( 1, sizeof( double ) ); + +// fprintf( stderr, "xformatting .. " ); + dfp = fopen( datafile, "w" ); + if( !dfp ) ErrorExit( "Cannot open datafile." ); + sprintf( tmpname, "\0", i ); // BUG!! + strcpy( tmpseq, "AAAAAAXXXXXX" ); + strcat( tmpseq, "CCCCCCXXXXXX" ); + strcat( tmpseq, "DDDDDDXXXXXX" ); + strcat( tmpseq, "EEEEEEXXXXXX" ); + strcat( tmpseq, "FFFFFFXXXXXX" ); + strcat( tmpseq, "GGGGGGXXXXXX" ); + strcat( tmpseq, "HHHHHHXXXXXX" ); + strcat( tmpseq, "IIIIIIXXXXXX" ); + strcat( tmpseq, "KKKKKKXXXXXX" ); + strcat( tmpseq, "LLLLLLXXXXXX" ); + strcat( tmpseq, "MMMMMMXXXXXX" ); + strcat( tmpseq, "NNNNNNXXXXXX" ); + strcat( tmpseq, "PPPPPPXXXXXX" ); + strcat( tmpseq, "QQQQQQXXXXXX" ); + strcat( tmpseq, "RRRRRRXXXXXX" ); + strcat( tmpseq, "SSSSSSXXXXXX" ); + strcat( tmpseq, "TTTTTTXXXXXX" ); + strcat( tmpseq, "VVVVVVXXXXXX" ); + strcat( tmpseq, "WWWWWWXXXXXX" ); + strcat( tmpseq, "YYYYYYXXXXXX" ); + slen = strlen( tmpseq ); + writeData_pointer( dfp, 1, &tmpname, &slen, &tmpseq ); + fclose( dfp ); + if( scoremtx == -1 ) + sprintf( com, "formatdb -p f -i %s -o F", datafile ); + else + sprintf( com, "formatdb -i %s -o F", datafile ); + system( com ); + fprintf( stderr, "done.\n" ); + + for( i=0; i<20; i++ ) + { + aa = amino[i]; + fprintf( stderr, "checking %c\n", aa ); + *tmpseq = 0; + for( j=0; j<6; j++ ) + sprintf( tmpseq+strlen( tmpseq ), "%c", aa ); + qfp = fopen( queryfile, "w" ); + if( !qfp ) ErrorExit( "Cannot open queryfile." ); + writeData_pointer( qfp, 1, &tmpname, &slen, &tmpseq ); + fclose( qfp ); + + sprintf( com, "blastall -b %d -G 10 -E 1 -e 1e10 -p blastp -m 7 -i %s -d %s > %s\0", 1, queryfile, datafile, resultfile ); + res = system( com ); + if( res ) + { + fprintf( stderr, "error in %s", "blastall" ); + exit( 1 ); + } + + rfp = fopen( resultfile, "r" ); + if( rfp == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + res = ReadBlastm7_scoreonly( rfp, resvec, 1 ); + fprintf( stdout, "%c: %f\n", 'A'+i, *resvec/6 ); + fclose( rfp ); + if( ( (int)*resvec % 6 ) > 0.0 ) + { + fprintf( stderr, "Error in blast, *resvec=%f\n", *resvec ); + fprintf( stderr, "Error in blast, *resvec/6=%f\n", *resvec/6 ); + exit( 1 ); + } + tmpaminodis[aa][aa] = (int)( *resvec / 6 ); + } + tmpaminodis['X']['X'] = 0; + free( tmpname ); + free( tmpseq ); + free( resvec ); + +} +#endif + +static double *callfasta( char **seq, Scores *scores, int nin, int *picks, int query, int rewritedata ) +{ + double *val; + FILE *qfp; + FILE *dfp; + FILE *rfp; + int i; + char com[10000]; + static char datafile[1000]; + static char queryfile[1000]; + static char resultfile[1000]; + static int pid; + static char *tmpseq; + static char *tmpname; + int slen; + int res; + static Scores *scoresbk = NULL; + static int ninbk = 0; + + if( pid == 0 ) + { + pid = (int)getpid(); + sprintf( datafile, "/tmp/data-%d", pid ); + sprintf( queryfile, "/tmp/query-%d", pid ); + sprintf( resultfile, "/tmp/fasta-%d", pid ); + + tmpseq = calloc( nlenmax+1, sizeof( char ) ); + tmpname = calloc( B+1, sizeof( char ) ); + } + + val = calloc( nin, sizeof( double ) ); +// fprintf( stderr, "nin=%d, q=%d\n", nin, query ); + + if( rewritedata ) + { + scoresbk = scores; + ninbk = nin; +// fprintf( stderr, "\nformatting .. " ); + dfp = fopen( datafile, "w" ); + if( !dfp ) ErrorExit( "Cannot open datafile." ); + if( picks == NULL ) for( i=0; i+===========+%d ", i ); + slen = scores[i].orilen; + writeData_pointer( dfp, 1, &tmpname, &slen, &tmpseq ); + } + else for( i=0; i+===========+%d ", i ); + slen = scores[picks[i]].orilen; + writeData_pointer( dfp, 1, &tmpname, &slen, &tmpseq ); + } + fclose( dfp ); + } + + + gappick0( tmpseq, seq[scores[query].numinseq] ); + sprintf( tmpname, ">+==========+%d ", 0 ); + slen = scores[query].orilen; + qfp = fopen( queryfile, "w" ); + if( !qfp ) ErrorExit( "Cannot open queryfile." ); + writeData_pointer( qfp, 1, &tmpname, &slen, &tmpseq ); + fclose( qfp ); + +// fprintf( stderr, "calling fasta, nin=%d\n", nin ); + + if( scoremtx == -1 ) + sprintf( com, "%s -z3 -m10 -n -Q -H -b%d -E%d -d%d %s %s %d > %s", fastapath, nin, nin, 0, queryfile, datafile, 6, resultfile ); + else + sprintf( com, "%s -z3 -m10 -p -Q -H -b%d -E%d -d%d %s %s %d > %s", fastapath, nin, nin, 0, queryfile, datafile, 2, resultfile ); + res = system( com ); + if( res ) + { + fprintf( stderr, "error in %s", fastapath ); + exit( 1 ); + } +// fprintf( stderr, "fasta done\n" ); + +//exit( 1 ); + + rfp = fopen( resultfile, "r" ); + if( rfp == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + +// fprintf( stderr, "reading fasta\n" ); + if( scoremtx == -1 ) + res = ReadFasta34m10_scoreonly_nuc( rfp, val, nin ); + else + res = ReadFasta34m10_scoreonly( rfp, val, nin ); +// fprintf( stderr, "done. val[0] = %f\n", val[0] ); + + + fclose( rfp ); + +#if 0 + for( i=0; i %s\0", nin, queryfile, datafile, resultfile ); + else + sprintf( com, "blastall -b %d -G 10 -E 1 -e 1e10 -p blastp -m 7 -i %s -d %s > %s\0", nin, queryfile, datafile, resultfile ); + res = system( com ); + if( res ) ErrorExit( "error in blast" ); + + rfp = fopen( resultfile, "r" ); + if( rfp == NULL ) + ErrorExit( "file 'fasta.$$' does not exist\n" ); + res = ReadBlastm7_scoreonly( rfp, val, nin ); + fclose( rfp ); + +#if 0 + for( i=0; i 0 && (*++argv)[0] == '-' ) + { + while ( ( c = *++argv[0] ) ) + { + switch( c ) + { + case 'p': + picksize = myatoi( *++argv ); + fprintf( stderr, "picksize = %d\n", picksize ); + --argc; + goto nextoption; + case 's': + classsize = myatoi( *++argv ); + fprintf( stderr, "groupsize = %d\n", classsize ); + --argc; + goto nextoption; + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); + fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; + fprintf( stderr, "tm %d\n", pamN ); + --argc; + goto nextoption; + case 'T': + tokyoripara = (double)atof( *++argv ); + --argc; + goto nextoption; + case 'l': + uselongest = 0; + break; + case 'n' : + outnumber = 1; + break; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'S': + doalign = 'f'; + break; + case 'Z': + fromaln = 1; + break; + case 'U': + doalign = 1; + break; + case 'x': + reorder = 0; + break; + case 't': + treeout = 1; + break; + case 'r': + fmodel = -1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'e': + fftscore = 0; + break; + case 'O': + fftNoAnchStop = 1; + break; + case 'L': + legacygapcost = 1; + break; +#if 0 + case 'R': + fftRepeatStop = 1; + break; + case 'Q': + calledByXced = 1; + break; + case 'a': + alg = 'a'; + break; + case 'R': + alg = 'R'; + break; + case 'Q': + alg = 'Q'; + break; +#endif + case 'A': + alg = 'A'; + break; + case 'N': + nevermemsave = 1; + break; + case 'M': + alg = 'M'; + break; + case 'C': + alg = 'C'; + break; + case 'F': + use_fft = 1; + break; + case 'G': + use_fft = 1; + force_fft = 1; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + disp = 1; + break; + case 'o': + outgap = 0; + break; + case 'J': + tbutree = 0; + break; + case 'X': + treemethod = 'X'; // tsukawareteiru ???? + sueff_global = atof( *++argv ); + fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; + case 'E': + treemethod = 'E'; // upg (average) + break; + case 'q': + treemethod = 'q'; // minimum + break; + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case ':': + nwildcard = 1; + break; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + +static int nunknown = 0; + +int seq_grp_nuc( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 4 ) + *grp++ = tmp; + else + nunknown++; + } + *grp = END_OF_VEC; + return( grp-grpbk ); +} + +int seq_grp( int *grp, char *seq ) +{ + int tmp; + int *grpbk = grp; + while( *seq ) + { + tmp = amino_grp[(int)*seq++]; + if( tmp < 6 ) + *grp++ = tmp; + else + nunknown++; + } + *grp = END_OF_VEC; + return( grp-grpbk ); +} + +void makecompositiontable_p( short *table, int *pointt ) +{ + int point; + + while( ( point = *pointt++ ) != END_OF_VEC ) + table[point]++; +} + +static int localcommonsextet_p( short *table, int *pointt ) +{ + int value = 0; + short tmp; + int point; + static short *memo = NULL; + static int *ct = NULL; + static int *cp; + + if( !memo ) + { + memo = (short *)calloc( tsize, sizeof( short ) ); + if( !memo ) ErrorExit( "Cannot allocate memo\n" ); + ct = (int *)calloc( MIN( maxl, tsize )+1, sizeof( int ) ); + if( !ct ) ErrorExit( "Cannot allocate memo\n" ); + } + + cp = ct; + while( ( point = *pointt++ ) != END_OF_VEC ) + { + tmp = memo[point]++; + if( tmp < table[point] ) + value++; + if( tmp == 0 ) *cp++ = point; + } + *cp = END_OF_VEC; + + cp = ct; + while( *cp != END_OF_VEC ) + memo[*cp++] = 0; + + return( value ); +} + +void makepointtable_nuc( int *pointt, int *n ) +{ + int point; + register int *p; + + p = n; + point = *n++ * 1024; + point += *n++ * 256; + point += *n++ * 64; + point += *n++ * 16; + point += *n++ * 4; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 1024; + point *= 4; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +void makepointtable( int *pointt, int *n ) +{ + int point; + register int *p; + + p = n; + point = *n++ * 7776; + point += *n++ * 1296; + point += *n++ * 216; + point += *n++ * 36; + point += *n++ * 6; + point += *n++; + *pointt++ = point; + + while( *n != END_OF_VEC ) + { + point -= *p++ * 7776; + point *= 6; + point += *n++; + *pointt++ = point; + } + *pointt = END_OF_VEC; +} + +#if 1 +static void pairalign( int nseq, int *nlen, char **seq, int *mem1, int *mem2, double *weight, int *alloclen ) +{ + int l, len1, len2; + int clus1, clus2; + double pscore, tscore; + static int *fftlog; + static char *indication1, *indication2; + static double *effarr1 = NULL; + static double *effarr2 = NULL; + static char **mseq1, **mseq2; +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + int m1, m2; +#if 0 + int i, j; +#endif + + + if( effarr1 == NULL ) + { + fftlog = AllocateIntVec( nseq ); + effarr1 = AllocateDoubleVec( nseq ); + effarr2 = AllocateDoubleVec( nseq ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + mseq1 = AllocateCharMtx( nseq, 0 ); + mseq2 = AllocateCharMtx( nseq, 0 ); + for( l=0; l 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); +#endif + +// fprintf( stdout, "mseq1 = %s\n", mseq1[0] ); +// fprintf( stdout, "mseq2 = %s\n", mseq2[0] ); + + if( !nevermemsave && ( alg != 'M' && ( len1 > 10000 || len2 > 10000 ) ) ) + { + fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = 0; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); + else ffttry = 0; + + if( force_fft || ( use_fft && ffttry ) ) + { + fprintf( stderr, "\bf" ); + if( alg == 'M' ) + { + fprintf( stderr, "\bm" ); +// fprintf( stderr, "%d-%d", clus1, clus2 ); + pscore = Falign_udpari_long( NULL, NULL, n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + { +// fprintf( stderr, "%d-%d", clus1, clus2 ); + pscore = Falign( NULL, NULL, n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); + } + } + else + { + fprintf( stderr, "\bd" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + fprintf( stderr, "\bm" ); +// fprintf( stderr, "%d-%d", clus1, clus2 ); + pscore = MSalignmm( n_dis_consweight_multi, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, NULL, NULL, NULL, 0.0, 0.0 ); + break; + case( 'A' ): + if( clus1 == 1 && clus2 == 1 ) + { +// fprintf( stderr, "%d-%d", clus1, clus2 ); + pscore = G__align11( n_dis_consweight_multi, mseq1, mseq2, *alloclen, outgap, outgap ); + } + else + { +// fprintf( stderr, "%d-%d", clus1, clus2 ); + pscore = A__align( n_dis_consweight_multi, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + } + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } +#if SCOREOUT + fprintf( stderr, "score = %10.2f\n", pscore ); +#endif + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + return; +} +#endif + +#if 0 +static void treebase( int nseq, int *nlen, char **aseq, double *eff, int nalign, int ***topol, int *alloclen ) // topol +{ + int i, l; + int nlim; + int clus1, clus2; + + nlim = nalign-1; + for( l=0; l 0 ) +// sprintf( outputfile, "%su%d", outputfile, uniform ); + sprintf( outputfile + strlen(outputfile), "u%d", uniform ); + fprintf( stderr, "GROUP %d: %d member(s) (%d) %s\n", branchid, nin, scores[0].numinseq, outputfile ); + outfp = fopen( outputfile, "w" ); + free( outputfile ); + if( outfp == NULL ) + { + fprintf( stderr, "Cannot open %s\n", outputfile ); + exit( 1 ); + } + for( j=0; jG%d %s\n%s\n", branchid, scores[j].name+1, seq[scores[j].numinseq] ); + fclose( outfp ); +#endif + + +#if TREE + if( treeout ) + { + treelen = 0; + tmptree = calloc( 100, sizeof( char ) ); + for( j=0; j 1 ) + { + *(*tree+1) = '('; + *(*tree+2) = '\0'; + } + else + { + *(*tree+1) = '\0'; + } + for( j=0; j 1 ) strcat( *tree, ")\n" ); + else strcat( *tree, "\n" ); +// fprintf( stdout, "*tree = %s\n", *tree ); + } + +#endif + for( j=0; jselfscore; + belongto = 0; + while( i-- ) + { +// fprintf( stderr, "ptr-scores=%d, numinseq = %d, score = %f\n", ptr-scores, ptr->numinseq+1, ptr->score ); + if( ptr->selfscore > selfscore0 ) + { + selfscore0 = ptr->selfscore; + belongto = ptr-scores; + } + ptr++; + } +#if 1 + if( belongto != 0 ) + { +// fprintf( stderr, "swap %d %s\n<->\n%d %s\n", 0, scores->name, belongto, (scores+belongto)->name ); + ptr = calloc( 1, sizeof( Scores ) ); + *ptr = scores[belongto]; + scores[belongto] = *scores; + *scores = *ptr; + free( ptr ); + } +#endif + } + else + { + qsort( scores, nin, sizeof( Scores ), (int (*)())lcompare ); + belongto = (int)( 0.5 * nin ); +// fprintf( stderr, "lengths = %d, %d, %d\n", scores->orilen, scores[belongto].orilen, scores[nin-1].orilen ); + if( belongto != 0 ) + { +// fprintf( stderr, "swap %d %s\n<->\n%d %s\n", 0, scores->name, belongto, (scores+belongto)->name ); + ptr = calloc( 1, sizeof( Scores ) ); + *ptr = scores[belongto]; + scores[belongto] = *scores; + *scores = *ptr; + free( ptr ); + } + } + + if( qinoya != scores->numinseq ) +// if( 1 || qinoya != scores->numinseq ) + { +// fprintf( stdout, "### scores->numinseq = %d, qinoya=%d, depth=%d\n", scores->numinseq, qinoya, *depthpt ); + + + if( doalign ) + { + if( doalign == 'f' ) + { + blastresults = callfasta( seq, scores, nin, NULL, 0, 1 ); + if( scores->selfscore != (int)blastresults[0] ) + { + fprintf( stderr, "\n\nWARNING1: selfscore\n" ); + fprintf( stderr, "scores->numinseq = %d\n", scores->numinseq+1 ); + fprintf( stderr, "scores->orilen = %d\n", scores->orilen ); + fprintf( stderr, "scores->selfscore = %d, but blastresults[0] = %f\n", scores->selfscore, blastresults[0] ); +// if( abs( scores->selfscore - (int)blastresults[0] ) > 2 ) +// exit( 1 ); +// scores->selfscore = (int)blastresults[0]; //iinoka? + +// exit( 1 ); + } + } + else + gappick0( mseq1[0], seq[scores->numinseq] ); + } + else + { + table1 = (short *)calloc( tsize, sizeof( short ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + makecompositiontable_p( table1, scores[0].pointt ); + } + + selfscore0 = scores[0].selfscore; + for( i=0; iorilen > scores[i].orilen ) + { + longer = (double)scores->orilen; + shorter = (double)scores[i].orilen; + } + else + { + longer = (double)scores[i].orilen; // nai + shorter = (double)scores->orilen; //nai + } + +#if LENFAC + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// lenfac = 1.0 / ( (double)LENFACA + (double)LENFACB / ( (double)longer + (double)LENFACC ) + (double)shorter / (double)longer * LENFACD ); +// fprintf( stderr, "lenfac = %f l=%d,%d\n", lenfac,scores->orilen, scores[i].orilen ); +#else + lenfac = 1.0; +#endif + + if( doalign ) + { + if( doalign == 'f' ) + { + scores[i].score = ( 1.0 - blastresults[i] / MIN( scores->selfscore, scores[i].selfscore ) ) * 1; + if( scores[i].score < 0.0 ) scores[i].score = 0.0; + } + else + { + if( fromaln ) + { +// scores[i].score = ( 1.0 - (double)G__align11_noalign( n_disLN, mseq1, mseq2, palloclen ) / MIN( selfscore0, scores[i].selfscore ) ) * 1; + scores[i].score = ( 1.0 - (double)naivepairscore11( orialn[scores[i].numinseq], orialn[scores->numinseq], penalty ) / MIN( selfscore0, scores[i].selfscore ) ) * 1; + } + else + { + if( *depthpt == 0 ) fprintf( stderr, "\r%d / %d ", i, nin ); + gappick0( mseq2[0], seq[scores[i].numinseq] ); +// fprintf( stdout, "### before calc scores[%d] = %f (%c)\n", i, scores[i].score, qinoya == scores->numinseq?'o':'x' ); + scores[i].score = ( 1.0 - (double)G__align11_noalign( n_disLN, -1200, -60, mseq1, mseq2, palloclen ) / MIN( selfscore0, scores[i].selfscore ) ) * 1; +// fprintf( stderr, "scores[i] = %f\n", scores[i].score ); +// fprintf( stderr, "m1=%s\n", seq[scores[0].numinseq] ); +// fprintf( stderr, "m2=%s\n", seq[scores[i].numinseq] ); +// fprintf( stdout, "### before calc scores[%d] = %f (%c)\n", i, scores[i].score, qinoya == scores->numinseq?'o':'x' ); + } + } + } + else + { + scores[i].score = ( 1.0 - (double)localcommonsextet_p( table1, scores[i].pointt ) / MIN( selfscore0, scores[i].selfscore ) ) * lenfac; + if( scores[i].score > MAX6DIST ) scores[i].score = MAX6DIST; + } +// if( i ) fprintf( stderr, "%d-%d d %4.2f len %d %d\n", 1, i+1, scores[i].score, scores->orilen, scores[i].orilen ); + } + if( doalign == 'f' ) free( blastresults ); + if( doalign == 0 ) free( table1 ); +//exit( 1 ); + } + +// fprintf( stderr, "sorting .. " ); + qsort( scores, nin, sizeof( Scores ), (int (*)())dcompare ); +// fprintf( stderr, "done.\n" ); + + + maxdist = scores[nin-1].score; + if( fromaln ) // kanzen itch ga misalign sareteiru kamoshirenai. + { + if( scores[0].shimon == scores[nin-1].shimon && !strcmp( seq[scores[0].numinseq], seq[scores[nin-1].numinseq] ) ) + { + maxdist = 0.0; + } +// fprintf( stderr, "maxdist?? = %f, nin=%d, %d inori\n", scores[nin-1].score, nin, scores[nin-1].numinseq+1 ); + } + +// fprintf( stderr, "maxdist? = %f, nin=%d\n", scores[nin-1].score, nin ); + + if( nin == 1 ) fprintf( stderr, "nin=1, scores[0].score = %f\n", scores[0].score ); + +// kokoni if( nin < 2 || ... ) + + picks = AllocateIntVec( nin+1 ); + s_p_map = AllocateIntVec( nin+1 ); + s_y_map = AllocateIntVec( nin+1 ); + pickkouho = AllocateIntVec( nin+1 ); + closeh = AllocateIntVec( nin+1 ); + +// nkouho = getkouho( pickkouho, (picksize+100)/nin, nin, scores, seq ); +// nkouho = getkouho( pickkouho, 1.0, nin, scores, seq ); // zenbu +// fprintf( stderr, "selecting kouhos phase 2\n" ); +// if( nkouho == 0 ) +// { +// fprintf( stderr, "selecting kouhos, phase 2\n" ); +// nkouho = getkouho( pickkouho, 1.0, nin, scores, seq ); +// } +// fprintf( stderr, "\ndone\n\n" ); + for( i=0; i 0 ) + { +// fprintf( stderr, "pickkouho[0] = %d\n", pickkouho[0] ); +// fprintf( stderr, "pickkouho[nin-1] = %d\n", pickkouho[nin-1] ); + picktmp = pickkouho[nkouho-1]; +// fprintf( stderr, "\nMOST DISTANT kouho=%d, nin=%d, nkouho=%d\n", picktmp, nin, nkouho ); + nkouho--; + if( ( scores[picktmp].shimon == scores[0].shimon ) && ( !strcmp( seq[scores[0].numinseq], seq[scores[picktmp].numinseq] ) ) ) + { +// fprintf( stderr, "known, j=%d (%d inori)\n", 0, scores[picks[0]].numinseq ); +// fprintf( stderr, "%s\n%s\n", seq[scores[picktmp].numinseq], seq[scores[picks[0]].numinseq] ); + ; + } + else + { + *iptr++ = picktmp; + npick++; +// fprintf( stderr, "ok, %dth pick = %d (%d inori)\n", npick, picktmp, scores[picktmp].numinseq ); + } + } + i = 1; + while( npick0 ) + { + if( i ) + { + i = 0; + rn = nkouho * 0.5; +// fprintf( stderr, "rn = %d\n", rn ); + } + else + { + rn = rnd() * (nkouho); + } + picktmp = pickkouho[rn]; +// fprintf( stderr, "rn=%d/%d (%d inori), kouho=%d, nin=%d, nkouho=%d\n", rn, nkouho, scores[pickkouho[rn]].numinseq, pickkouho[rn], nin, nkouho ); + +// fprintf( stderr, "#kouho before swap\n" ); +// for( i=0; i 2 ) +// exit( 1 ); +// scores->selfscore = (int)blastresults[0]; //iinoka? + } + } + else + gappick0( mseq1[0], seq[scores[picks[j]].numinseq] ); + } + else + { + table1 = (short *)calloc( tsize, sizeof( short ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + makecompositiontable_p( table1, scores[picks[j]].pointt ); + } + + selfscore0 = scores[picks[j]].selfscore; + pickmtx[j][0] = 0.0; + for( i=j+1; i scores[picks[i]].orilen ) + { + longer = (double)scores[picks[j]].orilen; + shorter = (double)scores[picks[i]].orilen; + } + else + { + longer = (double)scores[picks[i]].orilen; + shorter = (double)scores[picks[j]].orilen; + } + + #if LENFAC + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); + // lenfac = 1.0 / ( (double)LENFACA + (double)LENFACB / ( (double)longer + (double)LENFACC ) + (double)shorter / (double)longer * LENFACD ); + // fprintf( stderr, "lenfac = %f l=%d,%d\n", lenfac,scores->orilen, scores[i].orilen ); + #else + lenfac = 1.0; + #endif + + if( doalign ) + { + if( doalign == 'f' ) + { + pickmtx[j][i-j] = ( 1.0 - blastresults[i] / MIN( selfscore0, scores[picks[i]].selfscore ) ) * 1; + if( pickmtx[j][i-j] < 0.0 ) pickmtx[j][i-j] = 0.0; + } + else + { + if( fromaln ) + { + fprintf( stderr, "%d-%d/%d\r", j, i, npick ); + pickmtx[j][i-j] = ( 1.0 - (double)naivepairscore11( orialn[scores[picks[i]].numinseq], orialn[scores[picks[j]].numinseq], penalty ) / MIN( selfscore0, scores[picks[i]].selfscore ) ) * 1; + } + else + { +// fprintf( stderr, "\r%d / %d ", i, nin ); + gappick0( mseq2[0], seq[scores[picks[i]].numinseq] ); + pickmtx[j][i-j] = ( 1.0 - (double)G__align11_noalign( n_disLN, -1200, -60, mseq1, mseq2, palloclen ) / MIN( selfscore0, scores[picks[i]].selfscore ) ) * 1; + // fprintf( stderr, "scores[picks[i]] = %f\n", scores[picks[i]].score ); + } + } + } + else + { + pickmtx[j][i-j] = ( 1.0 - (double)localcommonsextet_p( table1, scores[picks[i]].pointt ) / MIN( selfscore0, scores[picks[i]].selfscore ) ) * lenfac; + if( pickmtx[j][i-j] > MAX6DIST ) pickmtx[j][i-j] = MAX6DIST; + } + + } + if( doalign == 'f' ) free( blastresults ); + if( doalign == 0 ) free( table1 ); + } + + dfromcp = AllocateDoubleMtx( npick, nin ); + dfromc = AllocateDoubleMtx( npick, 0 ); + + for( i=0; i 2 ) + { + double avdist; + double avdist1; + double avdist2; + double maxavdist; + int splinter; + int count; + int dochokoho; + splinter = 0; + int *docholist; + int *docholistbk; + maxavdist = 0.0; + for( i=0; i 1 ) + { + nyuko = 2; + yukos[0] = picks[0]; yukos[1] = picks[1]; + closeh[picks[0]] = yukos[0]; + closeh[picks[1]] = yukos[1]; + } + else + { + nyuko = 1; + yukos[0] = picks[0]; + closeh[picks[0]] = yukos[0]; + } +#elif HUKINTOTREE + if( npick > 2 ) + { +#if 0 + double avdist; + double maxavdist; + int count; + int splinter; + maxavdist = 0.0; + splinter=0; + for( i=0; i, npick=%d members = \n", npick ); +// for( i=0; i %d, because %f < %f\n", p_o_map[j]+1, p_o_map[i]+1, pickmtx[i][j-i], kijun ); +#if 0 + if( scores[picks[i]].orilen > scores[picks[j]].orilen ) + { + fprintf( stderr, "%d => %d\n", p_o_map[j]+1, p_o_map[i]+1 ); + tsukau[j] = 0; + } + else + { + fprintf( stderr, "%d => %d\n", p_o_map[i]+1, p_o_map[j]+1 ); + tsukau[i] = 0; + } + if( 0 && j == npick-1 ) tsukau[i] = 0; + else tsukau[j] = 0; + fprintf( stderr, "tsukau[%d] = %d (%d inori)\n", j, tsukau[j], p_o_map[j]+1 ); +#else + tsukau[j] = 0; + closeh[picks[j]] = closeh[picks[i]]; +// fprintf( stderr, "%d => tsukawanai\n", j ); +#endif + } + } + } + } + for( ii=0,i=0; i yukomtx[i][j-i] ) + minscoreinpick[i] = yukomtx[i][j-i]; + } + for( j=0; j yukomtx[j][i-j] ) + minscoreinpick[i] = yukomtx[j][i-j]; + } + fprintf( stderr, "minscoreinpick[%d(%dinori)] = %f\n", i, y_o_map[i]+1, minscoreinpick[i] ); + } +#endif + + +#if TREE + if( treeout ) + { + children = calloc( nyuko+1, sizeof( char * ) ); + for( i=0; iselfscore ); +// fprintf( stderr, "seq[%d] = scores->seq = \n%s\n", scores->numinseq, seq[scores->numinseq] ); + + uniform = -1; + for( j=0; j scores[j].orilen ) + { + longer = scores[yukos[i]].orilen; + shorter = scores[j].orilen; + } + else + { + shorter = scores[yukos[i]].orilen; + longer = scores[j].orilen; + } + +#if LENFAC +// lenfac = 1.0 / ( (double)LENFACA + (double)LENFACB / ( (double)longer + (double)LENFACC ) + (double)shorter / (double)longer * LENFACD ); + lenfac = 1.0 / ( shorter / longer * lenfacd + lenfacb / ( longer + lenfacc ) + lenfaca ); +// lenfac = 1.0 / ( shorter / longer * LENFACD + LENFACB / ( longer + LENFACC ) + LENFACA ); +// fprintf( stderr, "lenfac = %f, l=%d, %d\n", lenfac, scores[yukos[i]].orilen, scores[j].orilen ); +#else + lenfac = 1.0; +#endif +#if 0 // iihazu -> dame + ii = s_y_map[j]; jj=s_y_map[yukos[i]]; + if( ii != -1 && jj != -1 ) + { + if( dfromc[ii][yukos[jj]] != -0.5 ) + { + dfromc[i][j] = dfromc[ii][yukos[jj]]; + } + else + { + if( ii > jj ) + { + kk = jj; + jj = ii; + ii = kk; + } + dfromc[ii][yukos[jj]] = + dfromc[i][j] = yukomtx[ii][jj-ii]; + } + } + else +#else + if( dfromc[i][j] == -0.5 ) +#endif + { + if( doalign ) + { + if( doalign == 'f' ) + { + dfromc[i][j] = + ( 1.0 - blastresults[j] / MIN( selfscore0, scores[j].selfscore ) ) * 1; + if( dfromc[i][j] < 0.0 ) dfromc[i][j] = 0.0; + } + else + { + if( fromaln ) + { + dfromc[i][j] = ( 1.0 - (double)naivepairscore11( orialn[scores[j].numinseq], orialn[scores[yukos[i]].numinseq], penalty ) / MIN( selfscore0, scores[j].selfscore ) ) * 1; + } + else + { + gappick0( mseq2[0], seq[scores[j].numinseq] ); + dfromc[i][j] = ( 1.0 - (double)G__align11_noalign( n_disLN, -1200, -60, mseq1, mseq2, palloclen ) / MIN( selfscore0, scores[j].selfscore ) ) * 1; + } + } + } + else + { + dfromc[i][j] = ( 1.0 - (double)localcommonsextet_p( table1, scores[j].pointt ) / MIN( selfscore0, scores[j].selfscore ) ) * lenfac; + if( dfromc[i][j] > MAX6DIST ) dfromc[i][j] = MAX6DIST; + } + } +// fprintf( stderr, "i,j=%d,%d (%d,%d)/ %d,%d, dfromc[][]=%f \n", i, j, scores[yukos[i]].numinseq+1, scores[j].numinseq+1, nyuko, nin, dfromc[i][j] ); + +// if( i == 1 ) +// fprintf( stdout, "&&& dfromc[%d][%d] (%d,%d) = %f\n", i, j, p_o_map[i], scores[j].numinseq, dfromc[i][j] ); + } +// fprintf( stderr, "i=%d, freeing\n", i ); + if( !doalign ) free( table1 ); + if( doalign && doalign == 'f' ) free( blastresults ); + } + fprintf( stderr, " \r" ); + + + + + for( i=0; iselfscore, scores->orilen, scores[nin-1].orilen, nin ); + for( j=0; j%d(%dinori)\n", j, scores[j].numinseq+1, belongto, y_o_map[belongto]+1 ); + } + else +// if( belongto == -1 ) +#else + belongto = s_y_map[j]; + if( belongto == -1 ) +#endif + { + belongto = 0; // default ha horyu + minscore = dfromc[0][j]; + for( i=0; i ( minscoreinpick[yukos[i]] + minscoreinpick[j] ) * 1.0 ) +// if( rnd() < 0.5 ) // CHUUI !!!!! + { +// fprintf( stderr, "yuko-%d (%d in ori) to score-%d (%d inori) ha tikai, %f>%f\n", i, y_o_map[i]+1, j, scores[j].numinseq+1, minscore, dfromc[i][j] ); + minscore = dfromc[i][j]; + belongto = i; + } + } + } +#if 0 + if( dfromc[belongto][j] > minscoreinpick[belongto] ) + { + fprintf( stderr, "dame, %f > %f\n", dfromc[belongto][j], minscoreinpick[belongto] ); + belongto = npick; + } + else + fprintf( stderr, "ok, %f < %f\n", dfromc[belongto][j], minscoreinpick[belongto] ); +#endif +// fprintf( stderr, "j=%d (%d inori) -> %d (%d inori) d=%f\n", j, scores[j].numinseq+1, belongto, y_o_map[belongto]+1, dfromc[belongto][j] ); +// fprintf( stderr, "numin = %d\n", numin[belongto] ); + outs[belongto] = realloc( outs[belongto], sizeof( Scores ) * ( numin[belongto] + 1 ) ); + outs[belongto][numin[belongto]] = scores[j]; + numin[belongto]++; + + } + free( dfromcp ); + FreeDoubleMtx( dfromc ); + +// fprintf( stderr, "##### npick = %d\n", npick ); +// fprintf( stderr, "##### nyuko = %d\n", nyuko ); + + + if( nyuko > 2 ) + { + fprintf( stderr, "upgma " ); +// veryfastsupg_double_realloc_nobk_halfmtx( nyuko, yukomtx, topol, len ); + fixed_musclesupg_double_realloc_nobk_halfmtx( nyuko, yukomtx, topol, len, NULL, 1, 1 ); + fprintf( stderr, "\r \r" ); + } + else + { + topol[0][0] = (int *)realloc( topol[0][0], 2 * sizeof( int ) ); + topol[0][1] = (int *)realloc( topol[0][1], 2 * sizeof( int ) ); + topol[0][0][0] = 0; + topol[0][0][1] = -1; + topol[0][1][0] = 1; + topol[0][1][1] = -1; + } + FreeFloatHalfMtx( yukomtx, npick ); + +#if 0 + ii = nyuko-1; + fprintf( stderr, "nyuko = %d, topol[][] = \n", nyuko ); + for( j=0; j 1 ) + { + fprintf( stderr, "\ncalling a child, pick%d (%d inori): # of mem=%d\n", i, p_o_map[ii]+1, numin[ii] ); + for( j=0; jnuminseq ); + } + + + for( i=0; i= classsize || !aligned ) + val = 0; + else + val = 1; + + if( nyuko > 1 ) + { + int *mem1p, *mem2p; + int mem1size, mem2size; + int v1 = 0, v2 = 0, v3 = 0; + int nlim; + int l; + static int *mem1 = NULL; + static int *mem2 = NULL; + char **parttree = NULL; // by Mathog + +#if TREE + if( treeout ) + { + parttree = (char **)calloc( nyuko, sizeof( char * ) ); + for( i=0; inuminseq; + } + } + *mptr = -1; + + mem2p = topol[l][1]; + mptr = mem2; + mem2size = 0; + while( *mem2p != -1 ) + { +// fprintf( stderr, "*mem2p = %d (%d inori), numin[]=%d\n", *mem2p, p_o_map[*mem2p], numin[*mem2p] ); + i = numin[*mem2p]; ptr = outs[*(mem2p++)]; + mem2size += i; + while( i-- ) + { + *mptr++ = (ptr++)->numinseq; + } + } + *mptr = -1; + + qsort( mem1, mem1size, sizeof( int ), (int (*)())intcompare ); + qsort( mem2, mem2size, sizeof( int ), (int (*)())intcompare ); +// selhead( mem1, numin[0] ); +// selhead( mem2, numin[1] ); + + +#if 0 + fprintf( stderr, "\n" ); + fprintf( stderr, "mem1 (nin=%d) = \n", nin ); + for( i=0; ; i++ ) + { + fprintf( stderr, "%d ", mem1[i]+1 ); + if( mem1[i] == -1 ) break; + } + fprintf( stderr, "\n" ); + fprintf( stderr, "mem2 (nin=%d) = \n", nin ); + for( i=0; ; i++ ) + { + fprintf( stderr, "%d ", mem2[i]+1 ); + if( mem2[i] == -1 ) break; + } + fprintf( stderr, "\n" ); +#endif + +#if 0 + fprintf( stderr, "before pairalign, l = %d, nyuko=%d, mem1size=%d, mem2size=%d\n", l, nyuko, mem1size, mem2size ); + fprintf( stderr, "before alignment\n" ); + for( j=0; j v2 ) + { + v3 = v1; + v1 = v2; + v2 = v3; + } +// fprintf( stderr, "nyuko=%d, v1=%d, v2=%d after sort\n", nyuko, v1, v2 ); +// fprintf( stderr, "nyuko=%d, v1=%d, v2=%d\n", nyuko, v1, v2 ); +// fprintf( stderr, "v1=%d, v2=%d, parttree[v1]=%s, parttree[v2]=%s\n", v1, v2, parttree[v1], parttree[v2] ); + sprintf( *tree, "(%s,%s)", parttree[v1], parttree[v2] ); + strcpy( parttree[v1], *tree ); +// fprintf( stderr, "parttree[%d] = %s\n", v1, parttree[v1] ); +// fprintf( stderr, "*tree = %s\n", *tree ); + free( parttree[v2] ); parttree[v2] = NULL; + } +#endif + +#if 0 + fprintf( stderr, "after alignment\n" ); + for( j=0; j maxdepth ) maxdepth = *depthpt; + (*depthpt)++; + } + } + else + { +#if TREE + if( treeout ) + { + sprintf( *tree, "%s", children[0] ); + free( children[0] ); + free( children ); + } +#endif + } + for( i=0; i njob ) + tokyoripara = 0.0; + + + alloclen = nlenmax * 2; + name = AllocateCharMtx( njob, B+1 ); + + if( classsize == 1 ) + seq = AllocateCharMtx( njob, 0 ); + else + seq = AllocateCharMtx( njob, alloclen+1 ); + + + nlen = AllocateIntVec( njob ); + tmpseq = calloc( nlenmax+1, sizeof( char ) ); + pointt = AllocateIntMtx( njob, 0 ); + grpseq = AllocateIntVec( nlenmax + 1 ); + order = (int *)calloc( njob + 1, sizeof( int ) ); + whichgroup = (int *)calloc( njob, sizeof( int ) ); + weight = (double *)calloc( njob, sizeof( double ) ); + + fprintf( stderr, "alloclen = %d in main\n", alloclen ); + + for( i=0; i maxl ) maxl = nlen[i]; + if( dorp == 'd' ) /* nuc */ + { + if( seq_grp_nuc( grpseq, tmpseq ) < 6 ) + { + fprintf( stderr, "Seq %d, too short.\n", i+1 ); + fprintf( stderr, "name = %s\n", name[i] ); + fprintf( stderr, "seq = %s\n", seq[i] ); + exit( 1 ); +// continue; + } + makepointtable_nuc( pointt[i], grpseq ); + } + else /* amino */ + { + if( seq_grp( grpseq, tmpseq ) < 6 ) + { + fprintf( stderr, "Seq %d, too short.\n", i+1 ); + fprintf( stderr, "name = %s\n", name[i] ); + fprintf( stderr, "seq = %s\n", seq[i] ); + exit( 1 ); +// continue; + } + makepointtable( pointt[i], grpseq ); + } +// fprintf( stdout, ">%s\n", name[i] ); +// fprintf( stdout, "%s\n", seq[i] ); + } + if( nunknown ) fprintf( stderr, "\nThere are %d ambiguous characters\n", nunknown ); +// exit( 1 ); + +#if 0 + fprintf( stderr, "params = %d, %d, %d\n", penalty, penalty_ex, offset ); +#endif + + initSignalSM(); + + initFiles(); + + WriteOptions( trap_g ); + + c = seqcheck( seq ); + if( c ) + { + fprintf( stderr, "Illeagal character %c\n", c ); + exit( 1 ); + } + + pid = (int)getpid(); + sprintf( datafile, "/tmp/data-%d", pid ); + sprintf( queryfile, "/tmp/query-%d", pid ); + sprintf( resultfile, "/tmp/fasta-%d", pid ); + + scores = (Scores *)calloc( njob, sizeof( Scores ) ); + +// fprintf( stderr, "\nCalculating i-i scores ... \n" ); + for( i=0; iselfscore = %d\n", i, scores[i].selfscore ); + free( blastresults ); +#else + pscore = 0; + if( scoremtx == -1 ) + { + st = 1; + en = 0; + for( pt=seq[i]; *pt; pt++ ) + { + if( *pt == 'u' ) *pt = 't'; + aan = amino_n[(int)*pt]; + if( aan<0 || aan >= 4 ) *pt = 'n'; + + if( *pt == 'n' ) + { + en++; + if( st ) continue; + else pscore += tmpaminodis[(int)*pt][(int)*pt]; + } + else + { + st = 0; + en = 0; + pscore += tmpaminodis[(int)*pt][(int)*pt]; + } + } + scores[i].selfscore = pscore - en * tmpaminodis['n']['n']; + } + else + { + st = 1; + en = 0; + for( pt=seq[i]; *pt; pt++ ) + { + aan = amino_n[(int)*pt]; + if( aan<0 || aan >= 20 ) *pt = 'X'; + if( *pt == 'X' ) + { + en++; + if( st ) continue; + else pscore += tmpaminodis[(int)*pt][(int)*pt]; + } + else + { + st = 0; + en = 0; + pscore += tmpaminodis[(int)*pt][(int)*pt]; + } + } + scores[i].selfscore = pscore - en * tmpaminodis['X']['X']; + } +#endif + } + else + { + pscore = 0; + for( pt=seq[i]; *pt; pt++ ) + { +// pscore += amino_dis[(int)*pt][(int)*pt]; + pscore += amino_dis[(int)*pt][(int)*pt]; + } + scores[i].selfscore = pscore; + } +// fprintf( stderr, "selfscore[%d] = %d\n", i+1, scores[i].selfscore ); + } + else + { + table1 = (short *)calloc( tsize, sizeof( short ) ); + if( !table1 ) ErrorExit( "Cannot allocate table1\n" ); + makecompositiontable_p( table1, pointt[i] ); + scores[i].selfscore = localcommonsextet_p( table1, pointt[i] ); + free( table1 ); + } + } + if( tmpaminodis ) FreeIntMtx( tmpaminodis ); + + depth = 0; +#if TREE + if( treeout ) + { + tree = (char **)calloc( 1, sizeof( char *) ); + *tree = NULL; +// splitseq_bin( scores, njob, nlen, seq, name, inputfile, 0, tree, &alloclen, order, whichgroup, weight ); + completed = splitseq_mq( scores, njob, nlen, seq, orialn, name, inputfile, 0, tree, &alloclen, order, whichgroup, weight, &depth, -1 ); + treefile = (char *)calloc( strlen( inputfile ) + 10, sizeof( char ) ); + if( inputfile ) + sprintf( treefile, "%s.tree", inputfile ); + else + sprintf( treefile, "splittbfast.tree" ); + treefp = fopen( treefile, "w" ); + fprintf( treefp, "%s\n", *tree ); + fclose( treefp ); + } + else + completed = splitseq_mq( scores, njob, nlen, seq, orialn, name, inputfile, 0, tree, &alloclen, order, whichgroup, weight, &depth, -1 ); +#else + completed = splitseq_mq( scores, njob, nlen, seq, orialn, name, inputfile, 0, tree, &alloclen, order, whichgroup, weight, &depth, -1 ); +#endif + + fprintf( stderr, "\nDone.\n\n" ); + +#if 1 + groupnum = 0; + groupid = -1; + paramem = NULL; + npara = 0; + for( i=0; i 1 && classsize > 2 ) + { + qsort( paramem, npara, sizeof( int ), (int (*)(const void *, const void*))intcompare ); +// selhead( paramem, npara ); + alignparaphiles( njob, nlen, weight, seq, npara, paramem, &alloclen ); + } + free( paramem ); paramem = NULL; npara = 0; + } + sprintf( tmpname, "Group-%d %s", groupnum, name[pos]+1 ); + } + else + { + paramem = realloc( paramem, sizeof( int) * ( npara + 2 ) ); + paramem[npara++] = pos; + sprintf( tmpname, "Group-para %s", name[pos]+1 ); + } + tmpname[B-1] = 0; + if( classsize > 1 && classsize <= njob ) + strcpy( name[pos]+1, tmpname ); + } + if( paramem ) + { + paramem[npara] = -1; + if( npara > 1 && classsize > 2 ) + { + qsort( paramem, npara, sizeof( int ), (int (*)(const void *, const void*))intcompare ); +// selhead( paramem, npara ); + alignparaphiles( njob, nlen, weight, seq, npara, paramem, &alloclen ); + } + free( paramem ); paramem = NULL; npara = 0; + } +#else + for( i=0; i 1 ) + { + fprintf( stderr, "\n\n" ); + fprintf( stderr, "----------------------------------------------------------------------------\n" ); + fprintf( stderr, "\n" ); + fprintf( stderr, "groupsize = %d, picksize=%d\n", classsize, picksize ); + fprintf( stderr, "The input sequences have been classified into %d groups + some paraphyletic groups\n", groupnum ); + fprintf( stderr, "Note that the alignment is not completed.\n" ); + if( reorder ) + fprintf( stderr, "The order of sequences has been changed according to estimated similarity.\n" ); +#if TREE + if( treeout ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "A guide tree is in the '%s' file.\n", treefile ); + } +// else +// { +// fprintf( stderr, "To output guide tree,\n" ); +// fprintf( stderr, "%% %s -t -i %s\n", progName( argv[0] ), "inputfile" ); +// } +#endif + if( !doalign ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "mafft --dpparttree might give a better result, although slow.\n" ); + fprintf( stderr, "mafft --fastaparttree is also available if you have fasta34.\n" ); + } + fprintf( stderr, "\n" ); + fprintf( stderr, "----------------------------------------------------------------------------\n" ); + } + else + { + fprintf( stderr, "\n\n" ); + fprintf( stderr, "----------------------------------------------------------------------------\n" ); + fprintf( stderr, "\n" ); + fprintf( stderr, "nseq = %d\n", njob ); + fprintf( stderr, "groupsize = %d, partsize=%d\n", classsize, picksize ); +// fprintf( stderr, "A single alignment containing all the input sequences has been computed.\n" ); +// fprintf( stderr, "If the sequences are highly diverged and you feel there are too many gaps,\n" ); +// fprintf( stderr, "please try \n" ); +// fprintf( stderr, "%% mafft --parttree --groupsize 100 inputfile\n" ); +// fprintf( stderr, "which classifies the sequences into several groups with <~ 100 sequences\n" ); +// fprintf( stderr, "and performs only intra-group alignments.\n" ); + if( reorder ) + fprintf( stderr, "The order of sequences has been changed according to estimated similarity.\n" ); +#if TREE + if( treeout ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "A guide tree is in the '%s' file.\n", treefile ); + } +// else +// { +// fprintf( stderr, "To output guide tree,\n" ); +// fprintf( stderr, "%% %s -t -i %s\n", progName( argv[0] ), "inputfile" ); +// } +#endif + if( !doalign || fromaln ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "mafft --dpparttree might give a better result, although slow.\n" ); + fprintf( stderr, "mafft --fastaparttree is also available if you have fasta34.\n" ); + } + fprintf( stderr, "\n" ); + fprintf( stderr, "----------------------------------------------------------------------------\n" ); + } +#if TREE + if( treeout ) free( treefile ); +#endif + +#if 0 + fprintf( stdout, "weight =\n" ); + for( i=0; iwm > s2->wm ) return( -1 ); + else if ( s1->wm < s2->wm ) return( 1 ); + else return( 0 ); +} + +static void match_calc( double *match, char **s1, char **s2, int i1, int lgth2 ) +{ + int j; + + for( j=0; j lgth1, outgap == 1 -> lgth1+1 */ + int lgth1, lgth2; + int resultlen; + double wm = 0.0; // by D.Mathog, + double g; + double *currentw, *previousw; +#if 1 + double *wtmp; + int *ijpipt; + int *ijpjpt; + double *mjpt, *Mjpt, *prept, *curpt; + int *mpjpt, *Mpjpt; +#endif + static double mi, *m; + static double Mi, *largeM; + static int **ijpi; + static int **ijpj; + static int mpi, *mp; + static int Mpi, *Mp; + static double *w1, *w2; +// static double *match; + static double *initverticalw; /* kufuu sureba iranai */ + static double *lastverticalw; /* kufuu sureba iranai */ + static char **mseq1; + static char **mseq2; + static double **cpmx1; + static double **cpmx2; + static int **intwork; + static double **doublework; + static int orlgth1 = 0, orlgth2 = 0; + double maxwm; + double tbk; + int tbki, tbkj; + int endali, endalj; +// double localthr = 0.0; +// double localthr2 = 0.0; + double fpenalty = (double)penalty; + double fpenalty_OP = (double)penalty_OP; + double fpenalty_ex = (double)penalty_ex; +// double fpenalty_EX = (double)penalty_EX; + double foffset = (double)offset; + double localthr = -foffset; + double localthr2 = -foffset; + static Shuryoten *shuryo = NULL; + int numshuryo; + double minshuryowm = 0.0; // by D.Mathog + int minshuryopos = 0; // by D.Mathog + double resf; + + +// fprintf( stderr, "@@@@@@@@@@@@@ penalty_OP = %f, penalty_EX = %f, pelanty = %f\n", fpenalty_OP, fpenalty_EX, fpenalty ); + + fprintf( stderr, "in suboptalign11\n" ); + if( !shuryo ) + { + shuryo = (Shuryoten *)calloc( 100, sizeof( Shuryoten ) ); + } + for( i=0; i<100; i++ ) + { + shuryo[i].i = -1; + shuryo[i].j = -1; + shuryo[i].wm = 0.0; + } + numshuryo = 0; + + if( orlgth1 == 0 ) + { + } + + + lgth1 = strlen( seq1[0] ); + lgth2 = strlen( seq2[0] ); + + fprintf( stderr, "in suboptalign11 step 1\n" ); + + if( lgth1 > orlgth1 || lgth2 > orlgth2 ) + { + int ll1, ll2; + + fprintf( stderr, "in suboptalign11 step 1.3\n" ); + if( orlgth1 > 0 && orlgth2 > 0 ) + { + fprintf( stderr, "in suboptalign11 step 1.4\n" ); + FreeFloatVec( w1 ); + FreeFloatVec( w2 ); +// FreeFloatVec( match ); + FreeFloatVec( initverticalw ); + FreeFloatVec( lastverticalw ); + fprintf( stderr, "in suboptalign11 step 1.5\n" ); + + FreeFloatVec( m ); + FreeIntVec( mp ); + FreeFloatVec( largeM ); + FreeIntVec( Mp ); + fprintf( stderr, "in suboptalign11 step 1.6\n" ); + + + FreeFloatMtx( cpmx1 ); + FreeFloatMtx( cpmx2 ); + + fprintf( stderr, "in suboptalign11 step 1.7\n" ); + FreeFloatMtx( doublework ); + FreeIntMtx( intwork ); + } + + ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; + ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; + +#if DEBUG + fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); +#endif + + w1 = AllocateFloatVec( ll2+2 ); + w2 = AllocateFloatVec( ll2+2 ); +// match = AllocateFloatVec( ll2+2 ); + + initverticalw = AllocateFloatVec( ll1+2 ); + lastverticalw = AllocateFloatVec( ll1+2 ); + + m = AllocateFloatVec( ll2+2 ); + mp = AllocateIntVec( ll2+2 ); + largeM = AllocateFloatVec( ll2+2 ); + Mp = AllocateIntVec( ll2+2 ); + + cpmx1 = AllocateFloatMtx( nalphabets, ll1+2 ); + cpmx2 = AllocateFloatMtx( nalphabets, ll2+2 ); + + doublework = AllocateFloatMtx( nalphabets, MAX( ll1, ll2 )+2 ); + intwork = AllocateIntMtx( nalphabets, MAX( ll1, ll2 )+2 ); + + mseq1 = AllocateCharMtx( njob, ll1+ll2 ); + mseq2 = AllocateCharMtx( njob, ll1+ll2 ); + +#if DEBUG + fprintf( stderr, "succeeded\n" ); +#endif + + orlgth1 = ll1 - 100; + orlgth2 = ll2 - 100; + } + fprintf( stderr, "in suboptalign11 step 1.6\n" ); + + + + fprintf( stderr, "in suboptalign11 step 2\n" ); + + if( orlgth1 > commonAlloc1 || orlgth2 > commonAlloc2 ) + { + int ll1, ll2; + + if( commonAlloc1 && commonAlloc2 ) + { + FreeIntMtx( commonIP ); + FreeIntMtx( commonJP ); + FreeIntMtx( used ); + } + + ll1 = MAX( orlgth1, commonAlloc1 ); + ll2 = MAX( orlgth2, commonAlloc2 ); + +#if DEBUG + fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); +#endif + + used = AllocateIntMtx( ll1+10, ll2+10 ); + commonIP = AllocateIntMtx( ll1+10, ll2+10 ); + commonJP = AllocateIntMtx( ll1+10, ll2+10 ); + +#if DEBUG + fprintf( stderr, "succeeded\n\n" ); +#endif + + commonAlloc1 = ll1; + commonAlloc2 = ll2; + } + ijpi = commonIP; + ijpj = commonJP; + + +#if 0 + for( i=0; i", wm ); +#endif + g = mi + fpenalty; +#if 0 + fprintf( stderr, "%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; +// *ijpipt = i - 1; + *ijpjpt = mpi; + } + g = *prept; + if( g > mi ) + { + mi = g; + mpi = j-1; + } + +#if USE_PENALTY_EX + mi += fpenalty_ex; +#endif + +#if 0 + fprintf( stderr, "%5.0f->", wm ); +#endif + g = *mjpt + fpenalty; +#if 0 + fprintf( stderr, "m%5.0f?", g ); +#endif + if( g > wm ) + { + wm = g; + *ijpipt = *mpjpt; +// *ijpjpt = j - 1; + } + g = *prept; + if( g > *mjpt ) + { + *mjpt = g; + *mpjpt = i-1; + } +#if USE_PENALTY_EX + *mjpt += fpenalty_ex; +#endif + + + g = tbk + fpenalty_OP; +// g = tbk; + if( g > wm ) + { + wm = g; + *ijpipt = tbki; + *ijpjpt = tbkj; +// fprintf( stderr, "hit! i%d, j%d, ijpi = %d, ijpj = %d\n", i, j, *ijpipt, *ijpjpt ); + } + g = Mi; + if( g > tbk ) + { + tbk = g; + tbki = i-1; + tbkj = Mpi; + } + g = *Mjpt; + if( g > tbk ) + { + tbk = g; + tbki = *Mpjpt; + tbkj = j-1; + } +// tbk += fpenalty_EX;// + foffset; + + g = *prept; + if( g > *Mjpt ) + { + *Mjpt = g; + *Mpjpt = i-1; + } +// *Mjpt += fpenalty_EX;// + foffset; + + g = *prept; + if( g > Mi ) + { + Mi = g; + Mpi = j-1; + } +// Mi += fpenalty_EX;// + foffset; + + +// fprintf( stderr, "wm=%f, tbk=%f(%c-%c), mi=%f, *mjpt=%f\n", wm, tbk, seq1[0][tbki], seq2[0][tbkj], mi, *mjpt ); +// fprintf( stderr, "ijp = %c,%c\n", seq1[0][abs(*ijpipt)], seq2[0][abs(*ijpjpt)] ); + + + if( maxwm < wm ) + { + maxwm = wm; + endali = i; + endalj = j; + } + +#if 1 + if( numshuryo < 100 ) + { + shuryo[numshuryo].i = i; + shuryo[numshuryo].j = j; + shuryo[numshuryo].wm = wm; + + if( minshuryowm > wm ) + { + minshuryowm = wm; + minshuryopos = numshuryo; + } + numshuryo++; + } + else + { + if( wm > minshuryowm ) + { + shuryo[minshuryopos].i = i; + shuryo[minshuryopos].j = j; + shuryo[minshuryopos].wm = wm; + minshuryowm = wm; + for( k=0; k<100; k++ ) // muda + { + if( shuryo[k].wm < minshuryowm ) + { + minshuryowm = shuryo[k].wm; + minshuryopos = k; + break; + } + } + } + } +#endif +#if 1 + if( wm < localthr ) + { +// fprintf( stderr, "stop i=%d, j=%d, curpt=%f\n", i, j, *curpt ); + *ijpipt = localstop; +// *ijpjpt = localstop; + wm = localthr2; + } +#endif +#if 0 + fprintf( stderr, "%5.0f ", *curpt ); +#endif +#if DEBUG2 + fprintf( stderr, "%5.0f ", wm ); +// fprintf( stderr, "%c-%c *ijppt = %d, localstop = %d\n", seq1[0][i], seq2[0][j], *ijppt, localstop ); +#endif + + *curpt += wm; + ijpipt++; + ijpjpt++; + mjpt++; + Mjpt++; + prept++; + mpjpt++; + Mpjpt++; + curpt++; + } +#if DEBUG2 + fprintf( stderr, "\n" ); +#endif + + lastverticalw[i] = currentw[lgth2-1]; + } + + for( k=0; k<100; k++ ) + { + fprintf( stderr, "shuryo[%d].i,j,wm = %d,%d,%f\n", k, shuryo[k].i, shuryo[k].j, shuryo[k].wm ); + } + + +#if 1 + fprintf( stderr, "maxwm = %f\n", maxwm ); + fprintf( stderr, "endali = %d\n", endali ); + fprintf( stderr, "endalj = %d\n", endalj ); +#endif + + qsort( shuryo, 100, sizeof( Shuryoten ), (int (*)())compshuryo ); + for( k=0; k<100; k++ ) + { + fprintf( stderr, "shuryo[%d].i,j,wm = %d,%d,%f\n", k, shuryo[k].i, shuryo[k].j, shuryo[k].wm ); + } + + + lasti = lgth1+1; + for( i=0; i\n%s\n", mseq1[0] ); + fprintf( stderr, ">\n%s\n", mseq2[0] ); +#endif + } + for( i=0; i<20; i++ ) + { + for( j=0; j<20; j++ ) + { + fprintf( stderr, "%2d ", used[i][j] ); + } + fprintf( stderr, "\n" ); + } + + +// fprintf( stderr, "### impmatch = %f\n", *impmatch ); + + resultlen = strlen( mseq1[0] ); + if( alloclen < resultlen || resultlen > N ) + { + fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); + ErrorExit( "LENGTH OVER!\n" ); + } + + + + + + return( wm ); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/tbfast.c b/mafft/src/mafft-7.487-with-extensions/core/tbfast.c new file mode 100644 index 0000000000..c568baa3f3 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/tbfast.c @@ -0,0 +1,3644 @@ +#include "mltaln.h" + +#define DEBUG 0 +#define IODEBUG 0 +#define SCOREOUT 0 +#define SHISHAGONYU 0 // for debug + +#define REPORTCOSTS 0 + +static int treein; +static int topin; +static int treeout; +static int distout; +static int noalign; +static int multidist; +static int subalignment; +static int subalignmentoffset; +static int keeplength; +static int ndeleted; +static int mapout; +static int smoothing; +static int callpairlocalalign; +static int outputhat23; +static int nthreadtb; + +typedef struct _jobtable +{ + int i; + int j; +} Jobtable; + +typedef struct _msacompactdistmtxthread_arg // single thread demo tsukau +{ + int njob; + int thread_no; + int *selfscore; + double **partmtx; + char **seq; + int **skiptable; + double *mindist; + int *mindistfrom; + int *jobpospt; +#ifdef enablemultithread + pthread_mutex_t *mutex; +#endif +} msacompactdistmtxthread_arg_t; + +#ifdef enablemultithread +typedef struct _distancematrixthread_arg +{ + int njob; + int thread_no; + int *selfscore; + double **iscore; + char **seq; + int **skiptable; + Jobtable *jobpospt; + pthread_mutex_t *mutex; +} distancematrixthread_arg_t; + +typedef struct _treebasethread_arg +{ + int thread_no; + int *nrunpt; + int njob; + int *nlen; + int *jobpospt; + int ***topol; + Treedep *dep; + char **aseq; + double *effarr; + int *alloclenpt; + LocalHom **localhomtable; + RNApair ***singlerna; + double *effarr_kozo; + int *fftlog; + char *mergeoralign; + int *targetmap; + int *uselh; + pthread_mutex_t *mutex; + pthread_cond_t *treecond; +} treebasethread_arg_t; +#endif + +static void arguments( int argc, char *argv[], int *pac, char **pav, int *tac, char **tav ) // 2 kai yobaremasu. +{ + int c; + int i; + + nthread = 1; + nthreadtb = 1; + nthreadpair = 1; + outnumber = 0; + scoreout = 0; + spscoreout = 0; + treein = 0; + topin = 0; + rnaprediction = 'm'; + rnakozo = 0; + nevermemsave = 0; + inputfile = NULL; + addfile = NULL; + addprofile = 1; + fftkeika = 0; + constraint = 0; + nblosum = 62; + fmodel = 0; + calledByXced = 0; + devide = 0; + use_fft = 0; // chuui + force_fft = 0; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + weight = 3; + utree = 1; + tbutree = 1; + refine = 0; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + alg = 'A'; + mix = 0; + tbitr = 0; + scmtd = 5; + tbweight = 0; + tbrweight = 3; + checkC = 0; + treemethod = 'X'; + sueff_global = 0.1; + contin = 0; + scoremtx = 1; + kobetsubunkatsu = 0; +// dorp = NOTSPECIFIED; + ppenalty_dist = NOTSPECIFIED; + ppenalty = NOTSPECIFIED; + penalty_shift_factor = 1000.0; + ppenalty_ex = NOTSPECIFIED; + poffset = NOTSPECIFIED; + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + geta2 = GETA2; + fftWinSize = NOTSPECIFIED; + fftThreshold = NOTSPECIFIED; + RNAppenalty = NOTSPECIFIED; + RNAppenalty_ex = NOTSPECIFIED; + RNApthr = NOTSPECIFIED; + TMorJTT = JTT; + consweight_multi = 1.0; + consweight_rna = 0.0; + multidist = 0; + subalignment = 0; + subalignmentoffset = 0; + legacygapcost = 0; + specificityconsideration = 0.0; + keeplength = 0; + mapout = 0; + smoothing = 0; + specifictarget = 0; + callpairlocalalign = 0; + outputhat23 = 0; + nwildcard = 0; + nadd = 0; + + if( pac ) + { + pav[0] = "tbfast-pair"; + *pac = 1; + tav[0] = "tbfast"; + *tac = 1; + + for( i=0; i 0 && (*++argv)[0] == '-' ) + { +// reporterr( "(*argv)[0] = %s\n", (*argv) ); + while ( ( c = *++argv[0] ) ) + { +// reporterr( "c=%c\n", c ); + switch( c ) + { + case 'i': + inputfile = *++argv; +// fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + nadd = myatoi( *++argv ); +// fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'e': + RNApthr = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'o': + RNAppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'V': + ppenalty_dist = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "poffset = %d\n", poffset ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kappa = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d / kimura 200\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; +// fprintf( stderr, "jtt/kimura %d\n", pamN ); + --argc; + goto nextoption; + case 'm': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = TM; +// fprintf( stderr, "tm %d\n", pamN ); + --argc; + goto nextoption; + case 'l': + fastathreshold = atof( *++argv ); + constraint = 2; + --argc; + goto nextoption; + case 'r': + consweight_rna = atof( *++argv ); + rnakozo = 1; + --argc; + goto nextoption; + case 'c': + consweight_multi = atof( *++argv ); + --argc; + goto nextoption; + case 'C': + nthreadpair = nthread = myatoi( *++argv ); +// fprintf( stderr, "nthread = %d\n", nthread ); + --argc; +#ifndef enablemultithread + nthread = 0; +#endif + goto nextoption; + case 's': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; + case 'R': + rnaprediction = 'r'; +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'K': + addprofile = 0; + break; + case 'y': + distout = 1; + break; + case 't': + treeout = 1; + break; + case '^': + treeout = 2; + break; + case 'T': + noalign = 1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; + case 'L': + legacygapcost = 1; + break; +#if 1 + case 'O': + outgap = 0; + break; +#else + case 'O': + fftNoAnchStop = 1; + break; +#endif +#if 0 + case 'S' : + scoreout = 1; // for checking parallel calculation + break; +#else + case 'S' : + spscoreout = 1; // 2014/Dec/30, sp score + break; +#endif + case 'H': + subalignment = 1; + subalignmentoffset = myatoi( *++argv ); + --argc; + goto nextoption; +#if 0 + case 'e': + fftscore = 0; + break; + case 'r': + fmodel = -1; + break; + case 'R': + fftRepeatStop = 1; + break; + case 's': + treemethod = 's'; + break; +#endif + case 'X': + treemethod = 'X'; + sueff_global = atof( *++argv ); +// fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; + case 'E': + treemethod = 'E'; + break; + case 'q': + treemethod = 'q'; + break; + case 'n' : + outnumber = 1; + break; +#if 0 + case 'a': + alg = 'a'; + break; + case 'H': + alg = 'H'; + break; + case 'Q': + alg = 'Q'; + break; +#endif + case '@': + alg = 'd'; + break; + case 'A': + alg = 'A'; + break; + case 'M': + alg = 'M'; + break; + case 'N': + nevermemsave = 1; + break; + case 'B': // hitsuyou! memopt -M -B no tame + break; + case 'F': + use_fft = 1; + break; + case 'G': + force_fft = 1; + use_fft = 1; + break; + case 'U': + treein = 1; + break; +#if 0 + case 'V': + topin = 1; + break; +#endif + case 'u': + tbrweight = 0; + weight = 0; + break; + case 'v': + tbrweight = 3; + break; + case 'd': + multidist = 1; + break; +#if 0 + case 'd': + disp = 1; + break; +#endif +/* Modified 01/08/27, default: user tree */ + case 'J': + tbutree = 0; + break; +/* modification end. */ + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + case 'W': + minimumweight = atof( *++argv ); +// fprintf( stderr, "minimumweight = %f\n", minimumweight ); + --argc; + goto nextoption; +#if 0 + case 'Z': + checkC = 1; + break; +#endif + case 'Y': + keeplength = 1; + break; + case 'Z': + mapout = 1; + break; + case 'p': + smoothing = 1; + break; + case '=': + specifictarget = 1; + break; + case ':': + nwildcard = 1; + break; + case '+': + outputhat23 = myatoi( *++argv ); + reporterr( "outputhat23=%d\n", outputhat23 ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + +// reporterr( "argc=%d\n", argc ); + + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "argc=%d, tbfast options: Check source file !\n", argc ); + exit( 1 ); + } + if( tbitr == 1 && outgap == 0 ) + { + fprintf( stderr, "conflicting options : o, m or u\n" ); + exit( 1 ); + } + if( alg == 'C' && outgap == 0 ) + { + fprintf( stderr, "conflicting options : C, o\n" ); + exit( 1 ); + } +} + +#if 0 +static void *distancematrixthread2( void *arg ) +{ + distancematrixthread_arg_t *targ = (distancematrixthread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + double *selfscore = targ->selfscore; + double **iscore = targ->iscore; + char **seq = targ->seq; + Jobtable *jobpospt = targ->jobpospt; + + double ssi, ssj, bunbo; + int i, j; + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + i = jobpospt->i; + i++; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex ); + + ssi = selfscore[i]; + if( i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + for( j=i+1; jnjob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **partmtx = targ->partmtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + double *mindist = targ->mindist; + int *mindistfrom = targ->mindistfrom; + int *jobpospt = targ->jobpospt; + double tmpdist, preference, tmpdistx, tmpdisty; + int i, j; + + while( 1 ) + { +#ifdef enablemultithread + if( nthreadpair ) + { + pthread_mutex_lock( targ->mutex ); + i = *jobpospt; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + *jobpospt = i+1; + pthread_mutex_unlock( targ->mutex ); + } + else +#endif + { + i = *jobpospt; + if( i == njob-1 ) + { + return( NULL ); + } + *jobpospt = i+1; + } + + if( i % 100 == 0 ) + { + if( nthreadpair ) + fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + else + fprintf( stderr, "\r% 5d / %d", i, njob ); + } + + for( j=i+1; jnjob; + int thread_no = targ->thread_no; + double *selfscore = targ->selfscore; + double **iscore = targ->iscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + double ssi, ssj, bunbo; + int i, j; + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + j = jobpospt->j; + i = jobpospt->i; + j++; + if( j == njob ) + { + i++; + j = i + 1; + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + } + jobpospt->j = j; + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex ); + + + if( j==i+1 && i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + ssi = selfscore[i]; + ssj = selfscore[j]; + bunbo = MIN( ssi, ssj ); + if( bunbo == 0.0 ) + iscore[i][j-i] = 2.0; // 2013/Oct/17 + else +// iscore[i][j-i] = ( 1.0 - naivepairscore11( seq[i], seq[j], penalty_dist ) / bunbo ) * 2.0; // 2013/Oct/17 + iscore[i][j-i] = ( 1.0 - naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty_dist ) / bunbo ) * 2.0; // 2014/Aug/15 fast + if( iscore[i][j-i] > 10 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 + } +} +#else +static void *distancematrixthread( void *arg ) // v7.2 ijou deha tsukawanaihazu +{ + distancematrixthread_arg_t *targ = (distancematrixthread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + int *selfscore = targ->selfscore; + double **iscore = targ->iscore; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + int ssi, ssj, bunbo; + int i, j; + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + i = jobpospt->i; // (jobpospt-i)++ dato, shuuryou hantei no mae ni ++ surunode, tomaranakunaru. + + + if( i == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + jobpospt->i += 1; + pthread_mutex_unlock( targ->mutex ); + if( i % 100 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); + + ssi = selfscore[i]; + for( j=i+1; j 10.0 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 + } + } +} +#endif + +static void *treebasethread( void *arg ) // seed && compacttree==3 niha taioushinai. +{ + treebasethread_arg_t *targ = (treebasethread_arg_t *)arg; + int *nrunpt = targ->nrunpt; + int thread_no = targ->thread_no; + int njob = targ->njob; + int *nlen = targ->nlen; + int *jobpospt = targ->jobpospt; + int ***topol = targ->topol; + Treedep *dep = targ->dep; + char **aseq = targ->aseq; + double *effarr = targ->effarr; + int *alloclen = targ->alloclenpt; + LocalHom **localhomtable = targ->localhomtable; + RNApair ***singlerna = targ->singlerna; + double *effarr_kozo = targ->effarr_kozo; + int *fftlog = targ->fftlog; + int *targetmap = targ->targetmap; + int *uselh = targ->uselh; + char *mergeoralign = targ->mergeoralign; + + char **mseq1, **mseq2; + char **localcopy; + int i, j, l; + int len1, len2; + int clus1, clus2; + double pscore; + char *indication1, *indication2; + double *effarr1 = NULL; + double *effarr2 = NULL; + double *effarr1_kozo = NULL; + double *effarr2_kozo = NULL; + LocalHom ***localhomshrink = NULL; + char *swaplist = NULL; + int m1, m2; +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + RNApair ***grouprna1 = NULL, ***grouprna2 = NULL; + double **dynamicmtx; + int **localmem = NULL; + int posinmem; +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + + if( compacttree == 3 ) + { + reporterr( "bug. treebasethread() is no longer used when compacttree==3.\n" ); + exit( 1 ); + } + + + mseq1 = AllocateCharMtx( njob, 0 ); + mseq2 = AllocateCharMtx( njob, 0 ); + localcopy = calloc( njob, sizeof( char * ) ); + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + localmem = AllocateIntMtx( 2, njob+1 ); // memhist mitaiou + + if( rnakozo && rnaprediction == 'm' ) + { + grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + } + else + { + grouprna1 = grouprna2 = NULL; + } + + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + +#if 0 + reporterr( "before allocating localhomshrink (--thread >0), constraint=%d, njob=%d\n", constraint, njob ); + use_getrusage(); +#endif + swaplist = NULL; +// if( constraint ) + if( constraint && compacttree != 3 ) + { + if( specifictarget ) swaplist = calloc( njob, sizeof( char ) ); +// use_getrusage(); + localhomshrink = (LocalHom ***)calloc( njob, sizeof( LocalHom ** ) ); + for( i=0; i main thread + if( constraint ) + calcimportance( njob, effarr, aseq, localhomtable ); +#endif + + +// writePre( njob, name, nlen, aseq, 0 ); + + +// for( l=0; lmutex ); + l = *jobpospt; + if( l == njob-1 ) + { + pthread_mutex_unlock( targ->mutex ); + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); + Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); + A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); + D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); + partA__align( NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL ); + G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? + free( mseq1 ); + free( mseq2 ); + free( localcopy ); + free( effarr1 ); + free( effarr2 ); + free( effarr1_kozo ); + free( effarr2_kozo ); + free( indication1 ); + free( indication2 ); + FreeDoubleMtx( dynamicmtx ); + FreeIntMtx( localmem ); + if( rnakozo && rnaprediction == 'm' ) + { + if( grouprna1 ) free( grouprna1 ); // nakami ha? + if( grouprna2 ) free( grouprna2 ); // nakami ha? + grouprna1 = grouprna2 = NULL; + } + if( constraint && compacttree != 3 ) + { + if( localhomshrink ) // nen no tame + { + for( i=0; itreecond, targ->mutex ); + } + if( dep[l].child1 != -1 ) + { + while( dep[dep[l].child1].done == 0 ) + pthread_cond_wait( targ->treecond, targ->mutex ); + } +// while( *nrunpt >= nthread ) +// pthread_cond_wait( targ->treecond, targ->mutex ); // iranai no?? + (*nrunpt)++; + +// pthread_mutex_unlock( targ->mutex ); + + if( mergeoralign[l] == 'n' ) + { +// fprintf( stderr, "SKIP!\n" ); + dep[l].done = 1; + (*nrunpt)--; + pthread_cond_broadcast( targ->treecond ); +// free( topol[l][0] ); +// free( topol[l][1] ); +// free( topol[l] ); + pthread_mutex_unlock( targ->mutex ); +// free( localmem[0] ); +// free( localmem[1] ); + continue; + } + + + + m1 = topol[l][0][0]; + m2 = topol[l][1][0]; + +// fprintf( stderr, "\ndistfromtip = %f\n", dep[l].distfromtip ); +// makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip - 0.5 ); + makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip ); + +// pthread_mutex_lock( targ->mutex ); + + + + len1 = strlen( aseq[m1] ); + len2 = strlen( aseq[m2] ); + if( *alloclen <= len1 + len2 ) + { + fprintf( stderr, "\nReallocating (by thread %d) ..", thread_no ); + *alloclen = ( len1 + len2 ) + 1000; + ReallocateCharMtx( aseq, njob, *alloclen + 10 ); + fprintf( stderr, "done. *alloclen = %d\n", *alloclen ); + } + + localmem[0][0] = -1; + posinmem=topolorderz( localmem[0], topol, dep, l, 0 ) - localmem[0]; + localmem[1][0] = -1; + posinmem=topolorderz( localmem[1], topol, dep, l, 1 ) - localmem[1]; + for( i=0; (j=localmem[0][i])!=-1; i++ ) + { + localcopy[j] = calloc( *alloclen, sizeof( char ) ); + strcpy( localcopy[j], aseq[j] ); + } + for( i=0; (j=localmem[1][i])!=-1; i++ ) + { + localcopy[j] = calloc( *alloclen, sizeof( char ) ); + strcpy( localcopy[j], aseq[j] ); + } + pthread_mutex_unlock( targ->mutex ); + + + + if( effarr_kozo ) + { + clus1 = fastconjuction_noname_kozo( localmem[0], localcopy, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 ); + clus2 = fastconjuction_noname_kozo( localmem[1], localcopy, mseq2, effarr2, effarr, effarr2_kozo, effarr_kozo, indication2 ); + } +#if 0 + else if( specifictarget ) + { + clus1 = fastconjuction_target( topol[l][0], localcopy, mseq1, effarr1, effarr, indication1, minimumweight, targetmap ); + clus2 = fastconjuction_target( topol[l][1], localcopy, mseq2, effarr2, effarr, indication2, minimumweight, targetmap ); + } +#endif + else + { + clus1 = fastconjuction_noname( localmem[0], localcopy, mseq1, effarr1, effarr, indication1, minimumweight, NULL ); + clus2 = fastconjuction_noname( localmem[1], localcopy, mseq2, effarr2, effarr, indication2, minimumweight, NULL ); + } + +#if 1 + if( l < 1000 || l % 100 == 0 ) fprintf( stderr, "\rSTEP % 5d /%d (thread %4d) ", l+1, njob-1, thread_no ); +#else + fprintf( stderr, "STEP %d /%d (thread %d) \n", l+1, njob-1, thread_no ); + fprintf( stderr, "group1 = %.66s", indication1 ); + if( strlen( indication1 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, ", child1 = %d\n", dep[l].child0 ); + fprintf( stderr, "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, ", child2 = %d\n", dep[l].child1 ); + + fprintf( stderr, "Group1's lengths = " ); + for( i=0; i 30000 || len2 > 30000 ) ) ) + { + fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); + if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000 ); + else ffttry = 0; +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000 ); // v6.708 +// fprintf( stderr, "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); +// fprintf( stderr, "f=%d, clus1=%d, fftlog[m1]=%d, clus2=%d, fftlog[m2]=%d\n", ffttry, clus1, fftlog[m1], clus2, fftlog[m2] ); + if( constraint == 2 ) + { + if( alg == 'M' ) + { + fprintf( stderr, "\n\nMemory saving mode is not supported.\n\n" ); + exit( 1 ); + } +// fprintf( stderr, "c" ); + if( alg == 'A' ) + { + imp_match_init_strict( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, NULL, NULL, (compacttree==3)?l:-1, 0 ); // seedinlh, nfiles ni ha taiou shiteinai + if( rnakozo ) imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou + } + if( alg == 'd' ) + { + imp_match_init_strictD( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, NULL, NULL, (compacttree==3)?l:-1, 0 ); + if( rnakozo ) imp_rnaD( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); + pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + } + else if( alg == 'Q' ) + { + fprintf( stderr, "Not supported\n" ); + exit( 1 ); + } + } + else if( force_fft || ( use_fft && ffttry ) ) + { + fprintf( stderr, " f\b\b" ); + if( alg == 'M' ) + { + fprintf( stderr, "m" ); + pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); + } + else + { + fprintf( stderr, " d\b\b" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + fprintf( stderr, "m" ); + pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou + break; + case( 'A' ): + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou + break; + case( 'd' ): + pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + +#if SCOREOUT + fprintf( stderr, "score = %10.2f\n", pscore ); +#endif + +/* + fprintf( stderr, "after align 1 %s \n", indication1 ); + display( mseq1, clus1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "after align 2 %s \n", indication2 ); + display( mseq2, clus2 ); + fprintf( stderr, "\n" ); +*/ + +// writePre( njob, name, nlen, localcopy, 0 ); + + if( disp ) display( localcopy, njob ); + + + + + pthread_mutex_lock( targ->mutex ); + dep[l].done = 1; + (*nrunpt)--; + pthread_cond_broadcast( targ->treecond ); + + for( i=0; (j=localmem[0][i])!=-1; i++ ) + strcpy( aseq[j], localcopy[j] ); + for( i=0; (j=localmem[1][i])!=-1; i++ ) + strcpy( aseq[j], localcopy[j] ); + + pthread_mutex_unlock( targ->mutex ); + + for( i=0; (j=localmem[0][i])!=-1; i++ ) + free( localcopy[j] ); + for( i=0; (j=localmem[1][i])!=-1; i++ ) + free( localcopy[j] ); +// free( topol[l][0] ); +// free( topol[l][1] ); +// free( topol[l] ); + + +#if REPORTCOSTS + if( l < 1000 || l % 100 == 0 ) + { + use_getrusage(); + reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); + reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); + } +#endif + + } +} +#endif + +void treebase( int *nlen, char **aseq, int nadd, char *mergeoralign, char **mseq1, char **mseq2, int ***topol, Treedep *dep, double *effarr, int *alloclen, LocalHom **localhomtable, RNApair ***singlerna, double *effarr_kozo, int *targetmap, int *targetmapr, int ntarget, int *uselh, int nseed, int *nfilesfornode ) +{ + int i, l, m; + int len1nocommongap, len2nocommongap; + int len1, len2; + int clus1, clus2; + double pscore, tscore; + char *indication1, *indication2; + double *effarr1 = NULL; + double *effarr2 = NULL; + double *effarr1_kozo = NULL; + double *effarr2_kozo = NULL; + LocalHom ***localhomshrink = NULL; + int *seedinlh1 = NULL; + int *seedinlh2 = NULL; + char *swaplist = NULL; + int *fftlog; + int m1, m2; + int *gaplen; + int *gapmap; + int *alreadyaligned; +// double dumfl = 0.0; + double dumdb = 0.0; + int ffttry; + RNApair ***grouprna1 = NULL, ***grouprna2 = NULL; + static double **dynamicmtx; + int gapmaplen; + int **localmem = NULL; + int posinmem; + int nfiles; + double ***cpmxhist = NULL; + int **memhist = NULL; + double ***cpmxchild0 = NULL; + double ***cpmxchild1 = NULL; + double orieff1, orieff2; +#if REPORTCOSTS + time_t starttime, startclock; + starttime = time(NULL); + startclock = clock(); +#endif + + if( rnakozo && rnaprediction == 'm' ) + { + grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + } + else + { + grouprna1 = grouprna2 = NULL; + } + + fftlog = AllocateIntVec( njob ); + effarr1 = AllocateDoubleVec( njob ); + effarr2 = AllocateDoubleVec( njob ); + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + gaplen = AllocateIntVec( *alloclen+10 ); + gapmap = AllocateIntVec( *alloclen+10 ); + alreadyaligned = AllocateIntVec( njob ); + dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); + localmem = calloc( sizeof( int * ), 2 ); + cpmxhist = (double ***)calloc( njob-1, sizeof( double ** ) ); + for( i=0; i0, nseed > 0 + { + localhomshrink = (LocalHom ***)calloc( nseed, sizeof( LocalHom ** ) ); + for( i=0; i 0, compacttree == 3 && nseed == 0 + { + seedinlh1 = NULL; // nakutemo + seedinlh2 = NULL; // nakutemo + localhomshrink = NULL; // nakutemo + } + + + effarr1_kozo = AllocateDoubleVec( njob ); //tsuneni allocate sareru. + effarr2_kozo = AllocateDoubleVec( njob ); //tsuneni allocate sareru. + for( i=0; i 0 + { + dontcalcimportance_half( nseed, effarr, aseq, localhomtable ); //CHUUI + } + + +// writePre( njob, name, nlen, aseq, 0 ); + + tscore = 0.0; + for( l=0; l 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); + fprintf( stderr, "group2 = %.66s", indication2 ); + if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); + fprintf( stderr, "\n" ); +#endif + +#if REPORTCOSTS + if( l < 1000 || l % 100 == 0 ) reporterr( "\nclus1=%d, clus2=%d\n", clus1, clus2 ); +#endif + + +// for( i=0; i 0 && compacttree == 3 && nseed > 0 + { + fastshrinklocalhom_half_seed( localmem[0], localmem[1], nseed, seedinlh1, seedinlh2, localhomtable, localhomshrink ); + for( i=0; i 30000 || len2 > 30000 ) ) ) + { + fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); + alg = 'M'; + if( commonIP ) FreeIntMtx( commonIP ); + commonIP = NULL; + commonAlloc1 = 0; + commonAlloc2 = 0; + } + + +// if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); + if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000 ); + else ffttry = 0; +// ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000 ); // v6.708 +// fprintf( stderr, "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); +// fprintf( stderr, "f=%d, clus1=%d, fftlog[m1]=%d, clus2=%d, fftlog[m2]=%d\n", ffttry, clus1, fftlog[m1], clus2, fftlog[m2] ); + if( constraint == 2 ) + { + if( alg == 'M' ) + { + fprintf( stderr, "\n\nMemory saving mode is not supported.\n\n" ); + exit( 1 ); + } +// fprintf( stderr, "c" ); + if( alg == 'A' ) + { + imp_match_init_strict( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, seedinlh1, seedinlh2, (compacttree==3)?l:-1, nfiles ); + if( rnakozo ) imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); +#if REPORTCOSTS +// reporterr( "\n\n %d - %d (%d x %d) : \n", topol[l][0][0], topol[l][1][0], clus1, clus2 ); +#endif + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + } + if( alg == 'd' ) + { + imp_match_init_strictD( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, seedinlh1, seedinlh2, (compacttree==3)?l:-1, nfiles ); + if( rnakozo ) imp_rnaD( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); + pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + } + else if( alg == 'Q' ) + { + fprintf( stderr, "Not supported\n" ); + exit( 1 ); + } + } + else if( force_fft || ( use_fft && ffttry ) ) + { + fprintf( stderr, " f\b\b" ); + if( alg == 'M' ) + { + fprintf( stderr, "m" ); + pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); + } + else + pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); + } + else + { + fprintf( stderr, " d\b\b" ); + fftlog[m1] = 0; + switch( alg ) + { + case( 'a' ): + pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); + break; + case( 'M' ): + fprintf( stderr, "m" ); + pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + break; + case( 'A' ): + pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); + break; + case( 'd' ): + pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); + break; + default: + ErrorExit( "ERROR IN SOURCE FILE" ); + } + } + + nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); + +#if SCOREOUT + fprintf( stderr, "score = %10.2f\n", pscore ); +#endif + tscore += pscore; +/* + fprintf( stderr, "after align 1 %s \n", indication1 ); + display( mseq1, clus1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "after align 2 %s \n", indication2 ); + display( mseq2, clus2 ); + fprintf( stderr, "\n" ); +*/ + +// writePre( njob, name, nlen, aseq, 0 ); + + if( disp ) display( aseq, njob ); + + if( mergeoralign[l] == '1' ) // jissainiha nai. atarashii hairetsu ha saigo dakara. + { + reporterr( "Check source!!\n" ); + exit( 1 ); + } + if( mergeoralign[l] == '2' ) + { +// fprintf( stderr, ">mseq1[0] = \n%s\n", mseq1[0] ); +// fprintf( stderr, ">mseq2[0] = \n%s\n", mseq2[0] ); +// if( keeplength ) ndeleted += deletenewinsertions( clus1, clus2, mseq1, mseq2, NULL ); + gapmaplen = strlen( mseq1[0] )-len1nocommongap+len1; + adjustgapmap( gapmaplen, gapmap, mseq1[0] ); + if( smoothing ) + { + restorecommongapssmoothly( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); + findnewgaps( clus1, 0, mseq1, gaplen ); + insertnewgaps_bothorders( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, gapmaplen, *alloclen, alg, '-' ); + } + else + { + restorecommongaps( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); + findnewgaps( clus1, 0, mseq1, gaplen ); + insertnewgaps( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, *alloclen, alg, '-' ); + } +#if 0 + for( i=0; i-1; i++ ) alreadyaligned[m] = 1; + } + +// free( topol[l][0] ); +// free( topol[l][1] ); +// free( topol[l] ); + + free( localmem[0] ); + free( localmem[1] ); +#if REPORTCOSTS + if( l < 1000 || l % 100 == 0 ) + { + use_getrusage(); + reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); + reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); + } +#endif + } +#if REPORTCOSTS + use_getrusage(); + reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); + reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); +#endif + +#if 1 // 2021/Jun/25 + if( cpmxhist ) + { + for( i=0; i0.0 && usertree no toki. + loadtree( njob, topol, len, name, nlen, dep, treeout ); +// loadtop( njob, topol, len, name, NULL, dep ); // 2015/Jan/13, not yet checked + fprintf( stderr, "\ndone.\n\n" ); +// for( i=0; i0.0 ) + { + int *mem0 = calloc( sizeof( int ), njob ); + int *mem1 = calloc( sizeof( int ), njob ); + expdist = AllocateDoubleMtx( njob, njob ); + for( i=0; inext ) + { + if( tmpptr->opt == -1.0 ) continue; +#if SHISHAGONYU // for debug + char buff[100]; + sprintf( buff, "%10.5f", tmpptr->opt ); + tmpptr->opt = 0.0; + sscanf( buff, "%lf", &(tmpptr->opt) ); +#endif + tmpptr->opt = ( tmpptr->opt ) / 5.8 * 600; + } + } + if( !specifictarget ) ilim--; + } + + prep = fopen( "hat3.seed", "r" ); + if( prep ) + { + fprintf( stderr, "Loading 'hat3.seed' ... " ); + if( specifictarget ) readlocalhomtable2_target( prep, njob, localhomtable, kozoarivec, targetmap ); // uwagakisarerukara koredehadame. + else readlocalhomtable2_half( prep, njob, localhomtable, kozoarivec ); // uwagakisarerukara koredehadame. + fclose( prep ); + fprintf( stderr, "\ndone.\n" ); + } + else + fprintf( stderr, "No hat3.seed. No problem.\n" ); + + if( outputhat23 ) + { + + prep = fopen( "hat3", "w" ); + if( !prep ) ErrorExit( "Cannot open hat3 to write." ); + + fprintf( stderr, "Writing hat3 for iterative refinement\n" ); + if( specifictarget ) + ilim = ntarget; + else + ilim = njob-1; + for( i=0; inext ) + { + if( tmpptr->opt == -1.0 ) continue; + if( targetmap[j] == -1 || targetmap[i] < targetmap[j] ) + fprintf( prep, "%d %d %d %7.5f %d %d %d %d %c\n", targetmapr[i], j, tmpptr->overlapaa, tmpptr->opt/600*5.8, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->korh ); + } + } + } + fclose( prep ); + + prep = fopen( "hat2", "w" ); + WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); + fclose( prep ); + } + else if( distout ) // choufuku shiterukedo, muda deha nai. + { + prep = fopen( "hat2", "w" ); + WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); + fclose( prep ); + } + } + else + { + /* compacttree==3 no toki hat3.seed ha mada yomenai */ + prep = fopen( "hat3.seed", "r" ); + if( prep ) + { + char r; + r=fgetc(prep); + if( isalnum( r ) || r == ' ' ) + { + reporterr( "Structural alignment is not yet supported in the --memsavepair mode. Try normal mode,\n" ); + exit( 1 ); + } + fclose( prep ); + } + + } + } +// else if( compacttree != 3 ) + else + { + fprintf( stderr, "Loading 'hat3' ... " ); + prep = fopen( "hat3", "r" ); + if( prep == NULL ) ErrorExit( "Make hat3." ); + if( specifictarget ) readlocalhomtable2_target( prep, njob, localhomtable, kozoarivec, targetmap ); + else readlocalhomtable2_half( prep, njob, localhomtable, kozoarivec ); + fclose( prep ); + fprintf( stderr, "\ndone.\n" ); + } + + + + nkozo = 0; + for( i=0; i 0 ) + { + msacompactdistmtxthread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + double **mindistthread; + int **mindistfromthread; + + mindistthread = AllocateDoubleMtx( nthreadpair, njob ); + mindistfromthread = AllocateIntMtx( nthreadpair, njob ); + targ = calloc( nthreadpair, sizeof( msacompactdistmtxthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + jobpos = 0; + + for( i=0; i=7.2. Please email katoh@ifrec.osaka-u.ac.jp\n" ); +// fflush( stderr ); +// exit( 1 ); + iscore = AllocateFloatHalfMtx( njob ); // tbutree == 0 no baai ha allocate sareteinainode + + for( i=1; i 0 ) + { + distancematrixthread_arg_t *targ; + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos.i = 0; + jobpos.j = 0; + + targ = calloc( nthreadpair, sizeof( distancematrixthread_arg_t ) ); + handle = calloc( nthreadpair, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i 10 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 +//exit( 1 ); + +#if 0 + fprintf( stderr, "### ssj = %f\n", ssj ); + fprintf( stderr, "### selfscore[i] = %f\n", selfscore[i] ); + fprintf( stderr, "### selfscore[j] = %f\n", selfscore[j] ); + fprintf( stderr, "### rawscore = %f\n", naivepairscore11( seq[i], seq[j], penalty_dist ) ); +#endif + } + } + } +// fprintf( stderr, "\ndone.\n\n" ); + FreeIntMtx( skiptable ); +// fflush( stderr ); + reporterr( "\rdone. \n" ); + + } + else + { + if( callpairlocalalign ) + { + if( multidist ) + { + reporterr( "Bug in v7.290. Please email katoh@ifrec.osaka-u.ac.jp\n" ); + exit( 1 ); + } +#if 0 + prep = fopen( "hat2", "w" ); + if( !prep ) ErrorExit( "Cannot open hat2." ); + WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); // jissiha double + fclose( prep ); +#endif + } + else + { + if( multidist ) + { + fprintf( stderr, "Loading 'hat2n' (aligned sequences - new sequences) ... " ); + prep = fopen( "hat2n", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2." ); + readhat2_doublehalf_pointer( prep, njob, name, iscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + + fprintf( stderr, "Loading 'hat2i' (aligned sequences) ... " ); + prep = fopen( "hat2i", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2i." ); + readhat2_doublehalf_pointer( prep, njob-nadd, name, iscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + } + else + { + fprintf( stderr, "Loading 'hat2' ... " ); + prep = fopen( "hat2", "r" ); + if( prep == NULL ) ErrorExit( "Make hat2." ); + readhat2_doublehalf_pointer( prep, njob, name, iscore ); + fclose( prep ); + fprintf( stderr, "done.\n" ); + } + + if( distout ) // callpairlocalalign == 1 no toki ha ue de shorizumi. + { + reporterr( "\nwriting hat2 (2)\n" ); + hat2p = fopen( "hat2", "w" ); + WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, iscore ); + fclose( hat2p ); + } + } +// for( i=0; imtx) ha, 6merdistance -> disttbfast.c; dp distance -> muzukashii + { + reporterr( "Constructing a tree ... nthread=%d", nthread ); + compacttree_memsaveselectable( njob, partmtx, mindistfrom, mindist, NULL, selfscore, seq, skiptable, topol, len, name, NULL, dep, treeout, compacttree, 1 ); +// compacttreegivendist( njob, mindist, mindistfrom, topol, len, name, dep, treeout ); + + if( mindistfrom ) free( mindistfrom ); mindistfrom = NULL; + if( mindist ) free( mindist );; mindist = NULL; +// if( selfscore ) free( selfscore ); selfscore = NULL; // matomete free + if( skiptable) FreeIntMtx( skiptable ); skiptable = NULL; // nikaime dake + free( partmtx ); + } + else if( treeout ) + { + fprintf( stderr, "Constructing a UPGMA tree ... " ); + fixed_musclesupg_double_realloc_nobk_halfmtx_treeout_memsave( njob, iscore, topol, len, name, nlen, dep, 1, treeout ); // _memsave demo iihazu + } + else + { + fprintf( stderr, "Constructing a UPGMA tree ... " ); + fixed_musclesupg_double_realloc_nobk_halfmtx_memsave( njob, iscore, topol, len, dep, 1, 1 ); // _memsave demo iihazu + } +// else +// ErrorExit( "Incorrect tree\n" ); + + if( nkozo ) // atode kakukamo + { +// for( i=0; i= njob ) + { + fprintf( stderr, "No such sequence, %d.\n", subtable[i][j]+1 ); + exit( 1 ); + } + if( alignmentlength != strlen( seq[subtable[i][j]] ) ) + { + fprintf( stderr, "\n" ); + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "# ERROR!\n" ); + fprintf( stderr, "# Subalignment %d must be aligned.\n", i+1 ); + fprintf( stderr, "# Please check the alignment lengths of following sequences.\n" ); + fprintf( stderr, "#\n" ); + fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][0]+1, name[subtable[i][0]]+1, alignmentlength ); + fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][j]+1, name[subtable[i][j]]+1, (int)strlen( seq[subtable[i][j]] ) ); + fprintf( stderr, "#\n" ); + fprintf( stderr, "# See http://mafft.cbrc.jp/alignment/software/merge.html for details.\n" ); + if( subalignmentoffset ) + { + fprintf( stderr, "#\n" ); + fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + fprintf( stderr, "# In this case, the rule of numbering is:\n" ); + fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "\n" ); + exit( 1 ); + } + insubtable[subtable[i][j]] = 1; + } + for( j=0; j OK\n" ); + break; + } + } + if( !foundthebranch ) + { + system( "cp infile.tree GuideTree" ); // tekitou + fprintf( stderr, "\n" ); + fprintf( stderr, "###############################################################################\n" ); + fprintf( stderr, "# ERROR!\n" ); + fprintf( stderr, "# Subalignment %d does not form a monophyletic cluster\n", i+1 ); + fprintf( stderr, "# in the guide tree ('GuideTree' in this directory) internally computed.\n" ); + fprintf( stderr, "# If you really want to use this subalignment, pelase give a tree with --treein \n" ); + fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/treein.html\n" ); + fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/merge.html\n" ); + if( subalignmentoffset ) + { + fprintf( stderr, "#\n" ); + fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); + fprintf( stderr, "# In this case, the rule of numbering is:\n" ); + fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); + fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); + } + fprintf( stderr, "############################################################################### \n" ); + fprintf( stderr, "\n" ); + exit( 1 ); + } +// commongappick( seq[subtable[i]], subalignment[i] ); // irukamo + } +#if 0 + for( i=0; i %c\n\n", i, mergeoralign[i] ); + } +#endif + + for( i=0; i 0 && nadd == 0 ) + { + treebasethread_arg_t *targ; + int jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + pthread_cond_t treecond; + int *fftlog; + int nrun; + int nthread_yoyu; + + nthread_yoyu = nthreadtb * 1; + nrun = 0; + jobpos = 0; + targ = calloc( nthread_yoyu, sizeof( treebasethread_arg_t ) ); + fftlog = AllocateIntVec( njob ); + handle = calloc( nthread_yoyu, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + pthread_cond_init( &treecond, NULL ); + + for( i=0; inext ) + { + free( (void *)tmppt1 ); + tmppt1 = tmppt2; + } + free( (void *)tmppt1 ); + } + free( (void *)(localhomtable[i]+j) ); + } + free( (void *)localhomtable ); + } +#endif + + fprintf( trap_g, "done.\n" ); +// fclose( trap_g ); + free( mergeoralign ); + freeconstants(); + + + if( rnakozo && rnaprediction == 'm' ) + { + if( singlerna ) // nen no tame + { + for( i=0; i 0 ) + { + reporterr( "\nTo keep the alignment length, %d letters were DELETED.\n", ndeleted ); + if( mapout ) + reporterr( "The deleted letters are shown in the (filename).map file.\n" ); + else + reporterr( "To know the positions of deleted letters, rerun the same command with the --mapout option.\n" ); + } + + + free( kozoarivec ); + FreeCharMtx( seq ); + FreeCharMtx( bseq ); + free( mseq1 ); + free( mseq2 ); + + FreeCharMtx( name ); + free( nlen ); + free( selfscore ); + + FreeIntCub( topol ); topol = NULL; +// for( i=0; i len-2 ) break; + continue; + } + if( mseq2[k] == '-' ) + { + tmpscore += penalty; + while( mseq2[++k] == '-' ) + ; + k--; + if( k > len-2 ) break; + continue; + } + } + /* + if( mseq1[0] == '-' || mseq2[0] == '-' ) + { + for( k=0; k 3 ) code = 36; + else + code = code1; +#else + code1 = amino_n[(unsigned char)*seqpt]; + code2 = amino_n[(unsigned char)*seqrpt]; + if( code1 > 3 ) + { + code = 36; + } + else if( code2 > 3 ) + { + code = code1; + } + else if( *dirpt == '5' ) + { + code = 4 + code2 * 4 + code1; + } + else if( *dirpt == '3' ) + { + code = 20 + code2 * 4 + code1; + } + else // if( *dirpt == 'o' ) // nai + { + code = code1; + } +#endif + +// fprintf( stderr, "%c -> code=%d toa=%d, tog=%d, toc=%d, tot=%d, ton=%d, efee=%f\n", *seqpt, code%4, ribosumdis[code][4+0], ribosumdis[code][4+1], ribosumdis[code][4+2], ribosumdis[code][20+3], ribosumdis[code][36], feff ); + + seqpt++; + seqrpt++; + dirpt++; + + (*cpmxptpt++)[code] += feff; + } + } +} + +void mseqcat( char **seq1, char **seq2, double **eff, double *effarr1, double *effarr2, char name1[M][B], char name2[M][B], int clus1, int clus2 ) +{ + int i, j; + for( i=0; i 0.0 ) peff_kozo[m] += peff[m]; + } + } + else //iranai + { + for( m=0; m-1; j++ ) + if( s1 == topol[step][branch][0] ) value++; + for( j=0; (s2=topol[i][1][j])>-1; j++ ) + if( s2 == topol[step][branch][0] ) value++; + } + return( value ); +} + +void BranchLeafNode( int nseq, int ***topol, int *node, int step, int branch ) +{ + int i, j, k, s; + + for( i=0; i-1; j++ ) + node[s]++; + for( k=0; k-1; j++ ) + node[s]++; +} + +void RootLeafNode( int nseq, int ***topol, int *node ) +{ + int i, j, k, s; + for( i=0; i-1; j++ ) + node[s]++; +} + +void nodeFromABranch( int nseq, int *result, int **pairwisenode, int ***topol, double **len, int step, int num ) +{ + int i, s, count; + int *innergroup; + int *outergroup1; +#if 0 + int outergroup2[nseq]; + int table[nseq]; +#else + static int *outergroup2 = NULL; + static int *table = NULL; + if( outergroup2 == NULL ) + { + outergroup2 = AllocateIntVec( nseq ); + table = AllocateIntVec( nseq ); + } +#endif + innergroup = topol[step][num]; + outergroup1 = topol[step][!num]; + for( i=0; i-1; i++ ) table[s] = 0; + for( i=0; (s=outergroup1[i])>-1; i++ ) table[s] = 0; + for( i=0, count=0; i-1; i++ ) + { + result[s] = pairwisenode[s][outergroup1[0]] + + pairwisenode[s][outergroup2[0]] + - pairwisenode[outergroup1[0]][outergroup2[0]] - 1; + result[s] /= 2; + } + for( i=0; (s=outergroup1[i])>-1; i++ ) + { + result[s] = pairwisenode[s][outergroup2[0]] + + pairwisenode[s][innergroup[0]] + - pairwisenode[innergroup[0]][outergroup2[0]] + 1; + result[s] /= 2; + } + for( i=0; (s=outergroup2[i])>-1; i++ ) + { + result[s] = pairwisenode[s][outergroup1[0]] + + pairwisenode[s][innergroup[0]] + - pairwisenode[innergroup[0]][outergroup1[0]] + 1; + result[s] /= 2; + } + +#if 0 + for( i=0; i-1; i++ ) + { + pair[r1] = 1; + memlist1[k++] = r1; + } + memlist1[k] = -1; + + for( i=0, k=0; i 10 && jm > 10 ) exit( 1 ); +#endif + } +} + + +void makeEffMtx( int nseq, double **mtx, double *vec ) +{ + int i, j; + for( i=0; i start2, end1 <-> end2 + i2 = m1; + + if( localhom[t1][i2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[t1]+i2; + } + } + else + { + swaplist[k1] = 0; + for( k2=0; (m2=memlist2[k2])!=-1; k2++ ) + { + t1 = targetmap[m1]; + i2 = m2; + + if( localhom[t1][i2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[t1]+i2; + } + } + } + return( 0 ); +} + +int msshrinklocalhom_fast_half( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int m1, k1, m2, k2; + + for( k1=0; (m1=memlist1[k1])!=-1; k1++ ) + { + for( k2=0; (m2=memlist2[k2])!=-1; k2++ ) + { + if( m1 < m2 ) + { + if( localhom[m1][m2-m1].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[m1]+m2-m1; + } + else + { + if( localhom[m2][m1-m2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[m2]+m1-m2; + } + } + } + return( 0 ); +} + +int msshrinklocalhom_fast( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int m1, k1, m2, k2; + + for( k1=0; (m1=memlist1[k1])!=-1; k1++ ) + { + for( k2=0; (m2=memlist2[k2])!=-1; k2++ ) + { + if( localhom[m1][m2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[m1]+m2; + } + } + return( 0 ); +} +int fastshrinklocalhom_one( int *mem1, int *mem2, int norg, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int k1, k2; + int *intpt1, *intpt2; + + + for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ ) + { + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + if( *intpt2 != norg ) + { + fprintf( stderr, "ERROR! *intpt2 = %d\n", *intpt2 ); + exit( 1 ); + } + if( localhom[*intpt1][0].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[*intpt1]; + } + } + return( 0 ); +} + +int fastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int k1, k2; + int *intpt1, *intpt2; + + + for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ ) + { + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + if( localhom[*intpt1][*intpt2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[*intpt1]+*intpt2; + +// if( localhomshrink[k1][k2] != NULL ) +// printf( "ori localhomshrink[%d][%d].opt = %f\n", k1, k2, localhomshrink[k1][k2]->opt ); + } + } + return( 0 ); +} + +int fastshrinklocalhom_half_seed( int *mem1, int *mem2, int nseed, int *posinlsh1, int *posinlsh2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int k1, k2, sk1, sk2; + int *intpt1, *intpt2; + + for( intpt1=mem1, k1=0, sk1=0; *intpt1!=-1; intpt1++, k1++ ) + { + if( *intpt1>=nseed ) posinlsh1[k1] = -1; + else posinlsh1[k1] = sk1++; + } + for( intpt2=mem2, k2=0, sk2=0; *intpt2!=-1; intpt2++, k2++ ) + { + if( *intpt2>=nseed ) posinlsh2[k2] = -1; + else posinlsh2[k2] = sk2++; + } + + for( intpt1=mem1, sk1=0; *intpt1!=-1; intpt1++ ) + { + if( *intpt1>=nseed ) continue; + for( intpt2=mem2, sk2=0; *intpt2!=-1; intpt2++ ) + { + if( *intpt2>=nseed ) continue; + if( *intpt1 < *intpt2 ) + { + if( localhom[*intpt1][*intpt2-*intpt1].opt == -1 ) + localhomshrink[sk1][sk2] = NULL; + else + localhomshrink[sk1][sk2] = localhom[*intpt1]+*intpt2-*intpt1; + } + else + { + if( localhom[*intpt2][*intpt1-*intpt2].opt == -1 ) + localhomshrink[sk1][sk2] = NULL; + else + localhomshrink[sk1][sk2] = localhom[*intpt2]+*intpt1-*intpt2; + } + +// if( localhomshrink[k1][k2] != NULL ) +// printf( "ori localhomshrink[%d][%d].opt = %f, .importance=%f\n", k1, k2, localhomshrink[k1][k2]->opt, localhomshrink[k1][k2]->importance ); + sk2++; + } + sk1++; + } + return( 0 ); +} + +int fastshrinklocalhom_half( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int k1, k2; + int *intpt1, *intpt2; + + + for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ ) + { + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + if( *intpt1 < *intpt2 ) + { + if( localhom[*intpt1][*intpt2-*intpt1].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[*intpt1]+*intpt2-*intpt1; + } + else + { + if( localhom[*intpt2][*intpt1-*intpt2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[*intpt2]+*intpt1-*intpt2; + } + +// if( localhomshrink[k1][k2] != NULL ) +// printf( "ori localhomshrink[%d][%d].opt = %f, .importance=%f\n", k1, k2, localhomshrink[k1][k2]->opt, localhomshrink[k1][k2]->importance ); + } + } + return( 0 ); +} + + +int fastshrinklocalhom_target( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink, char *swaplist, int *targetmap ) +{ + int k1, k2; + int *intpt1, *intpt2; + int t1, i2; + + + for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ ) + { + if( targetmap[*intpt1] == -1 ) + { + swaplist[k1] = 1; +// swaplist[k1] = 0; // DAME!!! + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + if( targetmap[*intpt2] == -1 ) + { + localhomshrink[k1][k2] = NULL; + continue; + } + + t1 = targetmap[*intpt2]; // end1<->end2, start1<->start2 + i2 = *intpt1; + + if( localhom[t1][i2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[t1]+i2; + +// if( localhomshrink[k1][k2] != NULL ) +// printf( "localhomshrink[%d][%d].opt = %f\n", k1, k2, localhomshrink[k1][k2]->opt ); +// else +// printf( "localhomshrink[%d][%d] = NULL\n", k1, k2 ); + } + } + else + { + swaplist[k1] = 0; + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + t1 = targetmap[*intpt1]; + i2 = *intpt2; + + if( localhom[t1][i2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[t1]+i2; + +// if( localhomshrink[k1][k2] != NULL ) +// printf( "localhomshrink[%d][%d].opt = %f\n", k1, k2, localhomshrink[k1][k2]->opt ); +// else +// printf( "localhomshrink[%d][%d] = NULL\n", k1, k2 ); + } + } + } + return( 0 ); +} + +int msfastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink ) +{ + int k1, k2; + int *intpt1, *intpt2; + int m1, m2; + + for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ ) + { + for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ ) + { + m1 = MIN(*intpt1,*intpt2); m2 = MAX(*intpt1,*intpt2); + if( localhom[m1][m2].opt == -1 ) + localhomshrink[k1][k2] = NULL; + else + localhomshrink[k1][k2] = localhom[m1]+m2; + } + } + return( 0 ); +} + diff --git a/mafft/src/mafft-7.487-with-extensions/core/tditeration.c b/mafft/src/mafft-7.487-with-extensions/core/tditeration.c new file mode 100644 index 0000000000..f60499a2db --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/tditeration.c @@ -0,0 +1,2411 @@ + +/* + tree-dependent iteration + algorithm A+ when group-to-group, C when group-to-singleSeqence + OR + algorithm A+ +*/ + +#include "mltaln.h" + + +#define FULLSCORE 0 + +#define DEBUG 0 +#define RECORD 0 + +extern char **seq_g; +extern char **res_g; + +static int nwa; + + +#ifdef enablemultithread +typedef struct _threadarg +{ + int thread_no; + int *jobposintpt; + int *ndonept; + int *ntrypt; + int *collectingpt; + int njob; + int nbranch; + int maxiter; + int nkozo; + int *subgenerationpt; + double *basegainpt; + double *gainlist; + double *tscorelist; + int *generationofinput; + char *kozoarivec; + char **mastercopy; + char ***candidates; + int *generationofmastercopypt; + int *branchtable; + RNApair ***singlerna; + LocalHom **localhomtable; + int alloclen; + Node *stopol; + int ***topol; + double **len; + double **tscorehistory_detail; + int *finishpt; + int **skipthisbranch; + double **distmtx; + int ntarget; + int *targetmap; + pthread_mutex_t *mutex; + pthread_cond_t *collection_end; + pthread_cond_t *collection_start; +} threadarg_t; +#endif + +#if 1 +static void shuffle( int *arr, int n ) +{ + int i; + int x; + int b; + + for( i=1; i= ndistclass ) c = ndistclass-1; + if( c >= maxdistclass ) c = maxdistclass-1; + fprintf( stderr, "pair %d-%d (%f), dist=%f -> c=%d\n", i, j, eff1[i] * eff2[j], smalldistmtx[i][j], c ); + eff1s[c][i] += 1.0; + eff2s[c][j] += 1.0; + matnum[i][j] = c; + } + for( c=0; c= ndistclass ) c = ndistclass-1; + if( c >= maxdistclass ) c = maxdistclass-1; +// fprintf( stderr, "pair %d-%d (%f), dist=%f -> c=%d\n", i, j, eff1[i] * eff2[j], smalldistmtx[i][j], c ); + eff1s[c][i] = eff1[i]; + eff2s[c][j] = eff2[j]; + matnum[i][j] = c; + } +#endif +#if 0 + double totaleff; + for( i=0; ithread_no; + int njob = targ->njob; + int nbranch = targ->nbranch; + int maxiter = targ->maxiter; + int *ndonept = targ->ndonept; + int *ntrypt = targ->ntrypt; + int *collectingpt = targ->collectingpt; + int *jobposintpt = targ->jobposintpt; + int nkozo = targ->nkozo; + double *gainlist = targ->gainlist; + double *tscorelist = targ->tscorelist; + int *generationofinput = targ->generationofinput; + int *subgenerationpt = targ->subgenerationpt; + double *basegainpt = targ->basegainpt; + char *kozoarivec = targ->kozoarivec; + char **mastercopy = targ->mastercopy; + char ***candidates = targ->candidates; + int *generationofmastercopypt = targ->generationofmastercopypt; + int *branchtable = targ->branchtable; + RNApair ***singlerna = targ->singlerna; + LocalHom **localhomtable = targ->localhomtable; + int alloclen = targ->alloclen; + Node * stopol = targ->stopol; + int ***topol = targ->topol; + double **len = targ->len; + double **tscorehistory_detail = targ->tscorehistory_detail; + int *finishpt = targ->finishpt; + int **skipthisbranch = targ->skipthisbranch; + double **distmtx = targ->distmtx; + int ntarget = targ->ntarget; + int *targetmap = targ->targetmap; + + int i, k, l, ii; + double gain; + int iterate; + int **memlist; + char *pairbuf; + int locnjob; + int s1, s2; + int clus1, clus2; + char **localcopy; + char **mseq1, **mseq2; + double *distarr; // re-calc + double *effarr, *effarr_kozo; // re-calc + double *effarr1, *effarr2, *effarr1_kozo, *effarr2_kozo; + char *indication1, *indication2; + int length; + RNApair ***grouprna1, ***grouprna2; + RNApair *rnapairboth; + LocalHom ***localhomshrink; + char *swaplist; + int *gapmap1, *gapmap2; + double tscore, mscore; + double oimpmatchdouble; + double impmatchdouble; + int identity; + double tmpdouble; +// double naivescore0 = 0, naivescore1; + double *effarrforlocalhom; + double *tscorehistory; + int intdum; +#if 0 + int oscillating; + int lin, ldf; +#endif + double maxgain; + int bestthread; + int branchpos; + int subgenerationatfirst; + double unweightedspscore; + int myjob; + int converged2 = 0; + int chudanres; + double **smalldistmtx; + double ***scoringmatrices; + double **eff1s, **eff2s; + int **whichmtx; + + + locnjob = njob; + + if( utree == 0 ) + { + fprintf( stderr, "Dynamic tree is not supported in the multithread version.\n" ); + exit( 1 ); + } + if( score_check == 2 ) + { + fprintf( stderr, "Score_check 2 is not supported in the multithread version.\n" ); + exit( 1 ); + } + + if( weight == 2 ) + { + fprintf( stderr, "Weight 2 is not supported in the multithread version.\n" ); + exit( 1 ); + } + if( cooling && cut > 0.0 ) + { + fprintf( stderr, "Cooling is not supported in the multithread version.\n" ); + exit( 1 ); + } + + tscorehistory = calloc( maxiter, sizeof( double ) ); + + if( rnakozo && rnaprediction == 'm' ) + { + grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + } + else + { + grouprna1 = grouprna2 = NULL; + } + + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + distarr = AllocateDoubleVec( locnjob ); + effarr = AllocateDoubleVec( locnjob ); + effarrforlocalhom = AllocateDoubleVec( locnjob ); + effarr1 = AllocateDoubleVec( locnjob ); + effarr2 = AllocateDoubleVec( locnjob ); + mseq1 = AllocateCharMtx( locnjob, 0 ); + mseq2 = AllocateCharMtx( locnjob, 0 ); + localcopy = AllocateCharMtx( locnjob, alloclen ); + gapmap1 = AllocateIntVec( alloclen ); + gapmap2 = AllocateIntVec( alloclen ); + if( specificityconsideration != 0 ) + { + smalldistmtx = AllocateDoubleMtx( locnjob, locnjob ); // ookii? + scoringmatrices = AllocateDoubleCub( maxdistclass, nalphabets, nalphabets ); + makescoringmatrices( scoringmatrices, n_dis_consweight_multi ); + eff1s = AllocateDoubleMtx( maxdistclass, locnjob ); + eff2s = AllocateDoubleMtx( maxdistclass, locnjob ); + whichmtx = AllocateIntMtx( locnjob, locnjob ); + } + else + { + smalldistmtx = NULL; + scoringmatrices = NULL; + eff1s = eff2s = NULL; + whichmtx = NULL; + } + + effarr1_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru. + effarr2_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru. + effarr_kozo = AllocateDoubleVec( locnjob ); + for( i=0; imutex ); + + if( *collectingpt == 1 ) + { + *collectingpt = 0; + *generationofmastercopypt = iterate; + *subgenerationpt = 0; + *basegainpt = 0.0; + *ndonept = 0; + *jobposintpt = 0; + for( i=0; icollection_end ); + pthread_mutex_unlock( targ->mutex ); + } + else + { + pthread_cond_broadcast( targ->collection_end ); + pthread_mutex_unlock( targ->mutex ); + freelocalarrays + ( + tscorehistory, + grouprna1, grouprna2, + rnapairboth, + indication1, indication2, + distarr, + effarr, effarrforlocalhom, effarr1, effarr2, + mseq1, mseq2, + localcopy, + gapmap1, gapmap2, + effarr1_kozo, effarr2_kozo, effarr_kozo, + memlist, pairbuf, + localhomshrink, + swaplist, + smalldistmtx, + scoringmatrices, + eff1s, eff2s, + whichmtx + ); +// return( NULL ); + pthread_exit( NULL ); + } + + pthread_mutex_lock( targ->mutex ); + while( *ndonept < nbranch ) + pthread_cond_wait( targ->collection_start, targ->mutex ); + pthread_mutex_unlock( targ->mutex ); +// fprintf( stderr, "Thread 0 got a signal, *collectionpt = %d\n", *collectingpt ); + +/* + Hoka no thread ga keisan +*/ + + pthread_mutex_lock( targ->mutex ); + *collectingpt = 1; // chofuku + +#if 0 + for( i=0; i maxgain ) + { + maxgain = gainlist[i]; + bestthread = i; + } + } + + if( maxgain > 0.0 ) + { +// fprintf( stderr, "\nGain = %f\n", maxgain ); +// fprintf( stderr, "best gain = %f by thread %d\n", gainlist[bestthread], bestthread ); +// fprintf( stderr, "tscorelist[best] = %f by thread %d\n", tscorelist[bestthread], bestthread ); + if( parallelizationstrategy == BESTFIRST ) + { + for( i=0; i0; i-- ) + { +// if( iterate-i < 15 ) fprintf( stderr, "hist[%d] = %f\n", i, tscorehistory[i] ); + if( tscorehistory[i] == tscorelist[bestthread] ) + { + fprintf( stderr, "\nOscillating? %f == %f\n", tscorehistory[i], tscorelist[bestthread] ); + *collectingpt = -1; + break; + } + } + tscorehistory[iterate] = tscorelist[bestthread]; +#endif + } + else + { + fprintf( stderr, "\nConverged.\n" ); + *collectingpt = -1; +// pthread_cond_broadcast( targ->collection_end ); +// pthread_mutex_unlock( targ->mutex ); +// freelocalarrays(); +// return( NULL ); +// pthread_exit( NULL ); + } + +#if 1 + if( *finishpt ) + { + fprintf( stderr, "\nConverged2.\n" ); + *collectingpt = -1; + } +#endif + + pthread_mutex_unlock( targ->mutex ); + } + pthread_mutex_lock( targ->mutex ); + fprintf( stderr, "\nReached %d\n", maxiter ); + *collectingpt = -1; + pthread_cond_broadcast( targ->collection_end ); + pthread_mutex_unlock( targ->mutex ); + freelocalarrays + ( + tscorehistory, + grouprna1, grouprna2, + rnapairboth, + indication1, indication2, + distarr, + effarr, effarrforlocalhom, effarr1, effarr2, + mseq1, mseq2, + localcopy, + gapmap1, gapmap2, + effarr1_kozo, effarr2_kozo, effarr_kozo, + memlist, pairbuf, + localhomshrink, + swaplist, + smalldistmtx, + scoringmatrices, + eff1s, eff2s, + whichmtx + ); + return( NULL ); + pthread_exit( NULL ); + } + else + { + while( 1 ) + { +#if 0 + if( iterate % 2 == 0 ) + { + lin = 0; ldf = +1; + } + else + { + lin = locnjob - 2; ldf = -1; + } + for( l=lin; l < locnjob-1 && l >= 0 ; l+=ldf ) + for( k=0; k<2; k++ ) +#endif + + pthread_mutex_lock( targ->mutex ); + while( *collectingpt > 0 ) + pthread_cond_wait( targ->collection_end, targ->mutex ); + if( *collectingpt == -1 ) + { + pthread_mutex_unlock( targ->mutex ); + freelocalarrays + ( + tscorehistory, + grouprna1, grouprna2, + rnapairboth, + indication1, indication2, + distarr, + effarr, effarrforlocalhom, effarr1, effarr2, + mseq1, mseq2, + localcopy, + gapmap1, gapmap2, + effarr1_kozo, effarr2_kozo, effarr_kozo, + memlist, pairbuf, + localhomshrink, + swaplist, + smalldistmtx, + scoringmatrices, + eff1s, eff2s, + whichmtx + ); + return( NULL ); + pthread_exit( NULL ); + } +// pthread_mutex_unlock( targ->mutex ); + + +// pthread_mutex_lock( targ->mutex ); + if( *jobposintpt == nbranch ) + { + if( *collectingpt != -1 ) *collectingpt = 1; // chofuku + pthread_mutex_unlock( targ->mutex ); + continue; + } +// fprintf( stderr, "JOB jobposintpt=%d\n", *jobposintpt ); + myjob = branchtable[*jobposintpt]; + l = myjob / 2; + if( l == locnjob-2 ) k = 1; + else k = myjob - l * 2; +// fprintf( stderr, "JOB l=%d, k=%d\n", l, k ); + + + branchpos = myjob; + (*jobposintpt)++; + iterate = *generationofmastercopypt; + (*ntrypt)++; + pthread_mutex_unlock( targ->mutex ); + +// fprintf( stderr, "\n IRANAI IRANAI *jobposintpt=%d, nbranch = %d\n", *jobposintpt, nbranch ); + +// fprintf( stderr, "branchpos = %d (thread %d)\n", branchpos, thread_no ); + +// fprintf( stderr, "iterate=%d, l=%d, k=%d (thread %d)\n", iterate, l, k, thread_no ); + +#if 0 + fprintf( stderr, "STEP %03d-%03d-%d (Thread %d) ", iterate+1, l+1, k, thread_no ); + fprintf( stderr, "STEP %03d-%03d-%d (thread %d) %s ", iterate+1, l+1, k, thread_no, use_fft?"\n":"\n" ); +#endif + +// for( i=0; i<2; i++ ) for( j=0; jmutex ); + for( i=0; imutex ); + length = strlen( localcopy[0] ); + + if( nkozo ) + { +// double tmptmptmp; +// tmptmptmp = 0.0; +// clus1 = conjuctionfortbfast_kozo( &tmptmptmp, pair[0], s1, localcopy, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 ); + clus1 = fastconjuction_noname_kozo( memlist[0], localcopy, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 ); + for( i=0; i=0; i-- ) + { + oimpmatchdouble += (double)imp_match_out_scD( i, i ); +// fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + else + { + part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1] ); + if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL ); + for( i=length-1; i>=0; i-- ) + { + oimpmatchdouble += (double)part_imp_match_out_sc( i, i ); +// fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } +// fprintf( stderr, "otmpmatch = %f\n", oimpmatch ); + } + else + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else + { + imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + + fprintf( stderr, "not supported\n" ); + exit( 1 ); + + for( i=length-1; i>=0; i-- ) + { + oimpmatchdouble += (double)imp_match_out_sc( i, i ); +// fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } +// fprintf( stderr, "otmpmatch = %f\n", oimpmatch ); + } +// fprintf( stderr, "#### initial impmatch = %f\n", oimpmatch ); + } + else + { + if( RNAscoremtx == 'r' ) + intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame + else + { + if( smalldistmtx ) +#if 1 + intergroup_score_multimtx( whichmtx, scoringmatrices, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); +#else + intergroup_score_dynmtx( smalldistmtx, amino_dis, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame +#endif + else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame + } + oimpmatchdouble = 0.0; + } + + +// fprintf( stderr, "#### tmpdouble = %f\n", tmpdouble ); + mscore = oimpmatchdouble + tmpdouble; + } + else + { + fprintf( stderr, "score_check = %d\n", score_check ); + fprintf( stderr, "Not supported. Please add --threadit 0 to disable the multithreading in the iterative refinement calculation.\n" ); + exit( 1 ); + } + + +// if( rnakozo ) foldalignedrna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, rnapairboth ); + +// if( !use_fft && !rnakozo ) +// if( !use_fft ) + if( !use_fft ) + { + commongappick_record( clus1, mseq1, gapmap1 ); + commongappick_record( clus2, mseq2, gapmap2 ); + } + +#if 0 + fprintf( stderr, "##### mscore = %f\n", mscore ); +#endif + +#if DEBUG + if( !devide ) + { + fprintf( trap_g, "\n%d-%d-%d\n", iterate+1, l+1, k ); + fprintf( trap_g, "group1 = %s\n", indication1 ); + fprintf( trap_g, "group2 = %s\n", indication2 ); + fflush( trap_g ); + } + +#endif +#if 0 + printf( "STEP %d-%d-%d\n", iterate, l, k ); + for( i=0; i %f, tscore = %f\n", tmpdouble, oimpmatch, impmatch, tscore ); + } + else + { + if( smalldistmtx ) +#if 1 + intergroup_score_multimtx( whichmtx, scoringmatrices, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); +#else + intergroup_score_dynmtx( smalldistmtx, amino_dis, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); +#endif + else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + tscore = tmpdouble; + } +// fprintf( stderr, "#######ii=%d, iterate=%d score = %f -> %f \n", ii, iterate , mscore, tscore ); + #if 0 + for( i=0; i<1; i++ ) + fprintf( stderr, "%s\n", mseq1[i] ); + fprintf( stderr, "+++++++\n" ); + for( i=0; i<1; i++ ) + fprintf( stderr, "%s\n", mseq2[i] ); + #endif + + } + else + { + tscore = mscore + 1.0; +// tscore = 0.0; +// fprintf( stderr, "in line 705, tscore=%f\n", tscore ); +// for( i=0; i 0 ) + { + if( parallelizationstrategy == BESTFIRST ) + { + if( gain > gainlist[thread_no] ) + { + gainlist[thread_no] = gain; + for( i=0; imutex ); + for( i=0; imutex ); + tscorelist[thread_no] = tscore; + } +#if 0 + fprintf( stderr, "tscore = %f mscore = %f accepted.\n", tscore, mscore ); + fprintf( stderr, "\nbetter! gain = %f (thread %d)\r", gain, thread_no ); +#else + fprintf( stderr, "%03d-%04d-%d (thread %4d) better \r", iterate+1, *ndonept, k, thread_no ); +#endif + + } + else + { +#if 0 + fprintf( stderr, "tscore = %f mscore = %f rejected.\r", tscore, mscore ); + fprintf( stderr, "worse! gain = %f", gain ); +#else + fprintf( stderr, "%03d-%04d-%d (thread %4d) worse \r", iterate+1, *ndonept, k, thread_no ); +#endif + tscore = mscore; + } + } +#if FULLSCORE + { + int j; + double fullscore = 0.0; + for( i=1; i=0; ii-=1 ) + { +// fprintf( stderr, "Checking tscorehistory %f ?= %f\n", tscore, tscorehistory_detail[ii][branchpos] ); + if( tscore == tscorehistory_detail[ii][branchpos] ) + { + converged2 = 1; + break; + } + } + if( parallelizationstrategy != BESTFIRST && converged2 ) + { +// fprintf( stderr, "\nFINISH!\n" ); + pthread_mutex_lock( targ->mutex ); + *finishpt = 1; + pthread_mutex_unlock( targ->mutex ); + } + + tscorehistory_detail[iterate][branchpos] = tscore; + fprintf( stderr, "\r" ); + + pthread_mutex_lock( targ->mutex ); + (*ndonept)++; +// fprintf( stderr, "*ndonept = %d, nbranch = %d (thread %d) iterate=%d\n", *ndonept, nbranch, thread_no, iterate ); + generationofinput[branchpos] = iterate; + if( *ndonept == nbranch ) + { + if( *collectingpt != -1 ) *collectingpt = 1; // chofuku +// fprintf( stderr, "Thread %d sends a signal, *ndonept = %d\n", thread_no, *ndonept ); + pthread_cond_signal( targ->collection_start ); + } + pthread_mutex_unlock( targ->mutex ); + } /* while( 1 ) */ + + } /* for( iterate ) */ +// return( NULL ); +} +#endif + + +int TreeDependentIteration( int locnjob, char **name, int nlen[M], + char **aseq, char **bseq, int ***topol, double **len, + double **distmtx, + int **skipthisbranch, + int alloclen, LocalHom **localhomtable, + RNApair ***singlerna, + int nkozo, char *kozoarivec, + int ntarget, int *targetmap, int *targetmapr ) +{ + int i, j, k, l, iterate, ii, iu, ju; + int lin, ldf, length; + int clus1, clus2; + int s1, s2; + static double **imanoten; + static Node *stopol; + static double *distarr = NULL; + static double *effarrforlocalhom = NULL; + static double *effarr = NULL; + static double *effarr1 = NULL; + static double *effarr2 = NULL; + static double *effarr_kozo = NULL; + static double *effarr1_kozo = NULL; + static double *effarr2_kozo = NULL; + static double **mtx = NULL; + static int **node = NULL; + static int *branchnode = NULL; + static double **branchWeight = NULL; + static char **mseq1, **mseq2; + static double ***history; + FILE *trap; + double tscore, mscore; + int identity; + int converged; + int oscillating; +// double naivescore0 = 0.0; // by D.Mathog, a guess +// double naivescore1; +#if 0 + char pair[njob][njob]; +#else + static int **memlist; + static char *pairbuf; +#endif +#if DEBUG + RECORD + double score_for_check0, score_for_check1; + static double **effmtx = NULL; + extern double score_calc0(); +#endif + static char *indication1, *indication2; + static LocalHom ***localhomshrink = NULL; + static char *swaplist = NULL; + double impmatchdouble = 0.0; + double oimpmatchdouble = 0.0; + static int *gapmap1; + static int *gapmap2; + double tmpdouble; + int intdum; + static RNApair *rnapairboth; + RNApair ***grouprna1, ***grouprna2; + double unweightedspscore; + static double **smalldistmtx; + static double ***scoringmatrices; + static double **eff1s, **eff2s; + static int **whichmtx; + int value; + + if( rnakozo && rnaprediction == 'm' ) + { + grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + } + else + { + grouprna1 = grouprna2 = NULL; + } + + Writeoptions( trap_g ); + fflush( trap_g ); + + if( effarr == NULL ) /* locnjob == njob ni kagiru */ + { + indication1 = AllocateCharVec( 150 ); + indication2 = AllocateCharVec( 150 ); + effarr = AllocateDoubleVec( locnjob ); + distarr = AllocateDoubleVec( locnjob ); + effarrforlocalhom = AllocateDoubleVec( locnjob ); + effarr1 = AllocateDoubleVec( locnjob ); + effarr2 = AllocateDoubleVec( locnjob ); + mseq1 = AllocateCharMtx( locnjob, 0 ); + mseq2 = AllocateCharMtx( locnjob, 0 ); + mtx = AllocateDoubleMtx( locnjob, locnjob ); + node = AllocateIntMtx( locnjob, locnjob ); + branchnode = AllocateIntVec( locnjob ); + branchWeight = AllocateDoubleMtx( locnjob, 2 ); + history = AllocateFloatCub( niter, locnjob, 2 ); + stopol = (Node *)calloc( locnjob * 2, sizeof( Node ) ); + gapmap1 = AllocateIntVec( alloclen ); + gapmap2 = AllocateIntVec( alloclen ); + if( score_check == 2 ) imanoten = AllocateDoubleMtx( njob, njob ); + if( specificityconsideration != 0 ) + { + smalldistmtx = AllocateDoubleMtx( locnjob, locnjob ); // ookii? + scoringmatrices = AllocateDoubleCub( maxdistclass, nalphabets, nalphabets ); + makescoringmatrices( scoringmatrices, n_dis_consweight_multi ); + eff1s = AllocateDoubleMtx( maxdistclass, locnjob ); + eff2s = AllocateDoubleMtx( maxdistclass, locnjob ); + whichmtx = AllocateIntMtx( locnjob, locnjob ); + } + else + { + smalldistmtx = NULL; + scoringmatrices = NULL; + eff1s = eff2s = NULL; + whichmtx = NULL; + } + + effarr1_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru. + effarr2_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru. + effarr_kozo = AllocateDoubleVec( locnjob ); + for( i=0; i 2 && ( weight == 4 || weight == 0 ) ) + { + treeCnv( stopol, locnjob, topol, len, branchWeight ); + calcBranchWeight( branchWeight, locnjob, stopol, topol, len ); // IRU!!! + } + } + +#ifdef enablemultithread + if( nthread > 0 ) + { + threadarg_t *targ; + pthread_t *handle; + pthread_mutex_t mutex; + pthread_cond_t collection_end; + pthread_cond_t collection_start; + int jobposint; + int generationofmastercopy; + int subgeneration; + double basegain; + int *generationofinput; + double *gainlist; + double *tscorelist; + int ndone; + int ntry; + int collecting; + int nbranch; + int maxiter; + char ***candidates; + int *branchtable; + double **tscorehistory_detail; + int finish; + + nwa = nthread + 1; + nbranch = (njob-1) * 2 - 1; + maxiter = niter; + + targ = calloc( nwa, sizeof( threadarg_t ) ); + handle = calloc( nwa, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + pthread_cond_init( &collection_end, NULL ); + pthread_cond_init( &collection_start, NULL ); + + gainlist = calloc( nwa, sizeof( double ) ); + tscorelist = calloc( nwa, sizeof( double ) ); + branchtable = calloc( nbranch, sizeof( int ) ); + generationofinput = calloc( nbranch, sizeof( int ) ); + if( parallelizationstrategy == BESTFIRST ) + candidates = AllocateCharCub( nwa, locnjob, alloclen ); + for( i=0; i 2 && ( weight == 4 || weight == 0 ) ) + { + treeCnv( stopol, locnjob, topol, len, branchWeight ); + calcBranchWeight( branchWeight, locnjob, stopol, topol, len ); // IRU!!! + } + trap = fopen( "hat2", "w" ); + if( !trap ) ErrorExit( "Cannot open hat2." ); + WriteHat2_pointer( trap, locnjob, name, mtx ); + fclose( trap ); + if( constraint ) + { + counteff_simple( locnjob, topol, len, effarrforlocalhom ); + if( ntarget < locnjob ) + calcimportance_target( locnjob, ntarget, effarrforlocalhom, aseq, localhomtable, targetmap, targetmapr, alloclen ); + else + calcimportance_half( locnjob, effarrforlocalhom, aseq, localhomtable, alloclen ); + } + } + + if( iterate % 2 == 0 ) + { + lin = 0; ldf = +1; + } + else + { + lin = locnjob - 2; ldf = -1; + } + + if( score_check == 2 ) + { + effarr1[0] = 1.0; + effarr2[0] = 1.0; + length = strlen( bseq[0] ); + for( i=0; i= 0 ; l+=ldf ) + { + + + for( k=0; k<2; k++ ) + { + if( l == locnjob-2 ) k = 1; +#else + + for( jobpos=0; jobpos=0; i-- ) oimpmatchdouble += (double)part_imp_match_out_sc( i, i ); + } + } + else + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else + { + imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + fprintf( stderr, "not supported\n" ); + exit( 1 ); + } + } + // fprintf( stderr, "### oimpmatch = %f\n", oimpmatch ); + } + else + { + oimpmatchdouble = 0.0; + } +#if 0 + tmpdouble = 0.0; + iu=0; + for( i=s1; i>> + oimpmatchdouble = 0.0; + if( use_fft ) + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else if( alg == 'd' ) + { + imp_match_init_strictD( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + + for( i=length-1; i>=0; i-- ) + { + oimpmatchdouble += (double)imp_match_out_scD( i, i ); + // fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + else + { + part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1] ); + if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL ); + for( i=length-1; i>=0; i-- ) + { + oimpmatchdouble += (double)part_imp_match_out_sc( i, i ); + // fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + // fprintf( stderr, "otmpmatch = %f\n", oimpmatch ); + } + else + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else + { + imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + + fprintf( stderr, "not supported\n" ); + exit( 1 ); + + for( i=length-1; i>=0; i-- ) + { + oimpmatchdouble += (double)imp_match_out_sc( i, i ); + // fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + // fprintf( stderr, "otmpmatch = %f\n", oimpmatch ); + } + // fprintf( stderr, "#### initial impmatch = %f\n", oimpmatch ); + } + else + { + if( RNAscoremtx == 'r' ) + intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame + else + { + if( smalldistmtx ) +#if 1 + intergroup_score_multimtx( whichmtx, scoringmatrices, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); +#else + intergroup_score_dynmtx( offsetmtx, amino_dis, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // n_dis ha machigai +#endif + else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame + } + oimpmatchdouble = 0.0; + } + + + // fprintf( stderr, "#### tmpdouble = %f\n", tmpdouble ); + mscore = oimpmatchdouble + tmpdouble; + } + else + { +// fprintf( stderr, "score_check = %d\n" ); +#if 1 + /* Oscilation check no tame hitsuyou! atode kousokuka */ + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + mscore = tmpdouble; + /* atode kousokuka */ +#else + mscore = 0.0; +#endif + + if( constraint ) + { + oimpmatchdouble = 0.0; +// shrinklocalhom( pair, s1, s2, localhomtable, localhomshrink ); + if( ntarget < locnjob ) + msshrinklocalhom_fast_target( memlist[0], memlist[1], localhomtable, localhomshrink, swaplist, targetmap ); + else + msshrinklocalhom_fast_half( memlist[0], memlist[1], localhomtable, localhomshrink ); + if( use_fft ) + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else if( alg == 'd' ) + { + imp_match_init_strictD( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + if( rnakozo ) imp_rnaD( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL ); + } + else + { + part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1] ); + if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL ); + } + } + else + { + if( alg == 'Q' ) + { + fprintf( stderr, "'Q' is no longer supported\n" ); + exit( 1 ); + } + else + { + imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, memlist[0], memlist[1], NULL, NULL, NULL, -1, 0 ); + fprintf( stderr, "Not supported\n" ); + exit( 1 ); + } + } + } + } + + // oimpmatch = 0.0; + if( constraint ) + { + #if 0 // iranai + if( alg == 'Q' ) + { + imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); + for( i=length-1; i>=0; i-- ) + { + oimpmatch += imp_match_out_scQ( i, i ); + // fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + else + { + imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 ); + for( i=length-1; i>=0; i-- ) + { + oimpmatch += imp_match_out_sc( i, i ); + // fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] ); + } + } + #endif + } + #if 0 + if( alg == 'H' ) + naivescore0 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch; + else if( alg == 'Q' ) + naivescore0 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch; + else if( alg == 'R' ) + naivescore0 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch; + #endif + + // if( rnakozo ) foldalignedrna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, rnapairboth ); + + // if( !use_fft && !rnakozo ) +// if( !use_fft ) + if( !use_fft ) + { + commongappick_record( clus1, mseq1, gapmap1 ); + commongappick_record( clus2, mseq2, gapmap2 ); + } + + #if 0 + fprintf( stderr, "##### mscore = %f\n", mscore ); + #endif + + #if DEBUG + if( !devide ) + { + fprintf( trap_g, "\nSTEP%d-%d-%d\n", iterate+1, l+1, k ); + fprintf( trap_g, "group1 = %s\n", indication1 ); + fprintf( trap_g, "group2 = %s\n", indication2 ); + fflush( trap_g ); + } + + #endif + #if 0 + printf( "STEP %d-%d-%d\n", iterate, l, k ); + for( i=0; i fullscore ) + { + for( i=0; igroup1\n%s\n", mseq1[i] ); + for( i=0; igroup2\n%s\n", mseq2[i] ); + + + for( i=0; ibetter alignment\n%s\n", bseq[i] ); + exit( 1 ); + } + } +#endif + + length = strlen( mseq1[0] ); + + if( identity ) + { + tscore = mscore; + if( !devide ) fprintf( trap_g, "tscore = %f identical.\n", tscore ); + fprintf( stderr, " identical. " ); + converged++; + } + else + { + if( score_check ) + { + if( constraint == 2 ) + { + #if 1 + if( RNAscoremtx == 'r' ) + intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + #else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + #endif + + tscore = impmatchdouble + tmpdouble; + + // fprintf( stderr, "tmpdouble=%f, impmatch = %f -> %f, tscore = %f\n", tmpdouble, oimpmatch, impmatch, tscore ); + } + else + { + if( smalldistmtx ) +#if 1 + intergroup_score_multimtx( whichmtx, scoringmatrices, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); +#else + intergroup_score_dynmtx( offsetmtx, amino_dis, mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // n_dis ha machigai +#endif + else + intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); + tscore = tmpdouble; + } + // fprintf( stderr, "#######ii=%d, iterate=%d score = %f -> %f \n", ii, iterate , mscore, tscore ); + #if 0 + for( i=0; i<1; i++ ) + fprintf( stderr, "%s\n", mseq1[i] ); + fprintf( stderr, "+++++++\n" ); + for( i=0; i<1; i++ ) + fprintf( stderr, "%s\n", mseq2[i] ); + #endif + + } + else + { + tscore = mscore + 1.0; + // tscore = 0.0; + // fprintf( stderr, "in line 705, tscore=%f\n", tscore ); + // for( i=0; i mscore - cut/100.0*mscore ) + { + writePre( locnjob, name, nlen, aseq, 0 ); + for( i=0; i= locnjob * 2 ) + { + fprintf( trap_g, "Converged.\n\n" ); + fprintf( stderr, "\nConverged.\n\n" ); + if( scoreout ) + { + unweightedspscore = plainscore( njob, bseq ); + fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore ); + fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) ); + if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" ); + fprintf( stderr, "\n\n" ); + } + value = 0; + goto end; + } + if( iterate >= 1 ) + { + /* oscillation check */ + oscillating = 0; + for( ii=iterate-2; ii>=0; ii-=2 ) + { + if( (double)tscore == history[ii][l][k] ) + { + oscillating = 1; + break; + } + } + if( ( oscillating && !cooling ) || ( oscillating && cut < 0.001 && cooling ) ) + { + fprintf( trap_g, "Oscillating.\n" ); + fprintf( stderr, "\nOscillating.\n\n" ); + if( scoreout ) + { + unweightedspscore = plainscore( njob, bseq ); + fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore ); + fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) ); + if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" ); + fprintf( stderr, "\n\n" ); + } + #if 1 /* hujuubun */ + value = -1; + goto end; + #endif + } + } /* if( iterate ) */ + } /* for( k ) */ + } /* for( l ) */ + if( scoreout ) + { + unweightedspscore = plainscore( njob, bseq ); + fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore ); + fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) ); + if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" ); + fprintf( stderr, "\n\n" ); + } + } /* for( iterate ) */ + } + value = 2; + + end: + if( grouprna1 ) free( grouprna1 ); + if( grouprna2 ) free( grouprna2 ); +// freelocalarrays +// ( +// NULL, +// grouprna1, grouprna2, +// rnapairboth, +// indication1, indication2, +// distarr, +// effarr, effarrforlocalhom, effarr1, effarr2, +// mseq1, mseq2, +// NULL, +// gapmap1, gapmap2, +// effarr1_kozo, effarr2_kozo, effarr_kozo, +// memlist, pairbuf, +// localhomshrink, +// smalldistmtx, +// scoringmatrices, +// eff1s, eff2s, +// whichmtx +// ); +// free( branchnode ); +// free( stopol ); + return( value ); +} /* int Tree... */ diff --git a/mafft/src/mafft-7.487-with-extensions/core/treeOperation.c b/mafft/src/mafft-7.487-with-extensions/core/treeOperation.c new file mode 100644 index 0000000000..5413daa395 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/core/treeOperation.c @@ -0,0 +1,742 @@ +#include "mltaln.h" + +#define DEBUG 0 + +#define EF_THREEWAY 1.0 +#define MAXBW 1.0 +#define MINBW 0.01 + +#define MINLEN 0.001 + +#if DEBUG +Node *stopol_g; +#endif + + +void checkMinusLength( int nseq, double **len ) +{ + int i, j; + for( i=0; i= 0 ) + { + free( tmpintvec[numintvec] ); + } + free( tmpintvec ); + numintvec = 0; +#endif +} + +void treeCnv( Node *stopol, int locnseq, int ***topol, double **len, double **bw ) +{ + int i; + NodeInCub parent; + int *count; + int ccount; + int rep; + int tmpint; + static int **tmpintvec = NULL; + static int numintvec = 0; + + count = AllocateIntVec( 2 * locnseq ); /* oome */ + if( !count ) ErrorExit( "Cannot allocate count.\n" ); + + checkMinusLength( locnseq, len ); /* uwagaki */ + + stopolInit( locnseq * 2, stopol ); + for( i=0; ilength[0] ); + } + + for( i=0, count=0; i<3; i++ ) + { +#if DEBUG + fprintf( stderr, "ob->tmpChildren[%d] = %d\n", i, ob->tmpChildren[i] ); +#endif + if( oppositeNode != ob->children[i] ) dir_ch[count++] = i; + else dir_pa = i; + } +#if DEBUG + fprintf( stderr, "\n" ); +#endif + if( count != 2 ) + { +#if DEBUG + fprintf( stderr, "Node No.%d has no child like No.%d \n", ob-stopol_g, oppositeNode-stopol_g ); +#endif + ErrorExit( "Invalid call\n" ); + } + + tmpvalue0 = syntheticLength( ob->children[dir_ch[0]], ob ); + tmpvalue1 = syntheticLength( ob->children[dir_ch[1]], ob ); + +#if DEBUG + fprintf( stderr, "tmpvalue0 = %f\n", tmpvalue0 ); + fprintf( stderr, "tmpvalue1 = %f\n", tmpvalue1 ); +#endif + if( tmpvalue0 ) tmpvalue0 = 1.0 / tmpvalue0; + else nanflag = 1; + if( tmpvalue1 ) tmpvalue1 = 1.0 / tmpvalue1; + else nanflag = 1; + + if( nanflag ) value = 0.0; + else + { + value = tmpvalue0 + tmpvalue1; + value = 1.0 / value; + } + value += ob->length[dir_pa]; +#if DEBUG + fprintf( stderr, "value = %f\n", value ); +#endif + + return( value ); +} + +double calcW( Node *ob, Node *op ) +{ + int i, count; + int dir_ch[3]; + int dir_pa = -10; // by katoh + double a, b, c, f, s; + double value; + + if( isLeaf( *ob ) ) + return( 1.0 ); + + for( i=0, count=0; i<3; i++ ) + { + if( op != ob->children[i] ) dir_ch[count++] = i; + else dir_pa = i; + } + if( count != 2 ) ErrorExit( "Invalid call of calcW\n" ); + +#if DEBUG + fprintf( stderr, "In calcW\n" ); + fprintf( stderr, "ob = %d\n", ob - stopol_g ); + fprintf( stderr, "op = %d\n", op - stopol_g ); + fprintf( stderr, "ob->children[c1] = %d\n", ob->children[dir_ch[0]] - stopol_g ); + fprintf( stderr, "ob->children[c2] = %d\n", ob->children[dir_ch[1]] - stopol_g ); + fprintf( stderr, "ob->children[pa] = %d\n", ob->children[dir_pa] - stopol_g ); + fprintf( stderr, "\n" ); +#endif + + a = syntheticLength( ob->children[dir_ch[0]], ob ); + b = syntheticLength( ob->children[dir_ch[1]], ob ); + c = syntheticLength( ob->children[dir_pa], ob ); + +#if DEBUG + fprintf( stderr, "a = %f\n", a ); + fprintf( stderr, "b = %f\n", b ); + fprintf( stderr, "c = %f\n", c ); +#endif + + if( !c ) return( MAXBW ); + if ( !a || !b ) return( MINBW ); /* ? */ + + f = EF_THREEWAY; + s = ( b*c + c*a + a*b ); + + value = a*b*(c+a)*(c+b) / ( c*(a+b) * f * s ); + + value = sqrt( value ); + + return( value ); +} + +void calcBranchWeight( double **bw, int locnseq, Node *stopol, int ***topol, double **len ) +{ + NodeInCub parent; + int i; + int rep; + Node *topNode, *btmNode; + double topW, btmW; + + for( i=locnseq; ichildren[i] != op ) dir_ch[count++] = i; + else dir_pa = i; + } + if( count != 2 ) + { +#if DEBUG + fprintf( stderr, "Node No.%d has no child like No.%d \n", ob-stopol_g, op-stopol_g ); +#endif + ErrorExit( "Incorrect call of distFromABranch_rec" ); + } + for( i=0; (n=ob->members[dir_ch[0]][i])!=-1; i++ ) + { + result[n] += ob->length[dir_ch[0]]; + } + distFromABranch_rec( result, ob->children[dir_ch[0]], ob ); + + for( i=0; (n=ob->members[dir_ch[1]][i])!=-1; i++ ) + { + result[n] += ob->length[dir_ch[1]]; + } + distFromABranch_rec( result, ob->children[dir_ch[1]], ob ); +} + +void distFromABranch( int nseq, double *result, Node *stopol, int ***topol, double **len, int step, int LorR ) +{ + Node *topNode, *btmNode; + int i; + + if( nseq == 2 ) + { + result[0] = len[0][0]; + result[1] = len[0][1]; +// reporterr( "result[0] = %f\n", result[0] ); +// reporterr( "result[1] = %f\n", result[1] ); + return; + } + + if( step == nseq - 2 ) + { + topNode = stopol[nseq-2].children[0]; + btmNode = stopol + nseq-3; +#if DEBUG + fprintf( stderr, "Now step == nseq-3, topNode = %d, btmNode = %d\n", topNode - stopol_g, btmNode-stopol_g ); +#endif + } + + else + { + for( i=0; i<3; i++ ) + { + if( stopol[step].members[i][0] == topol[step][LorR][0] ) + break; + } + if( i== 3 ) ErrorExit( "Incorrect call of distFromABranch." ); + btmNode = stopol[step].children[i]; + topNode = stopol+step; + } + + for( i=0; ichildren[i] != op ) dir_ch[count++] = i; + else dir_pa = i; + } + if( count != 2 ) + { +#if DEBUG + fprintf( stderr, "Node No.%d has no child like No.%d \n", ob-stopol_g, op-stopol_g ); +#endif + ErrorExit( "Incorrect call of weightFromABranch_rec" ); + } + for( i=0; (n=ob->members[dir_ch[0]][i])!=-1; i++ ) + result[n] *= *ob->weightptr[dir_ch[0]]; + weightFromABranch_rec( result, ob->children[dir_ch[0]], ob ); + + for( i=0; (n=ob->members[dir_ch[1]][i])!=-1; i++ ) + result[n] *= *ob->weightptr[dir_ch[1]]; + weightFromABranch_rec( result, ob->children[dir_ch[1]], ob ); +} + +void weightFromABranch( int nseq, double *result, Node *stopol, int ***topol, int step, int LorR ) +{ + Node *topNode, *btmNode; + int i; + + if( step == nseq - 2 ) + { + topNode = stopol[nseq-2].children[0]; + btmNode = stopol + nseq-3; +#if DEBUG + fprintf( stderr, "Now step == nseq-3, topNode = %d, btmNode = %d\n", topNode - stopol_g, btmNode-stopol_g ); +#endif + } + + else + { + for( i=0; i<3; i++ ) + { + if( stopol[step].members[i][0] == topol[step][LorR][0] ) + break; + } + if( i== 3 ) ErrorExit( "Incorrect call of weightFromABranch." ); + btmNode = stopol[step].children[i]; + topNode = stopol+step; + } + + for( i=0; ichildren[i] != op ) dir_ch[count++] = i; + else dir_pa = i; + } + if( count != 2 ) + { +#if DEBUG + fprintf( stderr, "Node No.%d has no child like No.%d \n", ob-stopol_g, op-stopol_g ); +#endif + ErrorExit( "Incorrect call of weightFromABranch_rec" ); + } + + +// fprintf( stderr, "\n" ); + sumweight = 0.0; + count = 0; + lastkozo = -1; + for( i=0; (n=ob->members[dir_ch[0]][i])!=-1; i++ ) + { +// fprintf( stderr, "member1! n=%d\n", n ); + sumweight += seqweight[n]; + if( kozoari[n] ) + { + count++; + lastkozo = n; + } + } + for( i=0; (n=ob->members[dir_ch[1]][i])!=-1; i++ ) + { +// fprintf( stderr, "member2! n=%d\n", n ); + sumweight += seqweight[n]; + if( kozoari[n] ) + { + count++; + lastkozo = n; + } + } + +// fprintf( stderr, "count = %d\n", count ); + + if( count == 1 ) + strweight[lastkozo] = sumweight; + else if( count > 1 ) + { + assignstrweight_rec( strweight, ob->children[dir_ch[0]], ob, kozoari, seqweight ); + assignstrweight_rec( strweight, ob->children[dir_ch[1]], ob, kozoari, seqweight ); + } +} + +void assignstrweight( int nseq, double *strweight, Node *stopol, int ***topol, int step, int LorR, char *kozoari, double *seqweight ) +{ + Node *topNode, *btmNode; + int i; + + if( step == nseq - 2 ) + { + topNode = stopol[nseq-2].children[0]; + btmNode = stopol + nseq-3; +#if DEBUG + fprintf( stderr, "Now step == nseq-3, topNode = %d, btmNode = %d\n", topNode - stopol_g, btmNode-stopol_g ); +#endif + } + + else + { + for( i=0; i<3; i++ ) + { + if( stopol[step].members[i][0] == topol[step][LorR][0] ) + break; + } + if( i== 3 ) ErrorExit( "Incorrect call of weightFromABranch." ); + btmNode = stopol[step].children[i]; + topNode = stopol+step; + } + + for( i=0; i-1; i++ ) + fprintf( stderr, "%3d ", topol[step][0][i] ); + fprintf( stderr, "\n" ); + for( i=0; topol[step][1][i]>-1; i++ ) + fprintf( stderr, "%3d ", topol[step][1][i] ); + fprintf( stderr, "\n" ); + for( i=0; i univscript + + +mxscarnamod: $(SCARNASRC) + $(MAKE) CFLAGS1="$(MNO_CYGWIN)" -C mxscarna_src + mv mxscarna_src/mxscarna mxscarnamod + + +clean : + rm -f *.o *.a *.exe *~ $(PROGS) +# rm -f ../binaries/* ../scripts/* + $(MAKE) clean -C mxscarna_src + +install : all + mkdir -p $(DESTDIR)$(LIBDIR) + chmod 755 $(DESTDIR)$(LIBDIR) + chmod 755 $(PROGS) + $(INSTALL) $(PROGS) $(DESTDIR)$(LIBDIR) diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/compileoncygwin b/mafft/src/mafft-7.487-with-extensions/extensions/compileoncygwin new file mode 100644 index 0000000000..322992543d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/compileoncygwin @@ -0,0 +1,13 @@ +rm -rf binaries64/ +mkdir binaries64/ +make clean +rm -f ../binaries/* +make CXX=x86_64-w64-mingw32-g++ CXXFLAGS="-static -O3" +cp mxscarnamod.exe binaries64/ + +rm -rf binaries32/ +mkdir binaries32/ +make clean +rm -f ../binaries/* +make CXX=i686-w64-mingw32-g++ CXXFLAGS="-static -O3" +cp mxscarnamod.exe binaries32/ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.cpp new file mode 100644 index 0000000000..340353f8f1 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.cpp @@ -0,0 +1,211 @@ +#include "AlifoldMEA.h" + +namespace MXSCARNA{ + +const int AlifoldMEA::TURN = 3; + +void +AlifoldMEA:: +Run() +{ + makeProfileBPPMatrix(alignment); + Initialization(); + DP(); + TraceBack(); +} + +void +AlifoldMEA:: +makeProfileBPPMatrix(const MultiSequence *Sequences) +{ + int length = Sequences->GetSequence(0)->GetLength(); + + Trimat *consBppMat = new Trimat(length + 1); + fill(consBppMat->begin(), consBppMat->end(), 0); + + for(int i = 1; i <= length; i++) + for (int j = i; j <= length; j++) + bppMat.ref(i, j) = 0; + + + int number = Sequences->GetNumSequences(); + for(int seqNum = 0; seqNum < number; seqNum++) { + SafeVector *tmpMap = Sequences->GetSequence(seqNum)->GetMappingNumber(); + int label = Sequences->GetSequence(seqNum)->GetLabel(); + BPPMatrix *tmpBppMatrix = BPPMatrices[label]; + + for(int i = 1; i <= length ; i++) { + int originI = tmpMap->at(i); + for(int j = i; j <= length; j++) { + int originJ = tmpMap->at(j); + if(originI != 0 && originJ != 0) { + float tmpProb = tmpBppMatrix->GetProb(originI, originJ); + bppMat.ref(i, j) += tmpProb; + } + } + } + } + + /* compute the mean of base pairing probability */ + for(int i = 1; i <= length; i++) { + for(int j = i; j <= length; j++) { + bppMat.ref(i,j) = bppMat.ref(i,j)/(float)number; + } + } + + for (int i = 1; i <= length; i++) { + float sum = 0; + for (int j = i; j <= length; j++) { + sum += bppMat.ref(i,j); + } + Qi[i] = 1 - sum; + } + + for (int i = 1; i <= length; i++) { + float sum = 0; + for (int j = i; j >= 1; j--) { + sum += bppMat.ref(j, i); + } + Qj[i] = 1 - sum; + } +} + +void +AlifoldMEA:: +Initialization() +{ + int length = alignment->GetSequence(0)->GetLength(); + + for (int i = 1; i <= length; i++) { + for (int j = i; j <= length; j++) { + M.ref(i,j) = 0; + traceI.ref(i,j) = 0; + traceJ.ref(i,j) = 0; + } + } + + for (int i = 1; i <= length; i++) { + M.ref(i,i) = Qi[i]; + traceI.ref(i,i) = 0; + traceJ.ref(i,i) = 0; + } + + for (int i = 1; i <= length - 1; i++) { + M.ref(i, i+1) = Qi[i+1]; + traceI.ref(i,i + 1) = 0; + traceJ.ref(i,i + 1) = 0; + } + + for (int i = 0; i <= length; i++) { + ssCons[i] = '.'; + } +} + +void +AlifoldMEA:: +DP() +{ + float g = BasePairConst; // see scarna.hpp + int length = alignment->GetSequence(0)->GetLength(); + + for (int i = length - 1; i >= 1; i--) { + for (int j = i + TURN + 1; j <= length; j++) { + float qi = Qi[i]; + float qj = Qj[j]; + float p = bppMat.ref(i,j); + + + float maxScore = qi + M.ref(i+1, j); + int tmpI = i+1; + int tmpJ = j; + + float tmpScore = qj + M.ref(i, j-1); + if (tmpScore > maxScore) { + maxScore = tmpScore; + tmpI = i; + tmpJ = j - 1; + } + + tmpScore = g*2*p + M.ref(i+1, j-1); + if (tmpScore > maxScore) { + maxScore = tmpScore; + tmpI = i + 1; + tmpJ = j - 1; + } + + for (int k = i + 1; k < j - 1; k++) { + tmpScore = M.ref(i,k) + M.ref(k+1,j); + if (tmpScore > maxScore) { + maxScore = tmpScore; + tmpI = i; + tmpJ = j; + } + } + M.ref(i,j) = maxScore; + traceI.ref(i, j) = tmpI; + traceJ.ref(i, j) = tmpJ; + } + } +} + +void +AlifoldMEA:: +TraceBack() +{ + + int length = alignment->GetSequence(0)->GetLength(); + SafeVector stackI((length + 1)*(length+1)); + SafeVector stackJ((length + 1)*(length+1)); + int pt = 0; + + stackI[pt] = traceI.ref(1, length); + stackJ[pt] = traceJ.ref(1, length); + ++pt; + + while(pt != 0) { + --pt; + int tmpI = stackI[pt]; + int tmpJ = stackJ[pt]; + int nextI = traceI.ref(tmpI, tmpJ); + int nextJ = traceJ.ref(tmpI, tmpJ); + + if (tmpI < tmpJ) { + if (tmpI + 1 == nextI && tmpJ == nextJ) { + stackI[pt] = nextI; + stackJ[pt] = nextJ; + ++pt; + } + else if (tmpI == nextI && tmpJ - 1 == nextJ) { + stackI[pt] = nextI; + stackJ[pt] = nextJ; + ++pt; + } + else if (tmpI + 1 == nextI && tmpJ - 1== nextJ) { + stackI[pt] = nextI; + stackJ[pt] = nextJ; + ++pt; + ssCons[tmpI] = '('; + ssCons[tmpJ] = ')'; + } + else if (tmpI == nextI && tmpJ == nextJ) { + float maxScore = IMPOSSIBLE; + int maxK = 0; + + for (int k = tmpI + 1; k < tmpJ - 1; k++) { + float tmpScore = M.ref(tmpI,k) + M.ref(k+1,tmpJ); + if (tmpScore > maxScore) { + maxScore = tmpScore; + maxK = k; + } + } + stackI[pt] = traceI.ref(tmpI, maxK); + stackJ[pt] = traceJ.ref(tmpI, maxK); + ++pt; + stackI[pt] = traceI.ref(maxK+1, tmpJ); + stackJ[pt] = traceJ.ref(maxK+1, tmpJ); + ++pt; + } + } + } +} +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.h new file mode 100644 index 0000000000..02c06c55e3 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/AlifoldMEA.h @@ -0,0 +1,63 @@ +#ifndef _ALIFOLDMEA_H_ +#define _ALIFOLDMEA_H_ + +#include +#include +#include +#include "scarna.hpp" +#include "nrutil.h" +#include "Util.hpp" +#include "Beta.hpp" +#include "BPPMatrix.hpp" +#include "MultiSequence.h" +#include "Sequence.h" +#include "SafeVector.h" + +using namespace std; + +namespace MXSCARNA { +class AlifoldMEA { + MultiSequence *alignment; + SafeVector BPPMatrices; + float BasePairConst; + Trimat M; + Trimat traceI; + Trimat traceJ; + Trimat bppMat; + NRVec Qi; + NRVec Qj; + NRVec ssCons; + + static const int TURN; + + void Initialization(); + void makeProfileBPPMatrix(const MultiSequence *Sequences); + void DP(); + void TraceBack(); + public: + AlifoldMEA(MultiSequence *inalignment, SafeVector &inBPPMatrices, float inBasePairConst = 6) : + alignment(inalignment), BPPMatrices(inBPPMatrices), + BasePairConst(inBasePairConst), + M(inalignment->GetSequence(0)->GetLength()+1), + traceI(inalignment->GetSequence(0)->GetLength()+1), + traceJ(inalignment->GetSequence(0)->GetLength()+1), + bppMat(inalignment->GetSequence(0)->GetLength() + 1), + Qi(inalignment->GetSequence(0)->GetLength() + 1), + Qj(inalignment->GetSequence(0)->GetLength() + 1), + ssCons(inalignment->GetSequence(0)->GetLength() + 1){} + + void Run(); + + string *getSScons() { + string *sscons = new string(); + sscons->push_back(' '); + int length = alignment->GetSequence(0)->GetLength(); + for (int i = 1; i <= length; i++) { + sscons->push_back(ssCons[i]); + } + + return sscons; + } +}; +} +#endif // _ALIFOLDMEA_H_ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/BPPMatrix.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/BPPMatrix.hpp new file mode 100644 index 0000000000..1c16ed7af9 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/BPPMatrix.hpp @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////// +// BPPMatrix.hpp +// +// save the Base Pairing Probability Matrix for each sequences +////////////////////////////////////////////////////////////// + +#ifndef __BBPMatrix_HPP__ +#define __BBPMatrix_HPP__ + +#include +#include +#include "SparseMatrix.h" +#include "McCaskill.hpp" +#include "nrutil.h" + + + +using namespace std; + +namespace MXSCARNA{ +class BPPMatrix { +private: + + int seqLength; // sequence length; + float cutOff; // the threshold of probability + + BPPMatrix() {} +public: + SparseMatrix bppMat; // base pairing probability matrix 1-origin(1..seqLength) + BPPMatrix(int bppmode, const string &seq, int seqLength, float inCutOff = 0.0001) : seqLength (seqLength), cutOff(inCutOff) { + if( bppmode == 'r' ) // by katoh + readBPPMatrix(seq); + else if( bppmode == 'w' ) + setandwriteBPPMatrix(seq); + else + setBPPMatrix(seq); + } + BPPMatrix(int seqLength, float inCutOff, const Trimat & tmpBppMat) : seqLength(seqLength), cutOff(inCutOff) { + bppMat.SetSparseMatrix(seqLength, seqLength, tmpBppMat, cutOff); + } + + + void setBPPMatrix(const string &seq) { + const char *tmpSeq = seq.c_str(); + McCaskill mc(seqLength, &tmpSeq[1]); + mc.calcPartitionFunction(); + Trimat tmpBppMat(seqLength + 1); + + for (int i = 0; i < seqLength; i++) { + for(int j = i; j < seqLength; j++) { + tmpBppMat.ref(i+1, j+1) = mc.getProb(i,j); + } + } + bppMat.SetSparseMatrix(seqLength, seqLength, tmpBppMat, cutOff); + } + + void setandwriteBPPMatrix(const string &seq) { // by katoh + const char *tmpSeq = seq.c_str(); + McCaskill mc(seqLength, &tmpSeq[1]); + mc.calcPartitionFunction(); + Trimat tmpBppMat(seqLength + 1); + float tmpbp; + + fprintf( stdout, ">\n" ); + for (int i = 0; i < seqLength; i++) { + for(int j = i; j < seqLength; j++) { + tmpbp = mc.getProb(i,j); + if (tmpbp > 0.0001) + fprintf( stdout, "%d %d %50.40f\n", i, j, tmpbp ); + tmpBppMat.ref(i+1, j+1) = tmpbp; + } + } + bppMat.SetSparseMatrix(seqLength, seqLength, tmpBppMat, cutOff); + } + + void readBPPMatrix(const string &seq) { // by katoh + const char *tmpSeq = seq.c_str(); + char oneline[1000]; + int onechar; + float prob; + int posi, posj; + static FILE *bppfp = NULL; + + + if( bppfp == NULL ) + { + bppfp = fopen( "_bpp", "r" ); + if( bppfp == NULL ) + { + fprintf( stderr, "Cannot open _bpp.\n" ); + exit( 1 ); + } + } + + Trimat tmpBppMat(seqLength + 1); + fgets( oneline, 999, bppfp ); + if( oneline[0] != '>' ) + { + fprintf( stderr, "Format error\n" ); + exit( 1 ); + } + while( 1 ) + { + onechar = getc( bppfp ); + ungetc( onechar, bppfp ); + if( onechar == '>' || onechar == EOF ) break; + + fgets( oneline, 999, bppfp ); + sscanf( oneline, "%d %d %f", &posi, &posj, &prob ); +// fprintf( stderr, "%d %d -> %f\n", posi, posj, prob ); + tmpBppMat.ref(posi+1, posj+1) = prob; + } + + bppMat.SetSparseMatrix(seqLength, seqLength, tmpBppMat, cutOff); + } + + float GetProb(int i, int j) { + return bppMat.GetValue(i,j); + } + + float GetLength() const { + return seqLength; + } + + void updateBPPMatrix(const Trimat &inbppMat) { + bppMat.SetSparseMatrix(seqLength, seqLength, inbppMat, cutOff); + } +}; +} +#endif // __BPPMatrix_HPP__ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Beta.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Beta.hpp new file mode 100644 index 0000000000..f1e77a45fb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Beta.hpp @@ -0,0 +1,201 @@ +/* + * + * Beta.hpp + * + */ +#ifndef BETA_HPP +#define BETA_HPP +using namespace std; + +struct Beta { + static const int NBASE = 4;// A, C, G, U + static const int NBASEG = (NBASE + 1); // A, C, G, U, Gap + static const int NBASENG = (NBASE + 2); // A, C, G, U, N, Gap + static const int NPBASE = (NBASE * NBASE); + static const int NPBASEG = (NBASEG * NBASEG); + static const int NPBASENG = (NBASENG * NBASENG); + static const int NCODE = 7; + static const int BASEBIT = 2; + static const int BASEMSK = ~(~0 << BASEBIT); + enum BaseCode { + A_CODE = 0, + C_CODE = 1, + G_CODE = 2, + U_CODE = 3, + N_CODE = 4, + GAP_CODE = 5, + INVALID_CODE = 16 + }; + enum PairCode { + AA_CODE = 0, AC_CODE = 1, AG_CODE = 2, AU_CODE = 3, + CA_CODE = 4, CC_CODE = 5, CG_CODE = 6, CU_CODE = 7, + GA_CODE = 8, GC_CODE = 9, GG_CODE = 10, GU_CODE = 11, + UA_CODE = 12, UC_CODE = 13, UG_CODE = 14, UU_CODE = 15, + INVALID_PAIR_CODE = 16 + }; + enum ReducedPairCode { + REDUCED_NPBASE = 7, + REDUCED_AU_CODE = 0, + REDUCED_CG_CODE = 1, + REDUCED_GC_CODE = 2, + REDUCED_GU_CODE = 3, + REDUCED_UA_CODE = 4, + REDUCED_UG_CODE = 5, + REDUCED_MM_CODE = 6, + REDUCED_INVALID_PAIR_CODE = 16 + }; + + static const int N_CANONICAL = 6; + static const int canonicalPairs[N_CANONICAL]; + static const int N_NON_CANONICAL = 10; + static const int nonCanonicalPairs[N_NON_CANONICAL]; + static const int i2nt[NCODE]; + static const int nt2i[256]; + static const bool isCanonicalBasePair[NPBASE]; + + static bool IsValidCode(const int& c) {return A_CODE <= c && c <= GAP_CODE;} + static bool IsBaseCode(const int& c) {return (A_CODE <= c && c <= U_CODE);} + static bool IsBasePairCode(const int& c){return (AA_CODE <= c && c <= UU_CODE);} + static bool IsReducedBasePairCode(const int& c) { + return (REDUCED_AU_CODE <= c && c <= REDUCED_MM_CODE); + } + static bool IsAmbiguousCode(const int& c) {return c == N_CODE;} + static bool IsGapCode(const int& c) {return c == GAP_CODE;} + static bool IsValidChar(const unsigned char& c) { + return IsValidCode(nt2i[c]); + } + static bool IsBaseChar(const int& c) {return IsBaseCode(nt2i[c]);} + static bool IsAmbiguousChar(const int& c) {return IsAmbiguousCode(nt2i[c]);} + static bool IsGapChar(const int& c) {return IsGapCode(nt2i[c]);} + static int nt2code(const int& nt) { + if (0 <= nt && nt < 256) { + return nt2i[nt]; + } else { + return INVALID_CODE; + } + } + static int getPairCode(const int& c, const int& c1) { + return (IsBaseCode(c) && IsBaseCode(c1) + ? ((c << BASEBIT) | c1) + : INVALID_PAIR_CODE); + } + static bool isValidPairCode(const int& pairCode) { + return (0 <= pairCode && pairCode < NPBASE); + } + static void pair2Bases(const int& pairCode, int& c, int& c1) { + //Assert(IsBasePairCode(pairCode)); + c1 = pairCode & BASEMSK; + c = (pairCode >> BASEBIT) & BASEMSK; + } + static int getReducedPairCode(const int& c, const int& c1) { + return reducePairCode(getPairCode(c, c1)); + } + static int reducePairCode(const int& pairCode) { + static const int table[NPBASE] = { + REDUCED_MM_CODE, REDUCED_MM_CODE, REDUCED_MM_CODE, REDUCED_AU_CODE, + REDUCED_MM_CODE, REDUCED_MM_CODE, REDUCED_CG_CODE, REDUCED_MM_CODE, + REDUCED_MM_CODE, REDUCED_GC_CODE, REDUCED_MM_CODE, REDUCED_GU_CODE, + REDUCED_UA_CODE, REDUCED_MM_CODE, REDUCED_UG_CODE, REDUCED_MM_CODE, + }; + return (IsBasePairCode(pairCode) + ? table[pairCode] + : REDUCED_INVALID_PAIR_CODE); + } + static bool isValidReducedPairCode(const int& pairCode) { + return (0 <= pairCode && pairCode < REDUCED_NPBASE); + } + static bool isCanonicalReducedPairCode(const int& pairCode) { + return (REDUCED_AU_CODE <= pairCode + && pairCode <= REDUCED_UG_CODE); + } + static int flipReducedPairCode(const int& reducedPairCode) { + static const int table[REDUCED_NPBASE + 1] = { + REDUCED_UA_CODE, + REDUCED_GC_CODE, + REDUCED_CG_CODE, + REDUCED_UG_CODE, + REDUCED_AU_CODE, + REDUCED_GU_CODE, + REDUCED_MM_CODE, + REDUCED_INVALID_PAIR_CODE + }; + return (IsReducedBasePairCode(reducedPairCode) + ? table[reducedPairCode] : table[REDUCED_NPBASE]); + } + static void seq2i(char* s, const char* t, int len) { + const char* const s_end = s + len; + while (s < s_end) *s++ = nt2i[(unsigned) (*t++)]; + } + static void i2seq(char* s, const char* t, int len) { + const char* const s_end = s + len; + while (s < s_end) *s++ = i2nt[(unsigned) (*t++)]; + } + static void i2seq(ostream& fo, const char* t, int len) { + const char* const t_end = t + len; + while (t < t_end) fo << (char) i2nt[(unsigned) (*t++)]; + } + static char* wd2str(unsigned int wdSize, unsigned int wd) { + const unsigned int MAX_WD_SIZE = (sizeof(unsigned int) * 8 / BASEBIT); + static char buf[MAX_WD_SIZE + 1] = {}; + //Assert(wdSize <= MAX_WD_SIZE); + + char* s = buf + wdSize; + *s = '\0'; + do { + *(--s) = Beta::i2nt[wd & BASEMSK]; + wd >>= BASEBIT; + } while (s > buf); + return buf; + } + static void printWd(ostream& fo, unsigned int wdSize, unsigned int wd) { + fo << wd2str(wdSize, wd); + } + static const char* code2str(const int& code) { + static const char table[NBASENG+1][2] = { + "A", "C", "G", "U", "N", ".", "?" + }; + return ((A_CODE <= code && code <= GAP_CODE) + ? table[code] : table[NBASENG]); + } + static const char* pairCode2str(const int& pairCode) { + static const char table[NPBASE+1][3] = { + "AA", "AC", "AG", "AU", + "CA", "CC", "CG", "CU", + "GA", "GC", "GG", "GU", + "UA", "UC", "UG", "UU", + "??" + }; + return (IsBasePairCode(pairCode) ? table[pairCode] : table[NPBASE]); + } + static const char* reducedPairCode2str(const int& reducedPairCode) { + static const char table[REDUCED_NPBASE+1][3] = { + "AU", "CG", "GC", "GU", "UA", "UG", "MM", "??" + }; + return (IsReducedBasePairCode(reducedPairCode) + ? table[reducedPairCode] : table[REDUCED_NPBASE]); + } + static char nt2Code(const char& c){ + if (!IsValidChar(c)) { cerr << "character " << c << " is not valid"; } + + return (char) nt2i[(int) c]; + } + static char code2char(const int& c) { + static const char table[NBASENG+1] = { + 'A', 'C', 'G', 'U', 'N', '.', '?' + }; + return ((A_CODE <= c && c <= GAP_CODE) + ? table[(int) c] : table[NBASENG]); + } + /* + static string generateRandomRNA(const int& len) { + static const char nt[5] = "ACGU"; + string rna(len, '\0'); + for (int i = 0; i < len; i++) { + rna[i] = nt[Rand(4)]; + } + return rna; + } + */ +}; + +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/GlobalParameters.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/GlobalParameters.cpp new file mode 100644 index 0000000000..4d32c8e1a3 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/GlobalParameters.cpp @@ -0,0 +1,27 @@ +////////////////////////////////////////////////////////////// +// GlobalParameters.cpp +// This file include Global Parameters, command line options, etc. +////////////////////////////////////////////////////////////// + +#include "scarna.hpp" + +// These paramenters are defined in scarna.hpp + +float RNA_Match_AA = RNAMATCHAA; +float RNA_Match_AT = RNAMATCHAT; +float RNA_Match_AG = RNAMATCHAG; +float RNA_Match_AC = RNAMATCHAC; +float RNA_Match_TT = RNAMATCHTT; +float RNA_Match_TG = RNAMATCHTG; +float RNA_Match_TC = RNAMATCHTC; +float RNA_Match_GG = RNAMATCHGG; +float RNA_Match_GC = RNAMATCHGC; +float RNA_Match_CC = RNAMATCHCC; +float RNA_Gap_Penalty = GAPPENALTY; +float RNA_Gap_Extension = GAPEXTENTIONPENALTY; + +int numIterativeRefinementReps = REFINEMENTREPS; +bool PostProcessAlignment = false; +int scsLength = SCSLENGTH; +float BaseProbThreshold = BASEPROBTHRESHOLD; +float BasePairConst = BASEPAIRCONST; diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.cpp new file mode 100644 index 0000000000..daabff4dbf --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.cpp @@ -0,0 +1,557 @@ +#include "Globaldp.hpp" + +namespace MXSCARNA { + +double Globaldp::ribosum_matrix[16][16] += { { -2.49, -7.04, -8.24, -4.32, -8.84, -14.37, -4.68, -12.64, -6.86, -5.03, -8.39, -5.84, -4.01, -11.32, -6.16, -9.05 }, + { -7.04, -2.11, -8.89, -2.04, -9.37, -9.08, -5.86, -10.45, -9.73, -3.81, -11.05, -4.72, -5.33, -8.67, -6.93, -7.83 }, + { -8.24, -8.89, -0.80, -5.13, -10.41, -14.53, -4.57, -10.14, -8.61, -5.77, -5.38, -6.60, -5.43, -8.87, -5.94, -11.07 }, + { -4.32, -2.04, -5.13, 4.49, -5.56, -6.71, 1.67, -5.17, -5.33, 2.70, -5.61, 0.59, 1.61, -4.81, -0.51, -2.98 }, + { -8.84, -9.37, -10.41, -5.56, -5.13, -10.45, -3.57, -8.49, -7.98, -5.95, -11.36, -7.93, -2.42, -7.08, -5.63, -8.39 }, + { -14.37, -9.08, -14.53, -6.71, -10.45, -3.59, -5.71, -5.77, -12.43, -3.70, -12.58, -7.88, -6.88, -7.40, -8.41, -5.41 }, + { -4.68, -5.86, -4.57, 1.67, -3.57, -5.71, 5.36, -4.96, -6.00, 2.11, -4.66, -0.27, 2.75, -4.91, 1.32, -3.67 }, + { -12.64, -10.45, -10.14, -5.17, -8.49, -5.77, -4.96, -2.28, -7.71, -5.84, -13.69, -5.61, -4.72, -3.83, -7.36, -5.21 }, + { -6.86, -9.73, -8.61, -5.33, -7.98, -12.43, -6.00, -7.71, -1.05, -4.88, -8.67, -6.10, -5.85, -6.63, -7.55, -11.54 }, + { -5.03, -3.81, -5.77, 2.70, -5.95, -3.70, 2.11, -5.84, -4.88, 5.62, -4.13, 1.21, 1.60, -4.49, -0.08, -3.90 }, + { -8.39, -11.05, -5.38, -5.61, -11.36, -12.58, -4.66, -13.69, -8.67, -4.13, -1.98, -5.77, -5.75, -12.01, -4.27, -10.79 }, + { -5.84, -4.72, -6.60, 0.59, -7.93, -7.88, -0.27, -5.61, -6.10, 1.21, -5.77, 3.47, -0.57, -5.30, -2.09, -4.45 }, + { -4.01, -5.33, -5.43, 1.61, -2.42, -6.88, 2.75, -4.72, -5.85, 1.60, -5.75, -0.57, 4.97, -2.98, 1.14, -3.39 }, + { -11.32, -8.67, -8.87, -4.81, -7.08, -7.40, -4.91, -3.83, -6.63, -4.49, -12.01, -5.30, -2.98, -3.21, -4.76, -5.97 }, + { -6.16, -6.93, -5.94, -0.51, -5.63, -8.41, 1.32, -7.36, -7.55, -0.08, -4.27, -2.09, 1.14, -4.76, 3.36, -4.28 }, + { -9.05, -7.83, -11.07, -2.98, -8.39, -5.41, -3.67, -5.21, -11.54, -3.90, -10.79, -4.45, -3.39, -5.97, -4.28, -0.02 } +}; + + +Trimat* +Globaldp:: +makeProfileBPPMatrix(const MultiSequence *Sequences) +{ + int length = Sequences->GetSequence(0)->GetLength(); + float thr = THR; + Trimat *consBppMat = new Trimat(length + 1); + fill(consBppMat->begin(), consBppMat->end(), 0); + + int number = Sequences->GetNumSequences(); + for(int seqNum = 0; seqNum < number; seqNum++) { + SafeVector *tmpMap = Sequences->GetSequence(seqNum)->GetMappingNumber(); + int label = Sequences->GetSequence(seqNum)->GetLabel(); + BPPMatrix *tmpBppMatrix = BPPMatrices[label]; + + for(int i = 1; i <= length ; i++) { + int originI = tmpMap->at(i); + for(int j = i; j <= length; j++) { + int originJ = tmpMap->at(j); + if(originI != 0 && originJ != 0) { + float tmpProb = tmpBppMatrix->GetProb(originI, originJ); + + if(tmpProb >= thr) { + consBppMat->ref(i, j) += tmpProb; + } + } + } + } + } + + /* compute the mean of base pairing probability */ + for(int i = 1; i <= length; i++) { + for(int j = i; j <= length; j++) { + consBppMat->ref(i,j) = consBppMat->ref(i,j)/(float)number; + } + } + + return consBppMat; +} + +float +Globaldp:: +incrementalScorePSCPair(const StemCandidate &sc1, const StemCandidate &sc2) +{ + int wordLength = WORDLENGTH; + + int pos1, rvpos1; + if (sc1.GetDistance() > 0) { + pos1 = sc1.GetPosition(); + rvpos1 = sc1.GetRvposition(); + } + else { + pos1 = sc1.GetRvposition(); + rvpos1 = sc1.GetPosition(); + } + + int pos2, rvpos2; + if (sc2.GetDistance() > 0) { + pos2 = sc2.GetPosition(); + rvpos2 = sc2.GetRvposition(); + } + else { + pos2 = sc2.GetRvposition(); + rvpos2 = sc2.GetPosition(); + } +/* + cout << "1:" << i << " " << j << " " << sc1.GetDistance() << " " << sc2.GetDistance() << endl; + cout << sc1.GetPosition() << " " << sc1.GetRvposition() << " " << sc2.GetPosition() << " " << sc2.GetRvposition() << endl; +*/ + float score = + posterior[sc1.GetPosition() + wordLength - 1][sc2.GetPosition() + wordLength - 1] +// * sc1.GetBaseScore(wordLength - 1) + * profileBPPMat1->ref(pos1 + wordLength - 1, rvpos1) + * posterior[sc1.GetRvposition()][sc2.GetRvposition()] +// * sc2.GetBaseScore(wordLength - 1); + * profileBPPMat2->ref(pos2 + wordLength - 1, rvpos2); + + +/* + incrementalWordSimilarity(sc1, sc2, i, j) + + incrementalProbabilityScore(sc1, sc2) * multiDeltaScore + + incrementalStackingScore(sc1, sc2) * multiDeltaStacking; +*/ + + return score*sc1.GetNumSeq()*sc2.GetNumSeq(); +} + +float +Globaldp:: +incrementalProbabilityScore(const StemCandidate &sc1, const StemCandidate &sc2) +{ + int wordLength = WORDLENGTH; + return sc1.GetBaseScore(wordLength-1) + sc2.GetBaseScore(wordLength-1); +} + +float +Globaldp:: +incrementalStackingScore(const StemCandidate &sc1, const StemCandidate &sc2) +{ + return - (sc1.GetStacking() + sc2.GetStacking()); +} + +float +Globaldp:: +incrementalWordSimilarity(const StemCandidate &sc1, const StemCandidate &sc2, int i, int j) +{ + int numSeq1 = sc1.GetNumSeq(); + int numSeq2 = sc2.GetNumSeq(); + + float score = 0; + + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 16; l++) { + score += countContConp1[k][i]*countContConp2[l][j]*ribosum_matrix[k][l]; + } + } + + return score/(numSeq1*numSeq2); +} + +float +Globaldp:: +scorePSCPair(const StemCandidate &sc1, const StemCandidate &sc2) +{ + + + int wordLength = WORDLENGTH; + float score = 0; + + int pos1, rvpos1; + if (sc1.GetDistance() > 0) { + pos1 = sc1.GetPosition(); + rvpos1 = sc1.GetRvposition(); + } + else { + pos1 = sc1.GetRvposition(); + rvpos1 = sc1.GetPosition(); + } + + int pos2, rvpos2; + if (sc2.GetDistance() > 0) { + pos2 = sc2.GetPosition(); + rvpos2 = sc2.GetRvposition(); + } + else { + pos2 = sc2.GetRvposition(); + rvpos2 = sc2.GetPosition(); + } + + for (int k = 0; k < wordLength; k++) { + score += + posterior[sc1.GetPosition() + k][sc2.GetPosition() + k] + * profileBPPMat1->ref(pos1 + k, rvpos1 + wordLength - 1 - k) +// * sc1.GetBaseScore(k) + * posterior[sc1.GetRvposition() + wordLength - 1 - k][sc2.GetRvposition() + wordLength - 1 - k] +// * sc2.GetBaseScore(k); + * profileBPPMat2->ref(pos2 + k, rvpos2 + wordLength - 1 - k); + } + // validation code + /* + if (profileBPPMat1->ref(pos1 , rvpos1 + wordLength - 1) != sc1.GetBaseScore(0)) { + cout << "1 " << profileBPPMat1->ref(pos1, rvpos1 + wordLength - 1) << " " << sc1.GetBaseScore(0) << endl; + } + if (profileBPPMat2->ref(pos2, rvpos2 + wordLength - 1) != sc2.GetBaseScore(0)) { + cout << profileBPPMat2->ref(pos2, rvpos2 + wordLength - 1) << " " << sc2.GetBaseScore(0) << endl; + } + if (profileBPPMat1->ref(pos1 + 1, rvpos1 + wordLength - 1 - 1) != sc1.GetBaseScore(1)) { + cout << "1 " << profileBPPMat1->ref(pos1 + 1, rvpos1 + wordLength - 1 - 1) << " " << sc1.GetBaseScore(1) << endl; + } + if (profileBPPMat2->ref(pos2 + 1, rvpos2 + wordLength - 1 - 1) != sc2.GetBaseScore(1)) { + cout << profileBPPMat2->ref(pos2 + 1, rvpos2 + wordLength - 1 - 1) << " " << sc2.GetBaseScore(1) << endl; + }*/ + +// cout << sc1.GetPosition() << " " << sc1.GetRvposition() << " " << sc1.GetDistance() << endl; +// cout << sc2.GetPosition() << " " << sc2.GetRvposition() << " " << sc2.GetDistance() << endl; +/* + wordSimilarity(sc1, sc2, i, j) + + probabilityScore(sc1, sc2) * multiScore + + stackingScore(sc1, sc2) * multiStacking + +*/ +/* + if (sc1.GetDistance() < 0 && sc2.GetDistance() < 0) { + cout << "2:" << i << " " << j << " " << sc1.GetDistance() << " " << sc2.GetDistance() << endl; + cout << sc1.GetPosition() << " " << sc1.GetRvposition() << " " << sc2.GetPosition() << " " << sc2.GetRvposition() << endl; + cout << "2:score" << score << endl; + + } +*/ + return score*sc1.GetNumSeq()*sc2.GetNumSeq(); +} + +float +Globaldp:: +wordSimilarity(const StemCandidate &sc1, const StemCandidate &sc2, int i, int j) +{ + int wordLength = WORDLENGTH; + + int numSeq1 = sc1.GetNumSeq(); + int numSeq2 = sc2.GetNumSeq(); + + float score = 0; + + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 16; l++) { + for(int iter = 0; iter < wordLength; iter++) { + score += countConp1[iter][k][i]*countConp2[iter][l][j]*ribosum_matrix[k][l]; + } + } + } + + return score/(numSeq1*numSeq2); +} + +int +Globaldp:: +returnBasePairType(char s, char r) +{ + if (s == 'A') { + if (r == 'A') return 0; + else if (r == 'C') return 1; + else if (r == 'G') return 2; + else if (r == 'U') return 3; + } + else if (s == 'C') { + if (r == 'A') return 4; + else if (r == 'C') return 5; + else if (r == 'G') return 6; + else if (r == 'U') return 7; + } + else if (s == 'G') { + if (r == 'A') return 8; + else if (r == 'C') return 9; + else if (r == 'G') return 10; + else if (r == 'U') return 11; + } + else if (s == 'U') { + if (r == 'A') return 12; + else if (r == 'C') return 13; + else if (r == 'G') return 14; + else if (r == 'U') return 15; + } + + return 16; +} + +float +Globaldp:: +probabilityScore(const StemCandidate &sc1, const StemCandidate &sc2) +{ + return sc1.GetScore() + sc2.GetScore(); +} + +float +Globaldp:: +stackingScore(const StemCandidate &sc1, const StemCandidate &sc2) +{ + return - (sc1.GetStemStacking() + sc2.GetStemStacking()); +} + +float +Globaldp:: +distancePenalty(const StemCandidate &sc1, const StemCandidate &sc2) +{ + return std::sqrt((float)std::abs(sc1.GetDistance() - sc2.GetDistance())); +} + +float +Globaldp:: +Run() +{ + Initialize(); + DP(); + float score = traceBack(); + + // printMatch(); + //cout << "score=" << score << endl; + return score; +} + +void +Globaldp:: +Initialize() +{ + int nPscs1 = pscs1->size(); + int nPscs2 = pscs2->size(); + + + for(int i = 0; i < nPscs1; i++) { + for(int j = 0; j < nPscs2; j++) { + VM[i][j] = 0; + VG[i][j] = 0; + } + } + + VM[0][0] = 0; + VG[0][0] = IMPOSSIBLE; + + for (int i = 1; i < nPscs1; i++) { + VM[i][0] = IMPOSSIBLE; VG[i][0] = 0; + } + for (int j = 1; j < nPscs2; j++) { + VM[0][j] = IMPOSSIBLE; VG[0][j] = 0; + } + + for (int i = 0; i < nPscs1; i++) { + for (int j = 0; j < nPscs2; j++) { + traceMI[i][j] = 0; traceMJ[i][j] = 0; + traceGI[i][j] = 0; traceGJ[i][j] = 0; + } + } + + int wordLength = WORDLENGTH; + int size1 = pscs1->size(); + int size2 = pscs2->size(); + + for(int i = 0; i < wordLength; i++) { + for(int j = 0; j < 17; j++) { + for(int k = 0; k < (int)pscs1->size(); k++) { + countConp1[i][j][k] = 0; + } + } + } + for(int i = 0; i < wordLength; i++) { + for(int j = 0; j < 17; j++) { + for(int k = 0; k < (int)pscs2->size(); k++) { + countConp2[i][j][k] = 0; + } + } + } + for(int i = 0; i < 17; i++) { + for(int j = 0; j < (int)pscs1->size()+1; j++) { + countContConp1[i][j] = 0; + } + } + for(int i = 0; i < 17; i++) { + for(int j = 0; j < (int)pscs2->size()+1; j++) { + countContConp2[i][j] = 0; + } + } + + for(int iter = 1; iter < size1; iter++) { + + const StemCandidate &sc1 = pscs1->at(iter); + int numSeq1 = sc1.GetNumSeq(); + for (int i = 0; i < wordLength; i++) { + + for(int k = 0; k < numSeq1; k++) { +// const Sequence *seq = seqs1->GetSequence(k); + string substr = sc1.GetSubstr(k); + string rvstr = sc1.GetRvstr(k); + + char sChar = substr[i]; + char rChar = rvstr[wordLength - 1 -i]; + + int type = returnBasePairType(sChar, rChar); + ++countConp1[i][type][iter]; + } + } + for(int k = 0; k < numSeq1; k++) { +// const Sequence *seq = seqs1->GetSequence(k); + string substr = sc1.GetSubstr(k); + string rvstr = sc1.GetRvstr(k); + + char sChar = substr[wordLength-1]; + char rChar = rvstr[0]; + + int type = returnBasePairType(sChar, rChar); + ++countContConp1[type][iter]; + + } + } + for(int iter = 1; iter < size2; iter++) { + const StemCandidate &sc2 = pscs2->at(iter); + int numSeq2 = sc2.GetNumSeq(); + for (int i = 0; i < wordLength; i++) { + + for(int k = 0; k < numSeq2; k++) { +// const Sequence *seq = seqs2->GetSequence(k); + string substr = sc2.GetSubstr(k); + string rvstr = sc2.GetRvstr(k); + + char sChar = substr[i]; + char rChar = rvstr[wordLength - 1 -i]; + + int type = returnBasePairType(sChar, rChar); + ++countConp2[i][type][iter]; + } + } + for(int k = 0; k < numSeq2; k++) { +// const Sequence *seq = seqs2->GetSequence(k); + string substr = sc2.GetSubstr(k); + string rvstr = sc2.GetRvstr(k); + + char sChar = substr[wordLength-1]; + char rChar = rvstr[0]; + + int type = returnBasePairType(sChar, rChar); + ++countContConp2[type][iter]; + + } + } + profileBPPMat1 = makeProfileBPPMatrix(seqs1); + profileBPPMat2 = makeProfileBPPMatrix(seqs2); +} + +void +Globaldp:: +DP() +{ + int nPscs1 = pscs1->size(); + int nPscs2 = pscs2->size(); + + for(int i = 1; i < nPscs1; i++) { + const StemCandidate &sc1 = pscs1->at(i); + + for(int j = 1; j < nPscs2; j++) { + const StemCandidate &sc2 = pscs2->at(j); + + float max = IMPOSSIBLE; + int traceI = 0; + int traceJ = 0; + int alpha = sc1.GetContPos(), beta = sc2.GetContPos(); + if( (alpha > 0) && (beta > 0) ) { + max = VM[alpha][beta] + incrementalScorePSCPair(sc1, sc2); + traceI = alpha; + traceJ = beta; + } + + float similarity = scorePSCPair(sc1, sc2); + int p = sc1.GetBeforePos(), q = sc2.GetBeforePos(); + float tmpScore = VM[p][q] + similarity; +// cout << i << " " << j << " " << p << " " << q << " " << tmpScore << " " << VM[p][q] << " " << similarity << " " << endl; + + if(max <= tmpScore) { + max = tmpScore; + traceI = p; + traceJ = q; + } + + tmpScore = VG[p][q] + similarity; + if(max <= tmpScore) { + max = tmpScore; + traceI = traceGI[p][q]; + traceJ = traceGJ[p][q]; + } + + VM[i][j] = max; + traceMI[i][j] = traceI; + traceMJ[i][j] = traceJ; + + max = VM[i][j-1]; + traceI = i; + traceJ = j-1; + + tmpScore = VM[i-1][j]; + if(max <= tmpScore) { + max = tmpScore; + traceI = i-1; + traceJ = j; + } + + tmpScore = VG[i-1][j]; + if(max <= tmpScore) { + max = tmpScore; + traceI = traceGI[i-1][j]; + traceJ = traceGJ[i-1][j]; + } + + tmpScore = VG[i][j-1]; + if(max <= tmpScore) { + max = tmpScore; + traceI = traceGI[i][j-1]; + traceJ = traceGJ[i][j-1]; + } + + VG[i][j] = max; + traceGI[i][j] = traceI; + traceGJ[i][j] = traceJ; + } + } +} + +float +Globaldp:: +traceBack() +{ + int nPscs1 = pscs1->size(); + int nPscs2 = pscs2->size(); + + float max = IMPOSSIBLE; + int traceI, traceJ; + for (int i = 1; i < nPscs1; i++) { + for (int j = 1; j < nPscs2; j++) { + if(max < VM[i][j]) { + max = VM[i][j]; + traceI = i; + traceJ = j; + } + } + } + + while ( (traceI != 0) && (traceJ != 0) ) { + matchPSCS1->push_back(traceI); matchPSCS2->push_back(traceJ); + int tmpI = traceMI[traceI][traceJ]; + int tmpJ = traceMJ[traceI][traceJ]; + traceI = tmpI; traceJ = tmpJ; + } + + if(traceI != 0 && traceJ != 0) { + std::cout << "error in trace back of pscs:" << traceI << " " << traceJ << endl; + } + + return max; +} + +void +Globaldp:: +printMatch() +{ + int size = matchPSCS1->size(); + for(int iter = 0; iter < size; iter++) { + int i = matchPSCS1->at(iter); + int j = matchPSCS2->at(iter); + + const StemCandidate &sc1 = pscs1->at(i); + const StemCandidate &sc2 = pscs2->at(j); + + std::cout << iter << "\t" << sc1.GetPosition() << "\t" << sc1.GetRvposition() << "\t" << sc2.GetPosition() << "\t" << sc2.GetRvposition() << endl; + } + +} +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.hpp new file mode 100644 index 0000000000..ba3e06f371 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Globaldp.hpp @@ -0,0 +1,109 @@ +//////////////////////////////////////////////////////////////// +// Globaldp.hpp +// Global Alignment of two profile computed by SCARNA algorithm +//////////////////////////////////////////////////////////////// + + +#ifndef __GLOBALDP_HPP__ +#define __GLOBALDP_HPP__ + +#include +#include +#include "nrutil.h" +#include "Util.hpp" +#include "Beta.hpp" +#include "scarna.hpp" +#include "StemCandidate.hpp" +#include "MultiSequence.h" +#include "Sequence.h" +#include "BPPMatrix.hpp" + +using namespace ProbCons; +using namespace std; +namespace MXSCARNA { + +typedef std::vector stemcandidate; +class Globaldp { +private: + static double ribosum_matrix[16][16]; + + NRMat VM, VG; + NRMat traceMI, traceMJ, traceGI, traceGJ; + + const stemcandidate *pscs1, *pscs2; + const MultiSequence *seqs1, *seqs2; + std::vector *matchPSCS1, *matchPSCS2; + SafeVector &BPPMatrices; + NRMat posterior; + NRMat3d countConp1, countConp2; + NRMat countContConp1, countContConp2; + Trimat *profileBPPMat1; + Trimat *profileBPPMat2; + float multiDeltaScore; + float multiDeltaStacking; + float multiScore; + float multiStacking; + float multiPenalty; + + float scorePSCPair(const StemCandidate &sc1, const StemCandidate &sc2); + float wordSimilarity(const StemCandidate &sc1, const StemCandidate &sc2, int i, int j); + int returnBasePairType(char s, char r); + float probabilityScore(const StemCandidate &sc1, const StemCandidate &sc2); + float stackingScore(const StemCandidate &sc1, const StemCandidate &sc2); + float distancePenalty(const StemCandidate &sc1, const StemCandidate &sc2); + float incrementalScorePSCPair(const StemCandidate &sc1, const StemCandidate &sc2); + float incrementalProbabilityScore(const StemCandidate &sc1, const StemCandidate &sc2); + float incrementalStackingScore(const StemCandidate &sc1, const StemCandidate &sc2); + float incrementalWordSimilarity(const StemCandidate &sc1, const StemCandidate &sc2, int i, int j); + Trimat* makeProfileBPPMatrix(const MultiSequence *Sequences); + + void Initialize(); + void DP(); + float traceBack(); + void printMatch(); +public: + + Globaldp(const stemcandidate *mypscs1, const stemcandidate *mypscs2, + const MultiSequence *myseqs1, const MultiSequence *myseqs2, + std::vector *matchPSCS1, std::vector *matchPSCS2, + VF *myPosterior, SafeVector &myBPPMatrices, + float myMultiDeltaScore = MULTIDELTASCORE, float myMultiDeltaStacking = MULTIDELTASTACKING, + float myMultiScore = MULTISCORE, float myMultiStacking = MULTISTACKING, + float myMultiPenalty = MULTIPENALTY) + : VM(mypscs1->size(), mypscs2->size()), + VG(mypscs1->size(), mypscs2->size()), + traceMI(mypscs1->size(), mypscs2->size()), + traceMJ(mypscs1->size(), mypscs2->size()), + traceGI(mypscs1->size(), mypscs2->size()), + traceGJ(mypscs1->size(), mypscs2->size()), + pscs1(mypscs1), pscs2(mypscs2), + seqs1(myseqs1), seqs2(myseqs2), + matchPSCS1(matchPSCS1), matchPSCS2(matchPSCS2), + BPPMatrices(myBPPMatrices), posterior(myseqs1->GetSequence(0)->GetLength() + 1, myseqs2->GetSequence(0)->GetLength() + 1), + countConp1(WORDLENGTH, 17, mypscs1->size()+1), countConp2(WORDLENGTH, 17, mypscs2->size()+1), + countContConp1(0, 17, mypscs1->size()+1), countContConp2(0, 17, mypscs2->size()+1), + multiDeltaScore(myMultiDeltaScore), multiDeltaStacking(myMultiDeltaStacking), + multiScore(myMultiScore), multiStacking(myMultiStacking), + multiPenalty(myMultiPenalty) { + + VF::iterator myPosteriorPtr = myPosterior->begin(); + for (int i = 0; i <= seqs1->GetSequence(0)->GetLength(); i++) { + for (int j = 0; j <= seqs2->GetSequence(0)->GetLength(); j++) { + posterior[i][j] = (*myPosteriorPtr)/(seqs1->GetSequence(0)->GetLength()*seqs2->GetSequence(0)->GetLength()); + myPosteriorPtr++; + } + } + } + + + + float Run(); + + void setMultiDeltaScore(float score) { multiDeltaScore = score; } + void setMultiDeltaStacking(float score) { multiDeltaStacking = score; } + void setMultiScore(float score) { multiScore = score; } + void setMultiStacking(float score) { multiStacking = score; } + void setMultiPenalty(float score) { multiPenalty = score; } +}; +} +#endif // __GLOBALDP_HPP__ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Main.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Main.cc new file mode 100644 index 0000000000..75bc632b27 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Main.cc @@ -0,0 +1,1872 @@ +///////////////////////////////////////////////////////////////// +// Main.cc +// +// Main routines for MXSCARNA program. +///////////////////////////////////////////////////////////////// + +#include "scarna.hpp" +#include "SafeVector.h" +#include "MultiSequence.h" +#include "Defaults.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "EvolutionaryTree.h" +#include "SparseMatrix.h" +#include "BPPMatrix.hpp" +#include "StemCandidate.hpp" +#include "Globaldp.hpp" +#include "nrutil.h" +#include "AlifoldMEA.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "RfoldWrapper.hpp" +//static RFOLD::Rfold folder; + +using namespace::MXSCARNA; + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; +string weboutputFileName = ""; + +ofstream *outputFile; + +bool enableTraining = false; +bool enableVerbose = false; +bool enableAllPairs = false; +bool enableAnnotation = false; +bool enableViterbi = false; +bool enableClustalWOutput = false; +bool enableTrainEmissions = false; +bool enableAlignOrder = false; +bool enableWebOutput = false; +bool enableStockholmOutput = false; +bool enableMXSCARNAOutput = false; +bool enableMcCaskillMEAMode = false; +char bppmode = 's'; // by katoh +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; +int scsLength = SCSLENGTH; +float cutoff = 0; +float gapOpenPenalty = 0; +float gapContinuePenalty = 0; +float threshhold = 1.0; +float BaseProbThreshold = BASEPROBTHRESHOLD; +float BasePairConst = BASEPAIRCONST; +int BandWidth = BANDWIDTH; + +SafeVector sequenceNames; + +VF initDistrib (NumMatrixTypes); +VF gapOpen (2*NumInsertStates); +VF gapExtend (2*NumInsertStates); +VVF emitPairs (256, VF (256, 1e-10)); +VF emitSingle (256, 1e-5); + +string alphabet = alphabetDefault; + +string *ssCons = NULL; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +///////////////////////////////////////////////////////////////// +// Function prototypes +///////////////////////////////////////////////////////////////// + +void PrintHeading(); +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const VVF &emitPairs, const VF &emitSingle, const char *filename); +MultiSequence *DoAlign (MultiSequence *sequence, const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, VF &gapExtend, VVF &emitPairs, VF &emitSingle); +SafeVector ParseParams (int argc, char **argv); +void ReadParameters (); +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices); +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, SafeVector &BPPMatrices, float identity); +SafeVector > DoRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices); +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior); +void Relax1 (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior); +void DoBasePairProbabilityRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices, + SafeVector &BPPMatrices); +set GetSubtree (const TreeNode *tree); +void TreeBasedBiPartitioning (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + const TreeNode *tree, SafeVector &BPPMatrices); +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment); +void WriteAnnotation (MultiSequence *alignment, + const SafeVector > &sparseMatrices); +int ComputeScore (const SafeVector > &active, + const SafeVector > &sparseMatrices); +std::vector* seq2scs(MultiSequence *Sequences, SafeVector &BPPMatrices, int BandWidth); +void removeConflicts(std::vector *pscs1, std::vector *pscs2, std::vector *matchPSCS1, std::vector *matchPSCS2); + +struct prob { + int i; + int j; + float p; +}; + +///////////////////////////////////////////////////////////////// +// main() +// +// Calls all initialization routines and runs the MXSCARNA +// aligner. +///////////////////////////////////////////////////////////////// + + +int main (int argc, char **argv){ + + // print MXSCARNA heading + PrintHeading(); + + // parse program parameters + sequenceNames = ParseParams (argc, argv); + ReadParameters(); + PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + // now, we'll process all the files given as input. If we are given + // several filenames as input, then we'll load all of those sequences + // simultaneously, as long as we're not training. On the other hand, + // if we are training, then we'll treat each file as a separate + // training instance + + if (enableMcCaskillMEAMode) { + MultiSequence *sequences = new MultiSequence(); assert (sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++){ + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA (sequenceNames[i], true); + } + + const int numSeqs = sequences->GetNumSequences(); + SafeVector BPPMatrices; + + // compute the base pairing matrices for each sequences + for(int i = 0; i < numSeqs; i++) { + Sequence *tmpSeq = sequences->GetSequence(i); + string seq = tmpSeq->GetString(); + int n_seq = tmpSeq->GetLength(); + BPPMatrix *bppmat = new BPPMatrix(bppmode, seq, n_seq); // modified by katoh + BPPMatrices.push_back(bppmat); + } + if (bppmode=='w') exit( 0 ); + + AlifoldMEA alifold(sequences, BPPMatrices, BasePairConst); + alifold.Run(); + ssCons = alifold.getSScons(); + + if (enableStockholmOutput) { + sequences->WriteSTOCKHOLM (cout, ssCons); + } + else if (enableMXSCARNAOutput){ + sequences->WriteMXSCARNA (cout, ssCons); + } + else { + sequences->WriteMFA (cout, ssCons); + } + + delete sequences; + } + // if we are training + else if (enableTraining){ + + // build new model for aligning + ProbabilisticModel model (initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + // prepare to average parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] = 0; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] = 0; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] = 0; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] = 0; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] = 0; + } + + // align each file individually + for (int i = 0; i < (int) sequenceNames.size(); i++){ + + VF thisInitDistrib (NumMatrixTypes); + VF thisGapOpen (2*NumInsertStates); + VF thisGapExtend (2*NumInsertStates); + VVF thisEmitPairs (256, VF (256, 1e-10)); + VF thisEmitSingle (256, 1e-5); + + // load sequence file + MultiSequence *sequences = new MultiSequence(); assert (sequences); + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA (sequenceNames[i], true); + + // align sequences + DoAlign (sequences, model, thisInitDistrib, thisGapOpen, thisGapExtend, thisEmitPairs, thisEmitSingle); + + // add in contribution of the derived parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] += thisInitDistrib[i]; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] += thisGapOpen[i]; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] += thisGapExtend[i]; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] += thisEmitPairs[i][j]; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] += thisEmitSingle[i]; + } + + delete sequences; + } + + // compute new parameters and print them out + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] /= (int) sequenceNames.size(); + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] /= sequenceNames.size(); + } + + PrintParameters ("Trained parameter set:", + initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, + parametersOutputFilename.c_str()); + } + // pass + // if we are not training, we must simply want to align some sequences + else { + // load all files together + MultiSequence *sequences = new MultiSequence(); assert (sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++){ + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + + sequences->LoadMFA (sequenceNames[i], true); + } + + // do all "pre-training" repetitions first + // NOT execute + for (int ct = 0; ct < numPreTrainingReps; ct++){ + enableTraining = true; + + // build new model for aligning + ProbabilisticModel model (initDistrib, gapOpen, gapExtend, + emitPairs, emitSingle); + + // do initial alignments + DoAlign (sequences, model, initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + // print new parameters + PrintParameters ("Recomputed parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + enableTraining = false; + } + + // now, we can perform the alignments and write them out + if (enableWebOutput) { + outputFile = new ofstream(weboutputFileName.c_str()); + if (!outputFile) { + cerr << "cannot open output file." << weboutputFileName << endl; + exit(1); + } + *outputFile << "" << endl; + *outputFile << "" << endl; + } + MultiSequence *alignment = DoAlign (sequences, + ProbabilisticModel (initDistrib, gapOpen, gapExtend, emitPairs, emitSingle), + initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + + if (!enableAllPairs){ + if (enableClustalWOutput) { + alignment->WriteALN (cout); + } + else if (enableWebOutput) { + alignment->WriteWEB (*outputFile, ssCons); +// computeStructureWithAlifold (); + } + else if (enableStockholmOutput) { + alignment->WriteSTOCKHOLM (cout, ssCons); + } + else if (enableMXSCARNAOutput) { + alignment->WriteMXSCARNA (cout, ssCons); + } + else { + alignment->WriteMFA (cout, ssCons); + } + } + + if (enableWebOutput) { + *outputFile << "" << endl; + delete outputFile; + } + + delete ssCons; + delete alignment; + delete sequences; + + } +} + +///////////////////////////////////////////////////////////////// +// PrintHeading() +// +// Prints heading for PROBCONS program. +///////////////////////////////////////////////////////////////// + +void PrintHeading (){ + cerr << endl + << "Multiplex SCARNA"<< endl + << "version " << VERSION << " - align multiple RNA sequences and print to standard output" << endl + << "Written by Yasuo Tabei" << endl + << endl; +} + +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints PROBCONS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const VVF &emitPairs, const VF &emitSingle, const char *filename){ + + // print parameters to the screen + cerr << message << endl + << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) cerr << setprecision (10) << initDistrib[i] << " "; + cerr << "}" << endl + << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapOpen[i] << " "; + cerr << "}" << endl + << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapExtend[i] << " "; + cerr << "}" << endl + << endl; + + /* + for (int i = 0; i < 5; i++){ + for (int j = 0; j <= i; j++){ + cerr << emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]] << " "; + } + cerr << endl; + }*/ + + // if a file name is specified + if (filename){ + + // attempt to open the file for writing + FILE *file = fopen (filename, "w"); + if (!file){ + cerr << "ERROR: Unable to write parameter file: " << filename << endl; + exit (1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) fprintf (file, "%.10f ", initDistrib[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapOpen[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapExtend[i]); fprintf (file, "\n"); + fprintf (file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++){ + for (int j = 0; j <= i; j++) + fprintf (file, "%.10f ", emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf (file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf (file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf (file, "\n"); + fclose (file); + } +} + +///////////////////////////////////////////////////////////////// +// DoAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +MultiSequence *DoAlign (MultiSequence *sequences, const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, VF &gapExtend, VVF &emitPairs, VF &emitSingle){ + + + assert (sequences); + + const int numSeqs = sequences->GetNumSequences(); + VVF distances (numSeqs, VF (numSeqs, 0)); + VVF identities (numSeqs, VF (numSeqs, 0)); + SafeVector > sparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + SafeVector BPPMatrices; + + for(int i = 0; i < numSeqs; i++) { + Sequence *tmpSeq = sequences->GetSequence(i); + string seq = tmpSeq->GetString(); + int n_seq = tmpSeq->GetLength(); + BPPMatrix *bppmat = new BPPMatrix(bppmode, seq, n_seq, BASEPROBTHRESHOLD); // modified by katoh + BPPMatrices.push_back(bppmat); + } + + if (enableTraining){ + // prepare to average parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] = 0; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] = 0; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] = 0; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] = 0; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] = 0; + } + } + + // skip posterior calculations if we just want to do Viterbi alignments + if (!enableViterbi){ + + // do all pairwise alignments for posterior probability matrices + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + Sequence *seq1 = sequences->GetSequence (a); + Sequence *seq2 = sequences->GetSequence (b); + + // verbose output + if (enableVerbose) + cerr << "Computing posterior matrix: (" << a+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << b+1 << ") " << seq2->GetHeader() << " -- "; + + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix (seq1, seq2); assert (forward); + VF *backward = model.ComputeBackwardMatrix (seq1, seq2); assert (backward); + + // if we are training, then we'll simply want to compute the + // expected counts for each region within the matrix separately; + // otherwise, we'll need to put all of the regions together and + // assemble a posterior probability match matrix + + // so, if we're training + if (enableTraining){ + + // compute new parameters + VF thisInitDistrib (NumMatrixTypes); + VF thisGapOpen (2*NumInsertStates); + VF thisGapExtend (2*NumInsertStates); + VVF thisEmitPairs (256, VF (256, 1e-10)); + VF thisEmitSingle (256, 1e-5); + + model.ComputeNewParameters (seq1, seq2, *forward, *backward, thisInitDistrib, thisGapOpen, thisGapExtend, thisEmitPairs, thisEmitSingle, enableTrainEmissions); + + // add in contribution of the derived parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] += thisInitDistrib[i]; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] += thisGapOpen[i]; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] += thisGapExtend[i]; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] += thisEmitPairs[i][j]; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] += thisEmitSingle[i]; + } + + // let us know that we're done. + if (enableVerbose) cerr << "done." << endl; + } + // pass + else { + + // compute posterior probability matrix + VF *posterior = model.ComputePosteriorMatrix (seq1, seq2, *forward, *backward); assert (posterior); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + if (!enableAllPairs){ + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment (seq1->GetLength(), + seq2->GetLength(), + *posterior); + + Sequence *tmpSeq1 = seq1->AddGaps (alignment.first, 'X'); + Sequence *tmpSeq2 = seq2->AddGaps (alignment.first, 'Y'); + + // compute sequence identity for each pair of sequenceses + int length = tmpSeq1->GetLength(); + int matchCount = 0; + int misMatchCount = 0; + for (int k = 1; k <= length; k++) { + int ch1 = tmpSeq1->GetPosition(k); + int ch2 = tmpSeq2->GetPosition(k); + if (ch1 == ch2 && ch1 != '-' && ch2 != '-') { ++matchCount; } + else if (ch1 != ch2 && ch1 != '-' && ch2 != '-') { ++misMatchCount; } + } + + identities[a][b] = identities[b][a] = (float)matchCount/(float)(matchCount + misMatchCount); + + // compute "expected accuracy" distance for evolutionary tree computation + float distance = alignment.second / min (seq1->GetLength(), seq2->GetLength()); + distances[a][b] = distances[b][a] = distance; + + if (enableVerbose) + cerr << setprecision (10) << distance << endl; + + delete alignment.first; + } + else { + // let us know that we're done. + if (enableVerbose) cerr << "done." << endl; + } + + delete posterior; + } + + delete forward; + delete backward; + } + } + } + + + // now average out parameters derived + if (enableTraining){ + // compute new parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] /= numSeqs * (numSeqs - 1) / 2; + + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] /= numSeqs * (numSeqs - 1) / 2; + } + } + + // see if we still want to do some alignments + else { + // pass + if (!enableViterbi){ + + // perform the consistency transformation the desired number of times + for (int r = 0; r < numConsistencyReps; r++){ + SafeVector > newSparseMatrices = DoRelaxation (sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++){ + for (int j = 0; j < numSeqs; j++){ + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + //if (numSeqs > 8) { + // for (int r = 0; r < 1; r++) + // DoBasePairProbabilityRelaxation(sequences, sparseMatrices, BPPMatrices); + //} + } + + MultiSequence *finalAlignment = NULL; + + if (enableAllPairs){ + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + Sequence *seq1 = sequences->GetSequence (a); + Sequence *seq2 = sequences->GetSequence (b); + + if (enableVerbose) + cerr << "Performing pairwise alignment: (" << a+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << b+1 << ") " << seq2->GetHeader() << " -- "; + + + // perform the pairwise sequence alignment + pair *, float> alignment; + if (enableViterbi) + alignment = model.ComputeViterbiAlignment (seq1, seq2); + else { + + // build posterior matrix + VF *posterior = sparseMatrices[a][b]->GetPosterior(); assert (posterior); + int length = (seq1->GetLength() + 1) * (seq2->GetLength() + 1); + for (int i = 0; i < length; i++) (*posterior)[i] -= cutoff; + + alignment = model.ComputeAlignment (seq1->GetLength(), seq2->GetLength(), *posterior); + delete posterior; + } + + + // write pairwise alignments + string name = seq1->GetHeader() + "-" + seq2->GetHeader() + (enableClustalWOutput ? ".aln" : ".fasta"); + ofstream outfile (name.c_str()); + + MultiSequence *result = new MultiSequence(); + result->AddSequence (seq1->AddGaps(alignment.first, 'X')); + result->AddSequence (seq2->AddGaps(alignment.first, 'Y')); + result->WriteMFAseq (outfile); // by katoh + + outfile.close(); + + delete alignment.first; + } + } + exit( 0 ); + } + + // now if we still need to do a final multiple alignment + else { + + if (enableVerbose) + cerr << endl; + + // compute the evolutionary tree + TreeNode *tree = TreeNode::ComputeTree (distances, identities); + + if (enableWebOutput) { + *outputFile << "" << endl; + tree->Print (*outputFile, sequences); + *outputFile << "" << endl; + } + else { + tree->Print (cerr, sequences); + cerr << endl; + } + // make the final alignment + finalAlignment = ComputeFinalAlignment (tree, sequences, sparseMatrices, model, BPPMatrices); + + // build annotation + if (enableAnnotation){ + WriteAnnotation (finalAlignment, sparseMatrices); + } + + delete tree; + } + + if (!enableViterbi){ + // delete sparse matrices + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + } + + //AlifoldMEA alifold(finalAlignment, BPPMatrices, BasePairConst); + //alifold.Run(); + //ssCons = alifold.getSScons(); + + return finalAlignment; + + } + + return NULL; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger (char *data, int *val){ + char *endPtr; + long int retVal; + + assert (val); + + errno = 0; + retVal = strtol (data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat (char *data, float *val){ + char *endPtr; + double retVal; + + assert (val); + + errno = 0; + retVal = strtod (data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// + +SafeVector ParseParams (int argc, char **argv){ + + if (argc < 2){ + + cerr << "MXSCARNA comes with ABSOLUTELY NO WARRANTY. This is free software, and" << endl + << "you are welcome to redistribute it under certain conditions. See the" << endl + << "file COPYING.txt for details." << endl + << endl + << "Usage:" << endl + << " mxscarna [OPTION]... [MFAFILE]..." << endl + << endl + << "Description:" << endl + << " Align sequences in MFAFILE(s) and print result to standard output" << endl + << endl + << " -clustalw" << endl + << " use CLUSTALW output format instead of MFA" << endl + << endl + << " -stockholm" << endl + << " use STOCKHOLM output format instead of MFA" << endl + << endl + << " -mxscarna" << endl + << " use MXSCARNA output format instead of MFA" << endl + << endl + << " -weboutput //" << endl + << " use web output format" << endl + << endl + << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " << MAX_CONSISTENCY_REPS + << " (default: " << numConsistencyReps << ") passes of consistency transformation" << endl + << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS + << " (default: " << numIterativeRefinementReps << ") passes of iterative-refinement" << endl + << endl + << " -pre, --pre-training REPS" << endl + << " use " << MIN_PRETRAINING_REPS << " <= REPS <= " << MAX_PRETRAINING_REPS + << " (default: " << numPreTrainingReps << ") rounds of pretraining" << endl + << endl + << " -pairs" << endl + << " generate all-pairs pairwise alignments" << endl + << endl + << " -viterbi" << endl + << " use Viterbi algorithm to generate all pairs (automatically enables -pairs)" << endl + << endl + << " -v, --verbose" << endl + << " report progress while aligning (default: " << (enableVerbose ? "on" : "off") << ")" << endl + << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" << endl + << endl + << " -t, --train FILENAME" << endl + << " compute EM transition probabilities, store in FILENAME (default: " + << parametersOutputFilename << ")" << endl + << endl + << " -e, --emissions" << endl + << " also reestimate emission probabilities (default: " + << (enableTrainEmissions ? "on" : "off") << ")" << endl + << endl + << " -p, --paramfile FILENAME" << endl + << " read parameters from FILENAME (default: " + << parametersInputFilename << ")" << endl + << endl + << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << endl + << " -s THRESHOLD" << endl + << " the threshold of SCS alignment" << endl + << endl + << " In default, for less than " << threshhold << ", the SCS aligment is applied. " << endl + << " -l SCSLENGTH" << endl + << " the length of stem candidates " << SCSLENGTH << endl + << endl + << " -b BASEPROBTRHESHHOLD" << endl + << " the threshold of base pairing probability " << BASEPROBTHRESHOLD << endl + << endl + << " -m, --mccaskillmea" << endl + << " McCaskill MEA MODE: input the clustalw format file and output the secondary structure predicted by McCaskill MEA" << endl + << endl + << " -g BASEPAIRSCORECONST" << endl + << " the control parameter of the prediction of base pairs, default:" << BasePairConst << endl + << endl + << " -w BANDWIDTH" << endl + << " the control parameter of the distance of stem candidates, default:" << BANDWIDTH << endl + << endl; + + + // << " -go, --gap-open VALUE" << endl + // << " gap opening penalty of VALUE <= 0 (default: " << gapOpenPenalty << ")" << endl + // << endl + // << " -ge, --gap-extension VALUE" << endl + // << " gap extension penalty of VALUE <= 0 (default: " << gapContinuePenalty << ")" << endl + // << endl + // << " -co, --cutoff CUTOFF" << endl + // << " subtract 0 <= CUTOFF <= 1 (default: " << cutoff << ") from all posterior values before final alignment" << endl + // << endl + + exit (1); + } + + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++){ + if (argv[i][0] == '-'){ + + // training + if (!strcmp (argv[i], "-t") || !strcmp (argv[i], "--train")){ + enableTraining = true; + if (i < argc - 1) + parametersOutputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + + // emission training + else if (!strcmp (argv[i], "-e") || !strcmp (argv[i], "--emissions")){ + enableTrainEmissions = true; + } + + // parameter file + else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + else if (! strcmp (argv[i], "-s")) { + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + threshhold = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + else if (! strcmp (argv[i], "-l")) { + if (i < argc - 1) { + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt <= 0 || 6 <= tempInt) { + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << "1 and 6" << "." << endl; + exit (1); + } + else + scsLength = tempInt; + } + } + } + else if (! strcmp (argv[i], "-b")) { + if (i < argc - 1) { + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 && 1 < tempFloat) { + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + BaseProbThreshold = tempFloat; + } + } + } + else if (! strcmp (argv[i], "-g")) { + if (i < argc - 1) { + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 && 1 < tempFloat) { + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + BasePairConst = tempFloat; + } + } + } + + // number of consistency transformations + else if (!strcmp (argv[i], "-c") || !strcmp (argv[i], "--consistency")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_CONSISTENCY_REPS || tempInt > MAX_CONSISTENCY_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " << MAX_CONSISTENCY_REPS << "." << endl; + exit (1); + } + else + numConsistencyReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp (argv[i], "-ir") || !strcmp (argv[i], "--iterative-refinement")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS || tempInt > MAX_ITERATIVE_REFINEMENT_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " << MAX_ITERATIVE_REFINEMENT_REPS << "." << endl; + exit (1); + } + else + numIterativeRefinementReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + // number of EM pre-training rounds + else if (!strcmp (argv[i], "-pre") || !strcmp (argv[i], "--pre-training")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_PRETRAINING_REPS || tempInt > MAX_PRETRAINING_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_PRETRAINING_REPS << " and " << MAX_PRETRAINING_REPS << "." << endl; + exit (1); + } + else + numPreTrainingReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // the distance of stem candidate + else if (!strcmp (argv[i], "-w")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + BandWidth = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap open penalty + else if (!strcmp (argv[i], "-go") || !strcmp (argv[i], "--gap-open")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapOpenPenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap extension penalty + else if (!strcmp (argv[i], "-ge") || !strcmp (argv[i], "--gap-extension")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapContinuePenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // all-pairs pairwise alignments + else if (!strcmp (argv[i], "-pairs")){ + enableAllPairs = true; + } + + // all-pairs pairwise Viterbi alignments + else if (!strcmp (argv[i], "-viterbi")){ + enableAllPairs = true; + enableViterbi = true; + } + + // read base-pairing probability from the '_bpp' file, by katoh + else if (!strcmp (argv[i], "-readbpp")){ + bppmode = 'r'; + } + + // write base-pairing probability to stdout, by katoh + else if (!strcmp (argv[i], "-writebpp")){ + bppmode = 'w'; + } + + // annotation files + else if (!strcmp (argv[i], "-annot")){ + enableAnnotation = true; + if (i < argc - 1) + annotationFilename = argv[++i]; + else { + cerr << "ERROR: FILENAME expected for option " << argv[i] << endl; + exit (1); + } + } + + // clustalw output format + else if (!strcmp (argv[i], "-clustalw")){ + enableClustalWOutput = true; + } + // mxscarna output format + else if (!strcmp (argv[i], "-mxscarna")) { + enableMXSCARNAOutput = true; + } + // stockholm output format + else if (!strcmp (argv[i], "-stockholm")) { + enableStockholmOutput = true; + } + // web output format + else if (!strcmp (argv[i], "-weboutput")) { + if (i < argc - 1) { + weboutputFileName = string(argv[++i]); + } + else { + cerr << "ERROR: Invalid following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + + enableWebOutput = true; + } + + // cutoff + else if (!strcmp (argv[i], "-co") || !strcmp (argv[i], "--cutoff")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 || tempFloat > 1){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must be between 0 and 1." << endl; + exit (1); + } + else + cutoff = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // verbose reporting + else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--verbose")){ + enableVerbose = true; + } + + // alignment order + else if (!strcmp (argv[i], "-a") || !strcmp (argv[i], "--alignment-order")){ + enableAlignOrder = true; + } + // McCaskill MEA MODE + else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--mccaskillmea")){ + enableMcCaskillMEAMode = true; + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit (1); + } + } + else { + sequenceNames.push_back (string (argv[i])); + } + } + + if (enableTrainEmissions && !enableTraining){ + cerr << "ERROR: Training emissions (-e) requires training (-t)" << endl; + exit (1); + } + + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void ReadParameters (){ + + ifstream data; + + emitPairs = VVF (256, VF (256, 1e-10)); + emitSingle = VF (256, 1e-5); + + // read initial state distribution and transition parameters + // pass + if (parametersInputFilename == string ("")){ + if (NumInsertStates == 1){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend1Default[i]; + } + else if (NumInsertStates == 2){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend2Default[i]; + } + else { + cerr << "ERROR: No default initial distribution/parameter settings exist" << endl + << " for " << NumInsertStates << " pairs of insert states. Use --paramfile." << endl; + exit (1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++){ + emitSingle[(unsigned char) tolower(alphabet[i])] = emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = emitSingleDefault[i]; + for (int j = 0; j <= i; j++){ + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper(alphabet[i])] = emitPairsDefault[i][j]; + } + } + } + else { + data.open (parametersInputFilename.c_str()); + if (data.fail()){ + cerr << "ERROR: Unable to read parameter file: " << parametersInputFilename << endl; + exit (1); + } + + string line[3]; + for (int i = 0; i < 3; i++){ + if (!getline (data, line[i])){ + cerr << "ERROR: Unable to read transition parameters from parameter file: " << parametersInputFilename << endl; + exit (1); + } + } + istringstream data2; + data2.clear(); data2.str (line[0]); for (int i = 0; i < NumMatrixTypes; i++) data2 >> initDistrib[i]; + data2.clear(); data2.str (line[1]); for (int i = 0; i < 2*NumInsertStates; i++) data2 >> gapOpen[i]; + data2.clear(); data2.str (line[2]); for (int i = 0; i < 2*NumInsertStates; i++) data2 >> gapExtend[i]; + + if (!getline (data, line[0])){ + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " << parametersInputFilename << endl; + exit (1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); data2.str (line[0]); while (data2 >> token) alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++){ + for (int j = 0; j <= i; j++){ + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower(alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper(alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower(alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper(alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower(alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper(alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower(alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper(alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++){ + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +float ide; +MultiSequence *ProcessTree (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, SafeVector &BPPMatrices) { + MultiSequence *result; + + // check if this is a node of the alignment tree + if (tree->GetSequenceLabel() == -1){ + MultiSequence *alignLeft = ProcessTree (tree->GetLeftChild(), sequences, sparseMatrices, model, BPPMatrices); + MultiSequence *alignRight = ProcessTree (tree->GetRightChild(), sequences, sparseMatrices, model, BPPMatrices); + + assert (alignLeft); + assert (alignRight); + + result = AlignAlignments (alignLeft, alignRight, sparseMatrices, model, BPPMatrices, tree->GetIdentity()); + assert (result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); assert (result); + result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices) { + + MultiSequence *alignment = ProcessTree (tree, sequences, sparseMatrices, model, BPPMatrices); + + if (enableAlignOrder){ + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // if you use the function, you can degrade the quality of the software. + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree, BPPMatrices); + + // iterative refinement +/* + for (int i = 0; i < numIterativeRefinementReps; i++) + DoIterativeRefinement (sparseMatrices, model, alignment); + + cerr << endl; +*/ + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices, float identity){ + + // print some info about the alignment + if (enableVerbose){ + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } + + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); + + pair *, float> alignment; + // choose the alignment routine depending on the "cosmetic" gap penalties used + if (gapOpenPenalty == 0 && gapContinuePenalty == 0) { + + if(identity <= threshhold) { + std::vector *pscs1, *pscs2; + pscs1 = seq2scs(align1, BPPMatrices, BandWidth); + pscs2 = seq2scs(align2, BPPMatrices, BandWidth); + std::vector *matchPSCS1 = new std::vector; + std::vector *matchPSCS2 = new std::vector; + + Globaldp globaldp(pscs1, pscs2, align1, align2, matchPSCS1, matchPSCS2, posterior, BPPMatrices); + //float scsScore = globaldp.Run(); + + globaldp.Run(); + + removeConflicts(pscs1, pscs2, matchPSCS1, matchPSCS2); + + alignment = model.ComputeAlignment2 (align1->GetSequence(0)->GetLength(), align2->GetSequence(0)->GetLength(), *posterior, pscs1, pscs2, matchPSCS1, matchPSCS2); + delete matchPSCS1; + delete matchPSCS2; + } else { + alignment = model.ComputeAlignment (align1->GetSequence(0)->GetLength(), align2->GetSequence(0)->GetLength(), *posterior); + } + } + else { + alignment = model.ComputeAlignmentWithGapPenalties (align1, align2, + *posterior, align1->GetNumSequences(), align2->GetNumSequences(), + gapOpenPenalty, gapContinuePenalty); + } + + delete posterior; + + if (enableVerbose){ + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min (align1->GetSequence(i)->GetLength(), align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence (align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence (align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the consistency transformation. The +// formula used is: +// 1 +// P'(x[i]-y[j]) = --- sum sum P(x[i]-z[k]) P(z[k]-y[j]) +// |S| z in S k +// +// where S = {x, y, all other sequences...} +// +///////////////////////////////////////////////////////////////// + +SafeVector > DoRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices){ + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + // for every pair of sequences + for (int i = 0; i < numSeqs; i++){ + for (int j = i+1; j < numSeqs; j++){ + Sequence *seq1 = sequences->GetSequence (i); + Sequence *seq2 = sequences->GetSequence (j); + + if (enableVerbose) + cerr << "Relaxing (" << i+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << j+1 << ") " << seq2->GetHeader() << ": "; + + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] += posterior[k]; + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) if (k != i && k != j){ + if (k < i) + Relax1 (sparseMatrices[k][i], sparseMatrices[k][j], posterior); + else if (k > i && k < j) + Relax (sparseMatrices[i][k], sparseMatrices[k][j], posterior); + else { + SparseMatrix *temp = sparseMatrices[j][k]->ComputeTranspose(); + Relax (sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + + // now renormalization + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] /= numSeqs; + + // mask out positions not originally in the posterior matrix + SparseMatrix *matXY = sparseMatrices[i][j]; + for (int y = 0; y <= seq2Length; y++) posterior[y] = 0; + for (int x = 1; x <= seq1Length; x++){ + SafeVector::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend){ + + // zero out all cells until the first filled column + while (curr < XYptr->first){ + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length){ + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; + } + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior){ + + assert (matXZ); + assert (matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert (matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++){ + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend){ + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend){ + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void Relax1 (SparseMatrix *matZX, SparseMatrix *matZY, VF &posterior){ + + assert (matZX); + assert (matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++){ + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend){ + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend){ + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} + +void DoBasePairProbabilityRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices, + SafeVector &BPPMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + for (int i = 0; i < numSeqs; i++) { + Sequence *seq1 = sequences->GetSequence (i); + BPPMatrix *seq1BppMatrix = BPPMatrices[seq1->GetLabel()]; + Trimat consBppMat(seq1->GetLength() + 1); + int seq1Length = seq1->GetLength(); + + for (int k = 1; k <= seq1Length; k++) { + for (int l = k; l <= seq1Length; l++) { + consBppMat.ref(k, l) = seq1BppMatrix->GetProb(k, l); + } + } + + for (int j = i + 1; j < numSeqs; j++) { + + // VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior() + Sequence *seq2 = sequences->GetSequence (j); + BPPMatrix *seq2BppMatrix = BPPMatrices[seq2->GetLabel()]; +// int seq2Length = seq2->GetLength(); + SparseMatrix *matchProb = sparseMatrices[i][j]; + +// vector &probs1 = seq1BppMatrix->bppMat.data2; + for(int k = 1; k <= seq1Length; k++) { + for(int m = k, n = k; n <= k + 200 && m >= 1 && n <= seq1Length; m--, n++) { + +// for (int k = 0; k < (int)probs1.size(); k++) { +// float tmpProb1 = probs1[k].prob; +// int tmp1I = probs1[k].i; +// int tmp1J = probs1[k].j; + + float sumProb = 0; + vector &probs2 = seq2BppMatrix->bppMat.data2; + for(int l = 0; l < (int)probs2.size(); l++) { + float tmpProb2 = probs2[l].prob; + int tmp2I = probs2[l].i; + int tmp2J = probs2[l].j; + sumProb += matchProb->GetValue(m, tmp2I)*matchProb->GetValue(n, tmp2J)*tmpProb2; + } + + consBppMat.ref(m, n) += sumProb; + } + + for(int m = k, n = k + 1; n <= k + 200 && m >= 1 && n <= seq1Length; m--, n++) { + +// for (int k = 0; k < (int)probs1.size(); k++) { +// float tmpProb1 = probs1[k].prob; +// int tmp1I = probs1[k].i; +// int tmp1J = probs1[k].j; + + float sumProb = 0; + vector &probs2 = seq2BppMatrix->bppMat.data2; + for(int l = 0; l < (int)probs2.size(); l++) { + float tmpProb2 = probs2[l].prob; + int tmp2I = probs2[l].i; + int tmp2J = probs2[l].j; + sumProb += matchProb->GetValue(m, tmp2I)*matchProb->GetValue(n, tmp2J)*tmpProb2; + } + + consBppMat.ref(m, n) += sumProb; + } + } + } + +/* + for(int k = 1; k <= seq1Length; k++) { + for(int m = k, n = k; n <= k + 30 && m >= 1 && n <= seq1Length; m--, n++) { + float tmpProb = seq1BppMatrix->GetProb(m, n); + for(int l = 1; l <= seq2Length; l++) { + for(int s = l, t = l; t <= l + 30 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + for(int s = l, t = l + 1; t <= l + 31 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + } + consBppMat.ref(m, n) += tmpProb; + } + + for(int m = k, n = k + 1; n <= k + 31 && m >= 1 && n <= seq1Length; m--, n++) { + float tmpProb = seq1BppMatrix->GetProb(m, n); + for(int l = 1; l <= seq2Length; l++) { + for(int s = l, t = l; t <= l + 30 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + for(int s = l, t = l + 1; t <= l + 31 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + } + consBppMat.ref(m,n) += tmpProb; + } + } + } +*/ + for (int m = 1; m <= seq1Length; m++) { + for (int n = m + 4; n <= seq1Length; n++) { + consBppMat.ref(m,n) = consBppMat.ref(m,n)/(float)numSeqs; + } + } + seq1BppMatrix->updateBPPMatrix(consBppMat); + } +} + +///////////////////////////////////////////////////////////////// +// GetSubtree +// +// Returns set containing all leaf labels of the current subtree. +///////////////////////////////////////////////////////////////// + +set GetSubtree (const TreeNode *tree){ + set s; + + if (tree->GetSequenceLabel() == -1){ + s = GetSubtree (tree->GetLeftChild()); + set t = GetSubtree (tree->GetRightChild()); + + for (set::iterator iter = t.begin(); iter != t.end(); ++iter) + s.insert (*iter); + } + else { + s.insert (tree->GetSequenceLabel()); + } + + return s; +} + +///////////////////////////////////////////////////////////////// +// TreeBasedBiPartitioning +// +// Uses the iterative refinement scheme from MUSCLE. +///////////////////////////////////////////////////////////////// + +void TreeBasedBiPartitioning (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + const TreeNode *tree, SafeVector &BPPMatrices){ + // check if this is a node of the alignment tree + if (tree->GetSequenceLabel() == -1){ + TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree->GetLeftChild(), BPPMatrices); + TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree->GetRightChild(), BPPMatrices); + + set leftSubtree = GetSubtree (tree->GetLeftChild()); + set rightSubtree = GetSubtree (tree->GetRightChild()); + set leftSubtreeComplement, rightSubtreeComplement; + + // calculate complement of each subtree + for (int i = 0; i < alignment->GetNumSequences(); i++){ + if (leftSubtree.find(i) == leftSubtree.end()) leftSubtreeComplement.insert (i); + if (rightSubtree.find(i) == rightSubtree.end()) rightSubtreeComplement.insert (i); + } + + // perform realignments for edge to left child + if (!leftSubtree.empty() && !leftSubtreeComplement.empty()){ + MultiSequence *groupOneSeqs = alignment->Project (leftSubtree); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (leftSubtreeComplement); assert (groupTwoSeqs); + delete alignment; + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model, BPPMatrices, tree->GetLeftChild()->GetIdentity()); + } + + // perform realignments for edge to right child + if (!rightSubtree.empty() && !rightSubtreeComplement.empty()){ + MultiSequence *groupOneSeqs = alignment->Project (rightSubtree); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (rightSubtreeComplement); assert (groupTwoSeqs); + delete alignment; + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model, BPPMatrices, tree->GetRightChild()->GetIdentity()); + } + } +} + +///////////////////////////////////////////////////////////////// +// DoterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// +/* +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment){ + set groupOne, groupTwo; + + // create two separate groups + for (int i = 0; i < alignment->GetNumSequences(); i++){ + if (rand() % 2) + groupOne.insert (i); + else + groupTwo.insert (i); + } + + if (groupOne.empty() || groupTwo.empty()) return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project (groupOne); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (groupTwo); assert (groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} +*/ + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void WriteAnnotation (MultiSequence *alignment, + const SafeVector > &sparseMatrices){ + ofstream outfile (annotationFilename.c_str()); + + if (outfile.fail()){ + cerr << "ERROR: Unable to write annotation file." << endl; + exit (1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position (numSeqs, 0); + SafeVector::iterator> seqs (numSeqs); + for (int i = 0; i < numSeqs; i++) seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve (numSeqs); + + // for every column + for (int i = 1; i <= alignLength; i++){ + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++){ + if (seqs[j][i] != '-'){ + active.push_back (make_pair(j, ++position[j])); + } + } + + outfile << setw(4) << ComputeScore (active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int ComputeScore (const SafeVector > &active, + const SafeVector > &sparseMatrices){ + + if (active.size() <= 1) return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++){ + for (int j = i+1; j < (int) active.size(); j++){ + val += sparseMatrices[active[i].first][active[j].first]->GetValue(active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Makefile b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Makefile new file mode 100644 index 0000000000..8e386e029a --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Makefile @@ -0,0 +1,77 @@ +################################################################################ +# Makefile for probcons +################################################################################ + +################################################################################ +# 1) Choose C++ compiler. +################################################################################ + +CXX = g++ + +################################################################################ +# 2) Set C++ flags. +# a) DEBUG mode -- no optimizations, enable SafeVector checking, no inlining +# b) PROFILE mode -- for gprof +# c) RELEASE mode +################################################################################ +BIG_INLINE_LIMIT = 20000 + +PROBCONS = ./probconsRNA +VIENNA = ./vienna + +# no -Wall option for warning +#CXXFLAGS = -O3 -funroll-loops -finline-limit=$(BIG_INLINE_LIMIT) +CXXFLAGS = -O3 # by katoh +OFLAGS = -DNDEBUG -DNumInsertStates=1 -DVERSION="2.0" $(CXXFLAGS) $(CFLAGS1) -std=c++98 +LIBS = -L$(PROBCONS) -L./ +INCL = -I$(PROBCONS) -I$(VIENNA) -I./ + +################################################################################ +# 3) Dependencies +################################################################################ + +TARGETS = mxscarna + +OBJS = Main.o McCaskill.o vienna/energy_param.o seq2scs.o Globaldp.o postProcessings.o AlifoldMEA.o + +.PHONY : all +all : $(TARGETS) + +mxscarna : $(OBJS) + $(CXX) $(LIBS) $(OFLAGS) -lm -o $@ $(OBJS) + +rfold: + cd $(RFOLD); \ + make; \ + cd .. \ + cd .. +probcons: + cd $(PROBCONS); \ + make; \ + cd .. + +#probcons : MultiSequence.h ProbabilisticModel.h ScoreType.h Sequence.h FileBuffer.h SparseMatrix.h EvolutionaryTree.h Defaults.h SafeVector.h Main.cc +# $(CXX) -lm -o probcons $(OBJS) +#Main.cc + +Main.o : $(PROBCONS)/SafeVector.h $(PROBCONS)/FileBuffer.h $(PROBCONS)/Sequence.h $(PROBCONS)/MultiSequence.h $(PROBCONS)/EvolutionaryTree.h scarna.hpp BPPMatrix.hpp StemCandidate.hpp Globaldp.hpp AlifoldMEA.h Main.cc + $(CXX) $(INCL) $(OFLAGS) -c Main.cc -o Main.o +McCaskill.o: McCaskill.hpp $(VIENNA)/energy_param.hpp Util.hpp Beta.hpp ScoreType.hpp McCaskill.cpp + $(CXX) $(INCL) $(OFLAGS) -c McCaskill.cpp -o McCaskill.o +$(VIENNA)/energy_param.o: $(VIENNA)/energy_param.hpp $(VIENNA)/energy_param.cpp + $(CXX) $(INCL) $(OFLAGS) -c $(VIENNA)/energy_param.cpp -o $(VIENNA)/energy_param.o +seq2scs.o: $(PROBCONS)/SafeVector.h StemCandidate.hpp $(PROBCONS)/Sequence.h $(PROBCONS)/MultiSequence.h BPPMatrix.hpp nrutil.h seq2scs.cpp + $(CXX) $(INCL) $(OFLAGS) -c seq2scs.cpp -o seq2scs.o +Globaldp.o: Globaldp.hpp nrutil.h Util.hpp Beta.hpp scarna.hpp StemCandidate.hpp $(PROBCONS)/MultiSequence.h $(PROBCONS)/Sequence.h BPPMatrix.hpp + $(CXX) $(INCL) $(OFLAGS) -c Globaldp.cpp -o Globaldp.o +GlobalParameters.o: scarna.hpp + $(CXX) $(INCL) $(OFLAGS) -c GlobalParameters.cpp -o GlobalParameters.o +postProcessings.o: StemCandidate.hpp scarna.hpp + $(CXX) $(INCL) $(OFLAGS) -c postProcessings.cpp -o postProcessings.o +AlifoldMEA.o: nrutil.h Util.hpp Beta.hpp BPPMatrix.hpp $(PROBCONS)/MultiSequence.h $(PROBCONS)/Sequence.h $(PROBCONS)/SafeVector.h + $(CXX) $(INCL) $(OFLAGS) -c AlifoldMEA.cpp -o AlifoldMEA.o + +.PHONY : clean +clean: + rm -f $(TARGETS) *.o *.h~ *.hpp~ *.cpp~ *.cc~ $(VIENNA)/*.o + $(MAKE) -C $(PROBCONS) clean diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.cpp new file mode 100644 index 0000000000..9e4acea357 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.cpp @@ -0,0 +1,844 @@ +#include +#include "McCaskill.hpp" +//#include "energy_param3.hpp" +#include "Util.hpp" +#include + +namespace MXSCARNA { +energy_param McCaskill::energyParam; + +float *McCaskill::exphairpin; +float McCaskill::expninio[5][32]; +float McCaskill::expdangle5[6][4]; +float McCaskill::expdangle3[6][4]; +float McCaskill::expinternalLoop[31]; +float McCaskill::expbulge[31]; +char McCaskill::exptriLoop[2][6]; +float McCaskill::exptriLoopEnergy[2]; +char McCaskill::exptetraLoop[30][7]; +float McCaskill::exptetraLoopEnergy[30]; +float McCaskill::expStack[6][6]; +float McCaskill::expTstackH[6][16]; +float McCaskill::expTstackI[6][16]; +float McCaskill::expint11[6][6][16]; +float McCaskill::expint21[6][6][16][4]; +float McCaskill::expint22[6][6][16][16]; +float McCaskill::expMLclosing; +float McCaskill::expMLintern[8]; +float McCaskill::expTermAU; +float McCaskill::expMLbase[31]; + +const int McCaskill::TURN = 3; +const float McCaskill::GASCONST = 1.98717; +const float McCaskill::T = 37 + 273.15; +const int McCaskill::MAXLOOP = 30; +const int McCaskill::TETRA_ENTH37 = -400; +const int McCaskill::NBPAIRS = 7; +const int McCaskill::SCALE = 10; + + +void +McCaskill:: +calcPartitionFunction() +{ + initParameter(); + Inside(); + Outside(); + convertProbability(); + +/* + for(int i = 0; i < n_seq; i++) { + for(int j = i; j < n_seq; j++) { + cout << getProb(i, j) << " "; + } + cout << endl; + } +*/ +} + +void +McCaskill:: +convertProbability() +{ + float *pPointer = p.getPointer(0, 0); + float *abPointer = ab.getPointer(0,0); + for(int i = 0; i < n_seq; i++) { + for(int j = i; j < n_seq; j++) { + *pPointer += *abPointer++; +#if 0 + *pPointer++ = EXP(*pPointer); +#else + *pPointer = EXP(*pPointer); // by katoh + pPointer++; +#endif + } + } +} + +void +McCaskill:: +Inside() +{ + + for (int i = n_seq - TURN - 2; i >= 0; i--) { + float *abPointer = ab.getPointer(i, i + TURN + 1); + float *am1Pointer = am1.getPointer(i, i + TURN + 1); + float *amPointer = am.getPointer(i, i + TURN + 1); + float *q1Pointer = q1.getPointer(i, i + TURN + 1); + float *aPointer = a.getPointer(i, i + TURN + 1); + int *typePointer = typeMat.getPointer(i, i+TURN+1); + for (int j = i + TURN + 1; j < n_seq; j++) { + int tmpType = *typePointer++; + *abPointer++ = compQb(i, j, tmpType); + am1v.ref(i,j) = *am1Pointer++ = compQm1(i,j, tmpType); + amv.ref(i,j) = *amPointer++ = compQm(i,j); + q1v.ref(i,j) = *q1Pointer++ = compQ1(i,j, tmpType); + *aPointer++ = compQ(i,j); + } + } +} + +inline float +McCaskill:: +compQb(int i, int j, int tmpType) +{ + + float tmpAb; + int type = tmpType; + int u = j - i - 1; + + if(Beta::isCanonicalReducedPairCode(type)) { + // hairpin energy + assert(u >= 3); + tmpAb = expHairpinEnergy(type, u, i + 1, j - 1); + + // base pair, bulge, interior loop energy + for(int h = i + 1; h <= MIN(i + MAXLOOP + 1, j - TURN - 2); h++) { + int u1 = h-i-1; + int max = MAX(h + TURN + 1, j-1-MAXLOOP+u1); + float *abPointer = ab.getPointer(h, max - 1); + const int *typeMatPointer = typeMat.getPointer(h, max); + + for(int l = max; l < j; l++) { + int type2 = *typeMatPointer++; + abPointer++; + if(!Beta::isCanonicalReducedPairCode(type2)) continue; + + assert(h >= 0 && h < n_seq && l >= 0 && l < n_seq); + type2 = Beta::flipReducedPairCode(type2); + assert(h-i-1 >= 0); assert(j-l-1 >= 0); + float loopE = *abPointer; + loopE += expLoopEnergy(u1, j-l-1, tmpType, type2, i+1, j-1, h-1, l+1); + tmpAb = LOG_ADD(tmpAb, loopE); + } + } + + // multi loop + float tmpQm = IMPOSSIBLE; + float *amPointer = am.getPointer(i + 1, j - TURN - 3); + float *am1Pointer = am1v.getPointer(j-TURN-2, j-1); + for(int h = j - TURN - 2; h >= i + TURN + 3; h--) { + assert(h >= 0 && h < n_seq); + float tmpScore = *amPointer--; + tmpScore += *am1Pointer--; + tmpQm = LOG_ADD(tmpQm, tmpScore); + } + tmpQm += expMLclosing + expMLintern[type]; + tmpQm += endStemScore(i, j); + tmpAb = LOG_ADD(tmpAb, tmpQm); + } + else { + tmpAb = IMPOSSIBLE; + } + return tmpAb; +} + +//F = a:ML_closing + b:ML_intern*k + c:ML_BASE*u + +inline float +McCaskill:: +compQm1(int i, int j, int tmpType) +{ + float tmpQm1 = IMPOSSIBLE; + + int l = j; + if (i + TURN + 1 <= l) { + int type = typeMat.ref(i,l); + if(Beta::isCanonicalReducedPairCode(type)) { + float tmpScore = ab.ref(i,l); + tmpScore += beginStemScore(i, l); + //tmpScore += expMLbase[1]*(j-l) + expMLintern[type]; + tmpScore += expMLintern[tmpType]; + tmpQm1 = LOG_ADD(tmpQm1, tmpScore); + } + } + if(i < j) { + tmpQm1 = LOG_ADD(tmpQm1, am1.ref(i,j-1)); + } + + return tmpQm1; +} + +inline float +McCaskill:: +compQm(int i, int j) +{ + float tmpQm = IMPOSSIBLE; + float *amPointer = am.getPointer(i,j-TURN-2); + float *am1Pointer = am1v.getPointer(j-TURN-1, j); + for(int h = j - TURN - 1; h >= i ; h--) { + float tmpScore = 0; + float tmpAm1 = *am1Pointer--; + + tmpScore += tmpAm1; + tmpQm = LOG_ADD(tmpQm, tmpScore); + tmpScore = *amPointer--; + tmpScore += tmpAm1; + tmpQm = LOG_ADD(tmpQm, tmpScore); + } + + return tmpQm; +} + +inline float +McCaskill:: +compQ1(int i, int j, int tmpType) +{ + float tmpQ1 = IMPOSSIBLE; + + if(Beta::isCanonicalReducedPairCode(tmpType)) { + float tmpScore = ab.ref(i, j); + tmpScore += beginStemScore(i, j); + tmpQ1 = LOG_ADD(tmpQ1, tmpScore); + } + tmpQ1 = LOG_ADD(tmpQ1, q1.ref(i, j - 1)); + + return tmpQ1; +} + +inline float +McCaskill:: +compQ(int i, int j) +{ + float tmpQ = 0; + tmpQ = LOG_ADD(tmpQ, q1.ref(i,j)); + + float *aPointer = a.getPointer(i,j-TURN-2); + float *q1Pointer = q1v.getPointer(j-TURN-1, j); + for(int h = j - TURN - 1; h >= i + 1; h--) { + float tmpScore = *aPointer--; + tmpScore += *q1Pointer--; + tmpQ = LOG_ADD(tmpQ, tmpScore); + } + + return tmpQ; +} + +inline float +McCaskill:: +beginStemScore(const int i, const int j) const +{ + float temp = 0; + int type = typeMat.ref(i,j); + + if(0 < i) { temp += expdangle5[type][numSeq[i-1]]; } + if(j < n_seq-1) { temp += expdangle3[type][numSeq[j+1]]; } + if(type != Beta::REDUCED_CG_CODE && type != Beta::REDUCED_GC_CODE) { temp += expTermAU; } + return temp; +} + +inline float +McCaskill:: +endStemScore(const int i, const int j) const +{ + float temp = 0; + int type = typeMat.ref(i,j); + + type = Beta::flipReducedPairCode(type); + + if(i < n_seq-1) { temp += expdangle3[type][numSeq[i+1]]; } + if(j > 0) { temp += expdangle5[type][numSeq[j-1]]; } + if(type != Beta::REDUCED_CG_CODE && type != Beta::REDUCED_GC_CODE) { temp += expTermAU; } + return temp; +} + +inline float +McCaskill:: +compP(int h, int l, int tmpType) +{ + float prob = IMPOSSIBLE; + + int type = tmpType; + if(Beta::isCanonicalReducedPairCode(type)) { + + /* exterior loop */ + float tmp_p = 0; + tmp_p -= a.ref(0,n_seq-1); + if(0 < h) { + tmp_p += a.ref(0,h-1); + } + if(l < n_seq-1) { + tmp_p += a.ref(l+1, n_seq-1); + } + tmp_p += beginStemScore(h, l); + prob = LOG_ADD(prob, tmp_p); + + assert(IMPOSSIBLE <= prob && prob <= 0); + + /* internal loop */ + tmp_p = IMPOSSIBLE; + int tt = Beta::flipReducedPairCode(tmpType); + int max = MAX(0,h-MAXLOOP-1); + for(int i = max; i <= h - 1; i++) { + float min = MIN(l+MAXLOOP-h+i+2, n_seq-1); + int *typeMatPointer = typeMat.getPointer(i,l+1); + float *pPointer = p.getPointer(i,l); + for(int j = l + 1; j <= min; j++) { + int type2 = *typeMatPointer++; + pPointer++; + if(!Beta::isCanonicalReducedPairCode(type2)) continue; + assert(i >= 0 && i < n_seq && j >= 0 && j < n_seq); + + float tmpScore = *pPointer; + tmpScore += expLoopEnergy(h-i-1, j-l-1, type2, tt, i+1, j-1, h-1, l+1); + tmp_p = LOG_ADD(tmp_p, tmpScore); + } + } + prob = LOG_ADD(prob, tmp_p); + assert(IMPOSSIBLE <= prob && prob <= 0); + + /* multi loop */ + tmp_p = IMPOSSIBLE; + float tmp_begin = beginStemScore(h, l); + float *q1Pointer = q1v.getPointer(0, l); + float *am1Pointer = am1v.getPointer(0, l); + float *amPointer = amv.getPointer(1,h-1); + for(int i = 0; i <= h-TURN-1; i++) { + float tmpq1 = *q1Pointer++; + float tmpam = *amPointer++; + float tmpScore = *am1Pointer++; + + tmpScore += tmpam; + tmpScore += tmp_begin; + tmpScore += expMLclosing + expMLintern[tt]; + tmp_p = LOG_ADD(tmp_p, tmpScore); + + tmpScore = tmpq1; + tmpScore += tmpam; + tmpScore += tmp_begin; + tmpScore += expMLclosing + expMLintern[tt]; + tmp_p = LOG_ADD(tmp_p, tmpScore); + + tmpScore = tmpq1; + tmpScore += tmp_begin; + tmpScore += expMLclosing + expMLintern[tt]; + tmp_p = LOG_ADD(tmp_p, tmpScore); + } + + assert(IMPOSSIBLE <= tmp_p && tmp_p <= 0); + prob = LOG_ADD(prob, tmp_p); + + tmp_p = IMPOSSIBLE; + for(int i = h-TURN; i <= h-1; i++) { + if(i >= 0) { + float tmpScore = q1.ref(i,l); + tmpScore += tmp_begin; + tmpScore += expMLclosing + expMLintern[tt]; + tmp_p = LOG_ADD(tmp_p, tmpScore); + } + } + assert(IMPOSSIBLE <= tmp_p && tmp_p <= 0); + prob = LOG_ADD(prob, tmp_p); + } + else { + prob = IMPOSSIBLE; + } + + return prob; +} + +inline float +McCaskill:: +compPm(int i, int l) +{ + float tmpPm = IMPOSSIBLE; + + int *typeMatPointer = typeMat.getPointer(i,n_seq-1); + float *pPointer = p.getPointer(i,n_seq); + float *amPointer = am.getPointer(l+1,n_seq-1); + float *abPointer = ab.getPointer(i, n_seq); + for(int j = n_seq - 1; j >= l + TURN + 1; j--) { + int type = *typeMatPointer--; + pPointer--; + amPointer--; + abPointer--; + if(Beta::isCanonicalReducedPairCode(type)) { + float tmp = *pPointer; + tmp += *amPointer; + tmp += endStemScore(i, j); + tmpPm = LOG_ADD(tmpPm, tmp); + } + } + tmpPm += expMLintern[1]; + + return tmpPm; +} + +inline float +McCaskill:: +compPm1(int i, int l) +{ + float tmpPm1 = IMPOSSIBLE; + + int j = l + 1; + if(j <= n_seq-1) { + int type = typeMat.ref(i,j); + if(Beta::isCanonicalReducedPairCode(type)) { + float tmp = p.ref(i,j); + tmp += endStemScore(i, j); + tmpPm1 = tmp; + } + tmpPm1 += expMLintern[1]; + } + if(l+1 <= n_seq - 1) { + tmpPm1 = LOG_ADD(tmpPm1, am1.ref(i, l+1)); + } + + return tmpPm1; +} + +void +McCaskill:: +Outside() +{ + for(int h = 0; h <= n_seq - TURN - 2; h++) { + float *pPointer = p.getPointer(h, n_seq-1); + float *q1Pointer = q1.getPointer(h, n_seq-1); + float *am1Pointer = am1.getPointer(h, n_seq-1); + int *typePointer = typeMat.getPointer(h, n_seq-1); + for(int l = n_seq-1; l >= h + TURN + 1; l--) { + int tmpType = *typePointer--; + pv.ref(h,l) = *pPointer-- = compP(h,l,tmpType); + q1v.ref(h,l) = *q1Pointer-- = compPm(h,l); + am1v.ref(h,l) = *am1Pointer-- = compPm1(h,l); + + assert(p.ref(h,l) <= 0); + } + } +} + +void +McCaskill:: +printProbMat() +{ + int m = 0; + for(int i = 0; i < n_seq; i++) cout << " " << seq[i]; + cout << endl; + for(int i = 0; i < n_seq; i++) { + if(m < n_seq) { + cout << seq[m]; + } + for(int j = 0; j <= i-1; j++) { + if(j != i-1) cout << " "; + else cout << " "; + } + if(i != 0 && i != n_seq-1) { + cout << "\\"; + } + + for(int j = i; j < n_seq; j++) { + if(p.ref(i,j) > 0.01) { + + int type = Beta::getReducedPairCode(numSeq[i], numSeq[j]); + + if(!Beta::isCanonicalReducedPairCode(type)) { + cout << "\n" << seq[i] << " " << seq[j] << " " << exp(p.ref(i,j)) << endl; + } + + if(j != n_seq-1) { + cout << "* "; + } + else { + cout << "*"; + } + + } + else { + + if(j != n_seq-1) { + cout << " "; + } + else { + cout << " "; + } + + } + + } + if(m < n_seq) { + cout << seq[m++] << endl; + } + if(i == n_seq - 1) cout << endl; + } + for(int i = 0; i < n_seq; i++) cout << " " << seq[i]; + cout << endl; +} + +void +McCaskill:: +initParameter() +{ + float GT; + float RT_KCAL_MOL = McCaskill::T*McCaskill::GASCONST; + int len = 31; + + for(int i = 0; i < len; i++) { + GT = energyParam.getHairpin(i); + exphairpin[i] = -GT*10/RT_KCAL_MOL; + } + + for (int i = 0; i < len; i++) { + GT = energyParam.getBulge(i); + expbulge[i] = -GT*10/RT_KCAL_MOL; + GT = energyParam.getInternalLoop(i); + expinternalLoop[i] = -GT*10/RT_KCAL_MOL; + } + expinternalLoop[2] = -80*10/RT_KCAL_MOL; /* special case of size 2 interior loops (single mismatch) */ + + // float lxc = energy_param3::lxc37; + for (int i = 31; i < n_seq; i++) { + GT = energyParam.getHairpin(30) + (107.856*LOG((float)i/30)); + exphairpin[i] = -GT*10/RT_KCAL_MOL; + } + + for(int i = 0; i < 5; i++) { + GT = energyParam.getNinio(i); + for(int j = 0; j <= MAXLOOP; j++) { + expninio[i][j] = -MIN(energyParam.getMaxNinio(), j*GT)*10/RT_KCAL_MOL; + } + } + + for(int i = 0; i < 30; i++) { + GT = energyParam.getTetraLoopEnergy(i); + exptetraLoopEnergy[i] = -GT*10/RT_KCAL_MOL; + } + + /*no parameters for Triloop*/ + for(int i = 0; i < 2; i++) { + GT = 0; + exptriLoopEnergy[i] = -GT*10/RT_KCAL_MOL; + } + + GT = energyParam.getMLclosing(); + expMLclosing = -GT*10/RT_KCAL_MOL; + + for(int i = 0; i <= NBPAIRS; i++) { + GT = energyParam.getMLintern(); + expMLintern[i] = -GT*10/RT_KCAL_MOL; + } + + expTermAU = -energyParam.getTerminalAU()*10/RT_KCAL_MOL; + + GT = energyParam.getMLBase(); + for(int i = 0; i < len; i++) { + expMLbase[i] = -GT*10*(float)i/RT_KCAL_MOL; + } + + /* + if danlges = 0 just set their energy to 0, + don't let dangle energyies become > 0 (at large temps) + but make sure go smoothly to 0 + */ + for(int i = 0; i < 6; i++) { + for(int j =0; j < 4; j++) { + GT = energyParam.getDangle5(i,j); + expdangle5[i][j] = -GT*10/RT_KCAL_MOL; + GT = energyParam.getDangle3(i,j); + expdangle3[i][j] = -GT*10/RT_KCAL_MOL; + } + } + + /* stacking energies */ + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + GT = energyParam.getStack(i,j); + expStack[i][j] = -GT*10/RT_KCAL_MOL; + } + } + + /* mismatch energies */ + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 16; j++) { + GT = energyParam.getTstackI(i, j); + // cout << i << " " << " " << j << " " << GT << endl; + expTstackI[i][j] = -GT*10/RT_KCAL_MOL; + GT = energyParam.getTstackH(i, j); + expTstackH[i][j] = -GT*10/RT_KCAL_MOL; + } + } + + /* interior loops of length 2*/ + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + GT = energyParam.getInt11(i, j, k); + expint11[i][j][k] = -GT*10/RT_KCAL_MOL; + } + } + } + + /* interior 2*1 loops */ + for(int i = 0; i < 6; i++) { + for(int j =0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 4; l++) { + GT = energyParam.getInt21(i,j,k,l); + expint21[i][j][k][l] = -GT*10/RT_KCAL_MOL; + } + } + } + } + + /* interior 2*2 loops */ + for (int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 16; l++) { + GT = energyParam.getInt22(i,j,k,l); + expint22[i][j][k][l] = -GT*10/RT_KCAL_MOL; + } + } + } + } +} + + +inline float +McCaskill:: +expHairpinEnergy(const int type, const int l, const int i, const int j) +{ + float q; + int k; + +// assert(l >= 0); + q = exphairpin[l]; + + if(l == 4) { + char temp_seq[7]; + + for(int iter = i - 1; iter < i + 5; iter++) { + temp_seq[iter - (i-1)] = seq[iter]; + } + temp_seq[6] = '\0'; + + for(k = 0; k < 30; k++) { + if(strcmp(temp_seq, energyParam.getTetraLoop(k)) == 0) break; + } + if(k != 30) { + q += exptetraLoopEnergy[k]; + } + } + if(l == 3) { + + /* no triloop bonus + char temp_seq[6]; + + for(int iter = i - 1; iter < i + 4; iter++) { + temp_seq[iter - (i-1)] = seq[iter]; + } + temp_seq[6] = '\0'; + for(k = 0; k < 2; k++) { + if(strcmp(temp_seq, energyParam.getTriLoop(k)) == 0) break; + } + if(k != 2) { + q *= exptriLoopEnergy[k]; + } + */ + + if(type != Beta::REDUCED_CG_CODE && type != Beta::REDUCED_GC_CODE) q += expTermAU; + } + else { + int type2 = Beta::getPairCode(numSeq[i], numSeq[j]); + q += expTstackH[type][type2]; + } + + return q; +} + + +inline float +McCaskill:: +expLoopEnergy(int u1, int u2, int type, int type2, + int si1, int sj1, int sp1, int sq1) +{ + float z = 0; + + if((u1 == 0) && (u2 == 0)) { z = expStack[type][type2]; } + else { + if((u1 == 0) || (u2 == 0)) { + int u; + if(u1 == 0) { u = u2; } + else { u = u1; } + z = expbulge[u]; + if(u1 + u2 == 1) z += expStack[type][type2]; + else { + if (type != Beta::REDUCED_CG_CODE && type != Beta::REDUCED_GC_CODE) z += expTermAU; + if (type2 != Beta::REDUCED_CG_CODE && type2 != Beta::REDUCED_GC_CODE) z += expTermAU; + } + } + else { + if(u1 + u2 == 2) { + z = expint11[type][type2][Beta::getPairCode(numSeq[si1], numSeq[sj1])]; + } + else if((u1 == 1) && (u2 == 2)) { + z = expint21[type][type2][Beta::getPairCode(numSeq[si1], numSeq[sj1])][numSeq[sq1]]; + } + else if((u1 == 2) && (u2 == 1)) { + z = expint21[type2][type][Beta::getPairCode(numSeq[sq1], numSeq[sp1])][numSeq[si1]]; + } + else if((u1 == 2) && (u2 == 2)) { + z = expint22[type][type2][Beta::getPairCode(numSeq[si1], numSeq[sj1])][Beta::getPairCode(numSeq[sp1], numSeq[sq1])]; + } + else { + z = expinternalLoop[u1 + u2] + + expTstackI[type][Beta::getPairCode(numSeq[si1], numSeq[sj1])] + + expTstackI[type2][Beta::getPairCode(numSeq[sq1], numSeq[sp1])]; + z += expninio[2][abs(u1-u2)]; + } + } + } + + return z; +} + +void +McCaskill:: +printExpEnergy() +{ + cout << "exphairpin:" << endl; + for(int i = 0; i < 31; i++) { + cout << exphairpin[i] << endl; + } + + cout << "expninio[5][32]:" << endl; + for(int i = 0; i < 5; i++) { + for(int j = 0; j < 32; j++) { + cout << expninio[i][j] << " "; + } + cout << endl; + } + + cout << "expdangle5[6][4]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 4; j++) { + cout << expdangle5[i][j] << " "; + } + cout << endl; + } + + cout << "expdangle3[6][4]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 4; j++) { + cout << expdangle3[i][j] << " "; + } + cout << endl; + } + + cout << "expinternalLoop[31]:" << endl; + for(int i = 0; i < 31; i++) { + cout << i << ":" << expinternalLoop[i] << endl; + } + cout << "expbulge[31]:" << endl; + for(int i = 0; i < 31; i++) { + cout << i << ":" << expbulge[i] << endl; + } + + cout << "exptriLoopEnergy[2]:" << endl; + for(int i = 0; i < 2; i++) { + cout << i << ":" << exptriLoopEnergy[i] << endl; + } + + cout << "exptetraLoopEnergy[15]" << endl; + for(int i = 0; i < 15; i++) { + cout << i << ":" << exptetraLoopEnergy[i] << endl; + } + + cout << "expStack[6][6]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + cout << expStack[i][j] << " "; + } + cout << endl; + } + + cout << "expTstackH[6][16]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 16; j++) { + cout << expTstackH[i][j] << " "; + } + cout << endl; + } + + cout << "expTstackI[6][16]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 16; j++) { + cout << expTstackI[i][j] << " "; + } + cout << endl; + } + + cout << "expMLclosing=" << expMLclosing << endl; + cout << "expMLintern:" << endl; + for(int i = 0; i < 8; i++) { + cout << expMLintern[i] << " "; + } + cout << endl; + + cout << "expMLbase[31]:"; + for(int i = 0; i < 31; i++) { + cout << i << ":" << expMLbase[i] << endl; + } + + cout << "expint11[6][6][16]:"; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + cout << expint11[i][j][k] << " "; + } + cout << endl; + } + cout << endl; + } + + cout << "expint21[6][6][16][4]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 4; l++) { + cout << expint21[i][j][k][l] << " "; + } + cout << endl; + } + cout << endl; + } + cout << endl; + } + + + cout << "expint22[6][6][16][16]:" << endl; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + for(int k = 0; k < 16; k++) { + for(int l = 0; l < 16; l++) { + cout << expint22[i][j][k][l] << " "; + } + cout << endl; + } + cout << endl; + } + cout << endl; + } + +} + +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.hpp new file mode 100644 index 0000000000..97ef7df9f7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/McCaskill.hpp @@ -0,0 +1,202 @@ + +#ifndef MCCAKILL_H +#define MCCAKILL_H + +//#define NDEBUG + +#include +#include +#include "nrutil.h" +#include +#include "Util.hpp" +#include "Beta.hpp" + +#include "energy_param.hpp" +//#include "energy_param3.hpp" + +#include "ScoreType.hpp" + + +using namespace std; +using namespace ProbCons; + +namespace MXSCARNA { +class McCaskill { + char *seq; + int *numSeq; + int n_seq; + static energy_param energyParam; + + Trimat a, q1, ab, am, am1, p; + TriVertMat q1v, abv, amv, am1v, pv; + Trimat typeMat; + + void printExpEnergy(); + void initParameter(); + void Inside(); + void Outside(); + void convertProbability(); + + inline float expHairpinEnergy(const int type, const int l, const int i, const int j); + inline float expLoopEnergy(int u1, int u2, int type, int type2, + int si1, int sj1, int sp1, int sq1); + + inline float compQb(int i, int j, int tmpType); + inline float compQm1(int i, int j, int tmpType); + inline float compQm(int i, int j); + inline float compQ1(int i, int j, int tmpType); + inline float compQ(int i, int j); + inline float compP(int h, int l, int tmpType); + inline float compPm(int i, int l); + inline float compPm1(int i, int l); + inline float beginStemScore(const int i, const int j) const; + inline float endStemScore(const int i, const int j) const; + + static const float GASCONST; + static const float T; + static const int MAXLOOP; + static const int TETRA_ENTH37; + static const int NBPAIRS; + static const int SCALE; + static const int TURN; + static float *exphairpin; + static float expninio[5][32]; + static float expdangle5[6][4]; + static float expdangle3[6][4]; + static float expinternalLoop[31]; + static float expbulge[31]; + static char exptriLoop[2][6]; + static float exptriLoopEnergy[2]; + static char exptetraLoop[30][7]; + static float exptetraLoopEnergy[30]; + static float expStack[6][6]; + static float expTstackH[6][16]; + static float expTstackI[6][16]; + static float expint11[6][6][16]; + static float expint21[6][6][16][4]; + static float expint22[6][6][16][16]; + static float expMLclosing; + static float expMLintern[8]; + static float expTermAU; + static float expMLbase[31]; + + public: + + McCaskill(int n, const char *mySeq) { + seq = new char[n + 1]; + numSeq = new int[n + 1]; + n_seq = 0; + + + for(int i = 0; i < n; i++) { + if (mySeq[i] == 'a' || mySeq[i] == 'A') { seq[n_seq] = 'A'; numSeq[n_seq] = Beta::A_CODE; n_seq++; } + else if(mySeq[i] == 't' || mySeq[i] == 'T' || + mySeq[i] == 'u' || mySeq[i] == 'U') { seq[n_seq] = 'U'; numSeq[n_seq] = Beta::U_CODE; n_seq++; } + else if(mySeq[i] == 'g' || mySeq[i] == 'G') { seq[n_seq] = 'G'; numSeq[n_seq] = Beta::G_CODE; n_seq++; } + else if(mySeq[i] == 'c' || mySeq[i] == 'C') { seq[n_seq] = 'C'; numSeq[n_seq] = Beta::C_CODE; n_seq++; } + else if(mySeq[i] == 'n' || mySeq[i] == 'N') { seq[n_seq] = 'N'; numSeq[n_seq] = Beta::N_CODE; n_seq++; } + else if(mySeq[i] == '.' || mySeq[i] == '-') { seq[n_seq] = '-'; numSeq[n_seq] = Beta::GAP_CODE; n_seq++; } + else { seq[n_seq] = mySeq[i]; numSeq[n_seq] = Beta::INVALID_CODE; n_seq++; } + } + seq[n_seq] = '\0'; + a.Allocator(n_seq); + q1.Allocator(n_seq); + ab.Allocator(n_seq); + am.Allocator(n_seq); + am1.Allocator(n_seq); + p.Allocator(n_seq); + q1v.Allocator(n_seq); + abv.Allocator(n_seq); + amv.Allocator(n_seq); + am1v.Allocator(n_seq); + pv.Allocator(n_seq); + typeMat.Allocator(n_seq); + + if(n_seq > 31) { + exphairpin = new float[n_seq + 1]; + } + else { + exphairpin = new float[31]; + } + + for(int i = 0; i < n_seq; i++) { + for(int j = i; j < n_seq; j++) { + a.ref(i,j) = q1.ref(i,j) = IMPOSSIBLE; + q1v.ref(i,j) = IMPOSSIBLE; + } + } + + for(int i = 0; i < n_seq; i++) { + a.ref(i,i) = 0.0; + q1.ref(i,i) = IMPOSSIBLE; + q1v.ref(i,i) = IMPOSSIBLE; + } + + for(int i = 0; i < n_seq-1; i++) { + a.ref(i,i+1) = 0.0; + q1.ref(i,i+1) = IMPOSSIBLE; + q1v.ref(i,i+1) = IMPOSSIBLE; + } + + for(int i = 0; i < n_seq-2; i++) { + a.ref(i,i+2) = 0.0; + q1.ref(i,i+2) = IMPOSSIBLE; + q1v.ref(i,i+2) = IMPOSSIBLE; + } + + for(int i = 0; i < n_seq-3; i++) { + a.ref(i,i+3) = 0.0; + q1.ref(i,i+3) = IMPOSSIBLE; + q1v.ref(i,i+3) = IMPOSSIBLE; + + } + + for(int i = 0; i < n_seq; i++) { + for(int j = i; j < n_seq; j++) { + ab.ref(i,j) = am.ref(i,j) = am1.ref(i,j) = p.ref(i,j) = IMPOSSIBLE; + abv.ref(i,j) = amv.ref(i,j) = am1v.ref(i,j) = pv.ref(i,j) = IMPOSSIBLE; + } + } + + /* the type of base pair */ + /* C <-> G : type 1 */ + /* G <-> C : type 2 */ + /* G <-> U : type 3 */ + /* U <-> G : type 5 */ + /* A <-> U : type 0 */ + /* U <-> A : type 4 */ + /* ? <-> ? : type 6 */ + for(int i = 0; i < n_seq; i++) { + for(int j = i; j < n_seq; j++) { + typeMat.ref(i,j) = Beta::getReducedPairCode(numSeq[i], numSeq[j]); + } + } + + } + + /*------------------------------------------------------------------------*/ + /* dangling ends should never be destabilizing, i.e. expdangle>=1 */ + /* specific heat needs smooth function (2nd derivative) */ + /* we use a*(sin(x+b)+1)^2, with a=2/(3*sqrt(3)), b=Pi/6-sqrt(3)/2, */ + /* in the interval b0.8660254)?(X): + SCALE*0.38490018*(sin((X)/SCALE-0.34242663)+1)*(sin((X)/SCALE-0.34242663)+1)); + } + + ~McCaskill() { + delete[] seq; + delete[] numSeq; + delete[] exphairpin; + } + + void calcPartitionFunction(); + void printProbMat(); + + inline float getProb(const int i, const int j) const { + // 0 origin : 0..(n-1) + return p.ref(i, j); + } +}; +} +#endif // MCCASKILL_H diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/README b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/README new file mode 100644 index 0000000000..0578545bac --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/README @@ -0,0 +1,129 @@ +1.Program name + MXSCARNA + +2.Author + Yasuo Tabei + + Department of Computational Biology, + Graduate School of Frontier Science, + The University of Tokyo + and + Computational Biology Research Center (CBRC), + National Institute of Advanced Industrial Science and Technology (AIST) + + E-mail: scarna@m.aist.go.jp + +3.What is MXSCARNA + MXSCARNA (Multiplex Stem Candidate Aligner for RNAs) is a tool for + fast structural multiple alignment of RNA sequences using progressive + alignment based on pairwise structural alignment algorithm of SCARNA. + +4.License + While its original source code is provided as free software, MXSCARNA + contains the source codes of ProbCons and Rfold and the energy parameters + of Vienna RNA package (version 1.5). + The author thanks Dr. Chuong Do, Dr. Hisanori Kiryu and Dr. Ivo Hofacker, + the authors of ProbCons, Rfold and Vienna RNA package respectively, + and Institute for Theoretical Chemistry of the University of Vienna. + + The source code of Rfold is located in ./src/rfold-0.1, which includes + energy parameters of Vienna RNA package in ./src/rfold-0.1/src/vienna. + Energy parameters of Vienna RNA package are also included in the source + code of MXSCARNA (./src/vienna). Please follow ./src/rfold-0.1/readme.txt + file, which describes the license of Rfold, and + ./src/rfold-0.1/src/vienna/COPYING file and ./src/vienna/COPYING file, + which describe the copyright notice of the Vienna RNA package. + The source code of ProbCons is located in ./src/probconsRNA. Please follow + ./src/probcons/README. + + The original part of MXSCARNA is provided as free software. It is + distributed in the hope that it will be useful but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + PARTICULAR PURPOSE. + + Permission is granted for research, educational, and commercial use + and modification so long as + 1) the package and any derived works are not redistributed for any fee, + other than media costs, + 2) proper credit is given to + the authors of MXSCARNA, ProbCons, Rfold and Vienna RNA package, + the Univeristy of Tokyo, + Computational Biology Research Center (CBRC), AIST + and Institute for Theoretical Chemistry of the University of Vienna. + + If you want to include this software in a commercial product, please + contact the author. + +5.Citation + Yasuo Tabei, Hisanori Kiryu, Taishin Kin, Kiyoshi Asai: + "A fast structural multiple alignment method for long RNA sequences," + BMC bioinformatics, to appear. + +6.References + + Do, C.B., Mahabhashyam, M.S.P., Brudno, M., and Batzoglou, S. 2005. + PROBCONS: Probabilistic Consistency-based Multiple Sequence Alignment. + Genome Research 15: 330-340. + + Hisanori Kiryu, Taishin Kin, and Kiyoshi Asai + Rfold: An exact algorithm for computing local base pairing probabilities + Bioinformatics, Advance Access published on December 4, 2007; + doi:10.1093/bioinformatics/btm591 + + Ivo L. Hofacker + Vienna RNA secondary structure server + Nucleic Acids Res., Jul 2003; 31: 3429 - 3431. + + Yasuo Tabei, Koji Tsuda, Taishin Kin, and Kiyoshi Asai + SCARNA: fast and accurate structural alignment of RNA sequences by matching fixed-length stem fragments + Bioinformatics 2006 22(14):1723-1729. + +7.Install + The program was tested using gcc 3.3.3 on linux machines and gcc 3.4 on + cygwin Some gcc specific features are currently used. + + The command to compile this software is as follows: + + make + cd program + +8.Usage + + ./mxscarna [options] seqfile + + seqfile: + sequence file is multi fasta format. + + options: + -clustalw + use CLUSTALW output format instead of MFA + + -stockholm + use STOCKHOLM output format instead of MFA + + -mxscarna + use original output format instead of MFA + + -l + the length of stem candidates (default:2) + + -b + the threshold of base-pairing probability (default:0.01) + + -g + the control parameter of the prediction of base-pairs, (default:6) + + -rfold + use Rfold instead of global McCaskill algorithm to calcurate base + paring probality matrices, (default: off) + + -w + the control parameter of the distance of stem candidates, (default:500) + +9.Example + ./mxscarna -mxscarna ../sample/trna.mfa + +10.Version History +1. 1/16/2008 (Yasuo Tabei) +-- MXSCARNA ver 2.0 release + - Rfold was included. \ No newline at end of file diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/ScoreType.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/ScoreType.hpp new file mode 100644 index 0000000000..46aa6989ca --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/ScoreType.hpp @@ -0,0 +1,340 @@ +///////////////////////////////////////////////////////////////// +// ScoreType.h +// +// Routines for doing math operations in PROBCONS. +///////////////////////////////////////////////////////////////// + +#ifndef SCORETYPE_H +#define SCORETYPE_H + +#include +#include +#include +#include + +typedef float ScoreType; + +const float LOG_ZERO = -2e20; +const float LOG_ONE = 0.0; + +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG (ScoreType x){ + return log (x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x). +///////////////////////////////////////////////////////////////// + +inline ScoreType EXP (ScoreType x){ + //return exp(x); + if (x > -2){ + if (x > -0.5){ + if (x > 0) + return exp(x); + return (((0.03254409303190190000*x + 0.16280432765779600000)*x + 0.49929760485974900000)*x + 0.99995149601363700000)*x + 0.99999925508501600000; + } + if (x > -1) + return (((0.01973899026052090000*x + 0.13822379685007000000)*x + 0.48056651562365000000)*x + 0.99326940370383500000)*x + 0.99906756856399500000; + return (((0.00940528203591384000*x + 0.09414963667859410000)*x + 0.40825793595877300000)*x + 0.93933625499130400000)*x + 0.98369508190545300000; + } + if (x > -8){ + if (x > -4) + return (((0.00217245711583303000*x + 0.03484829428350620000)*x + 0.22118199801337800000)*x + 0.67049462206469500000)*x + 0.83556950223398500000; + return (((0.00012398771025456900*x + 0.00349155785951272000)*x + 0.03727721426017900000)*x + 0.17974997741536900000)*x + 0.33249299994217400000; + } + if (x > -16) + return (((0.00000051741713416603*x + 0.00002721456879608080)*x + 0.00053418601865636800)*x + 0.00464101989351936000)*x + 0.01507447981459420000; + return 0; +} + +/* +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOOKUP (ScoreType x){ + //return log (exp(x) + 1); + if (x < 2){ + if (x < 0.5){ + if (x < 0) + return log (exp(x) + 1); + return (((-0.00486373205785640000*x - 0.00020245408813934800)*x + 0.12504222666029800000)*x + 0.49999685320563000000)*x + 0.69314723138948900000; + } + if (x < 1) + return (((-0.00278634205460548000*x - 0.00458097251248546000)*x + 0.12865849880472500000)*x + 0.49862228499205200000)*x + 0.69334810088688000000; + return (((0.00059633755154209200*x - 0.01918996666063320000)*x + 0.15288232492093800000)*x + 0.48039958825756900000)*x + 0.69857578503189200000; + } + if (x < 8){ + if (x < 4) + return (((0.00135958539181047000*x - 0.02329807659316430000)*x + 0.15885799609532100000)*x + 0.48167498563270800000)*x + 0.69276185058669200000; + return (((0.00011992394456683500*x - 0.00338464503306568000)*x + 0.03622746366545470000)*x + 0.82481250248383700000)*x + 0.32507892994863100000; + } + if (x < 16) + return (((0.00000051726300753785*x - 0.00002720671238876090)*x + 0.00053403733818413500)*x + 0.99536021775747900000)*x + 0.01507065715532010000; + return x; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline ScoreType LOOKUP_SLOW (ScoreType x){ + return log (exp (x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline ScoreType MAX (ScoreType x, ScoreType y, ScoreType z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG_ADD (ScoreType x, ScoreType y){ + if (x < y) return (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + return (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; +} +*/ + +/* +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline float LOG (float x){ + return log (x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x), fr -4.6 <= x <= 0. +///////////////////////////////////////////////////////////////// + +inline float EXP (float x){ + assert (x <= 0.00f); + if (x < EXP_UNDERFLOW_THRESHOLD) return 0.0f; + return (((0.006349841068584 * x + 0.080775412572352) * x + 0.397982026296272) * x + 0.95279335963787f) * x + 0.995176455837312f; + //return (((0.00681169825657f * x + 0.08386267698832f) * x + 0.40413983195844f) * x + 0.95656674979767f) * x + 0.99556744049130f; +} +*/ + +const float EXP_UNDERFLOW_THRESHOLD = -4.6; +const float LOG_UNDERFLOW_THRESHOLD = 7.5; + +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline float LOOKUP (float x){ + assert (x >= 0.00f); + assert (x <= LOG_UNDERFLOW_THRESHOLD); + //return ((-0.00653779113685f * x + 0.09537236626558f) * x + 0.55317574459331f) * x + 0.68672959851568f; + if (x <= 1.00f) return ((-0.009350833524763f * x + 0.130659527668286f) * x + 0.498799810682272f) * x + 0.693203116424741f; + if (x <= 2.50f) return ((-0.014532321752540f * x + 0.139942324101744f) * x + 0.495635523139337f) * x + 0.692140569840976f; + if (x <= 4.50f) return ((-0.004605031767994f * x + 0.063427417320019f) * x + 0.695956496475118f) * x + 0.514272634594009f; + assert (x <= LOG_UNDERFLOW_THRESHOLD); + return ((-0.000458661602210f * x + 0.009695946122598f) * x + 0.930734667215156f) * x + 0.168037164329057f; + + //return (((0.00089738532761f * x - 0.01859488697982f) * x + 0.14415772028626f) * x + 0.49515490689159f) * x + 0.69311928966454f; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline float LOOKUP_SLOW (float x){ + return log (exp (x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline float MAX (float x, float y, float z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS (float &x, float y){ + if (x < y) + x = (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? y : LOOKUP(y-x) + x; + else + x = (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? x : LOOKUP(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW (float &x, float y){ + if (x < y) + x = (x == LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y == LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x, float y){ + if (x < y) return (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? y : LOOKUP(y-x) + x; + return (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? x : LOOKUP(x-y) + y; +} + + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add three log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3){ + return LOG_ADD (x1, LOG_ADD (x2, x3)); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add four log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, x4))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add five log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, x5)))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add siz log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5, float x6){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, LOG_ADD (x5, x6))))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add seven log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5, float x6, float x7){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, LOG_ADD (x5, LOG_ADD (x6, x7)))))); +} + +///////////////////////////////////////////////////////////////// +// ChooseBestOfThree() +// +// Store the largest of three values x1, x2, and x3 in *x. Also +// if xi is the largest value, then store bi in *b. +///////////////////////////////////////////////////////////////// + +inline void ChooseBestOfThree (float x1, float x2, float x3, char b1, char b2, char b3, float *x, char *b){ + if (x1 >= x2){ + if (x1 >= x3){ + *x = x1; + *b = b1; + return; + } + *x = x3; + *b = b3; + return; + } + if (x2 >= x3){ + *x = x2; + *b = b2; + return; + } + *x = x3; + *b = b3; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/StemCandidate.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/StemCandidate.hpp new file mode 100644 index 0000000000..e1678d6822 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/StemCandidate.hpp @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////// +// StemCandidate.hpp +// Profile Stem Candidate calcurated by profile base pairing +// probability matrix +//////////////////////////////////////////////////////////// + +#ifndef __STEMCANDIDATE_HPP__ +#define __STEMCANDIDATE_HPP__ + +#include +#include + +using namespace std; + +namespace MXSCARNA { +class StemCandidate { +private: + int numSeq; /* the number of sequences in the profile */ + int length; /* length of profile stem candidate of fixed length */ + int position; /* 5' start position of SC in profile */ + int distance; + std::vector substr; /* profile base string of SC */ + std::vector rvstr; /* profile base string of stem partner of SC */ + int rvposition; /* 3' end position of stem partner of SC */ + int rvscnumber; /* SC number of stem partner */ + int contPos; /* previous stem that corresponds continuous stem and has position -1. */ + int beforePos; /* most recent stem that doesn't overlap to SC and has position -len. */ + float score; /* score of the sum of base pairing probability matrix */ + std::vector baseScore; + float stacking; /* the mean of stacking energy */ + float stemStacking; /* the mean of 1-continuous stacking energy */ + +public: + StemCandidate() : numSeq(0), length(0), position(0), distance(0), + rvposition(0), rvscnumber(0), contPos(-1), beforePos(0), + score(0), stacking(0), stemStacking(0) {} + StemCandidate(int numSeq, int length) : numSeq(numSeq), length(length), + substr(numSeq), rvstr(numSeq), + contPos(-1) { } + + void SetNumSeq(int num) { numSeq = num; } + void SetLength(int len) { length = len; } + void SetNumSubstr(int num) { + substr.resize(num); + for(int i = 0; i < num; i++) { + string &tmpStr = substr[i]; + tmpStr = ""; + substr[i] = tmpStr; + } + } + void SetNumRvstr(int num) { + rvstr.resize(num); + + for(int i = 0; i < num; i++) { + string &tmpStr = rvstr[i]; + tmpStr = ""; + rvstr[i] = tmpStr; + } + } + void SetPosition(int pos) { position = pos; } + + void AddSubstr(int num, char word) { + std::string &tmpStr = substr[num]; + tmpStr += word; + substr[num] = tmpStr; + } + + void AddRvstr(int num, char word) { + std::string &tmpStr = rvstr[num]; + tmpStr += word; + rvstr[num] = tmpStr; + } + + void AddBaseScore(float score) { + baseScore.push_back(score); + } + + void SetRvposition(int pos) { rvposition = pos; } + void SetRvscnumber(int num) { rvscnumber = num; } + void SetContPos(int pos) { contPos = pos; } + void SetBeforePos(int pos) { beforePos = pos; } + void SetDistance(int d) { distance = d; } + void SetScore(float s) { score = s; } + void AddScore(float s) { score += s; } + void SetStacking(float s) { stacking = s; } + void AddStacking(float s) { stacking += s; } + void SetStemStacking(float s) { stemStacking = s; } + int GetNumSeq() const { return numSeq; } + int GetLength() const { return length; } + int GetPosition() const { return position; } + + string GetSubstr(int num) const { + const std::string &tmpStr = substr[num]; + return tmpStr; + } + string GetRvstr(int num) const { + const std::string &tmpStr = rvstr[num]; + return tmpStr; + } + float GetBaseScore(int i) const { + return baseScore[i]; + } + int GetRvposition() const { + return rvposition; + } + int GetRvscnumber() const { + return rvscnumber; + } + int GetContPos() const { + return contPos; + } + int GetBeforePos() const { + return beforePos; + } + int GetDistance() const { + return distance; + } + float GetScore() const { + return score; + } + float GetStacking() const { + return stacking; + } + float GetStemStacking() const { + return stemStacking; + } +}; +} +#endif // __STEMCANDIDATE_HPP__ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Util.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Util.hpp new file mode 100644 index 0000000000..eab7667f30 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/Util.hpp @@ -0,0 +1,102 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include // mingw de error, by katoh +#include + +namespace ProbCons { + +const double IMPOSSIBLE = -FLT_MAX + 1000; +const double IMPOSSIBLEDBL = -DBL_MAX + 10000; + +namespace MXSCARNA { +template +inline bool +IsPossible(const T& v) { + return (v > (IMPOSSIBLE + 1.0e-5)); +} + +template +inline T +logSum(const T& a, const T& b) +{ + if (a >= b) { + return a + log(1.0 + exp(b - a)); + } else { + return b + log(1.0 + exp(a - b)); + } +} + +template +inline T +logSub(const T&a, const T& b) +{ + if(a > b) { + return log(exp(a) - exp(b)); + } + else { + return log(exp(a) - exp(b)); + } +} + +template +inline T +logSum(const T& a, const T& b, const T& c) +{ + if (a >= b) { + if( a >= c ) { + return a + log(1.0 + (exp(b - a) + exp(c - a))); + } + else { + if( b >= c) { + return b + log(exp(a - b) + 1.0 + exp(c - b)); + } + } + } + return c + log(exp(a - c) + exp(b - c) + 1.0); +} + +} + +template +inline T +logSumExp(const T& x, const T& y) +{ + if(x == y) return x + 0.69314718055; + double vmin = std::min(x, y); + double vmax = std::max(x, y); + + if (vmax > vmin + 50) { + return vmax; + } + else { + return vmax + std::log (std::exp (vmin - vmax) + 1.0); + } +} +} +#endif /* UTIL_H */ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/config.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/config.h new file mode 100644 index 0000000000..51c27b8243 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/config.h @@ -0,0 +1,86 @@ +/* config.h. Generated by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the `erand48' function. */ +#define HAVE_ERAND48 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "ViennaRNA" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "rna@tbi.univie.ac.at" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "ViennaRNA" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "ViennaRNA 1.6.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "ViennaRNA" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.6.1" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* only for gcc */ +#define UNUSED __attribute__ ((unused)) + +/* Version number of package */ +#define VERSION "1.6.1" + +/* Define if using the dmalloc debugging malloc package */ +/* #undef WITH_DMALLOC */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `unsigned' if does not define. */ +/* #undef size_t */ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/nrutil.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/nrutil.h new file mode 100644 index 0000000000..3b35a054f4 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/nrutil.h @@ -0,0 +1,991 @@ +/* + McCaskill's Algorithm -- The algorithm calculates a base paring probability matrix from the input of one sequence. + + $Id: nrutil.h,v 1.0 2005/10/20 14:22 $; + + Copyright (C) 2005 Yasuo Tabei + + This is free software with ABSOLUTELY NO WARRANTY. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _NR_UTIL_H_ +#define _NR_UTIL_H_ +#include +#include +#include +#include +#include // by katoh + +using namespace std; + +typedef double DP; + +template +inline const T SQR(const T a) {return a*a;} + +template +inline const T MAX(const T &a, const T &b) +{return b > a ? (b) : (a);} + +inline float MAX(const double &a, const float &b) +{return b > a ? (b) : float(a);} + +inline float MAX(const float &a, const double &b) +{return b > a ? float(b) : (a);} + +template +inline const T MIN(const T &a, const T &b) +{return b < a ? (b) : (a);} + +inline float MIN(const double &a, const float &b) +{return b < a ? (b) : float(a);} + +inline float MIN(const float &a, const double &b) +{return b < a ? float(b) : (a);} + +template +inline const T SIGN(const T &a, const T &b) +{return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a);} + +inline float SIGN(const float &a, const double &b) +{return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a);} + +inline float SIGN(const double &a, const float &b) +{return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a);} + +template +inline void SWAP(T &a, T &b) +{T dum=a; a=b; b=dum;} +namespace NR { + inline void nrerror(const string error_text) +// Numerical Recipes standard error handler + { + cerr << "Numerical Recipes run-time error..." << endl; + cerr << error_text << endl; + cerr << "...now exiting to system..." << endl; + exit(1); + } +} + +template +class NRVec { + private: + int nn; // size of array. upper index is nn-1 + T *v; + public: + NRVec(); + explicit NRVec(int n); // Zero-based array + NRVec(const T &a, int n); //initialize to constant value + NRVec(const T *a, int n); // Initialize to array + NRVec(const NRVec &rhs); // Copy constructor + NRVec & operator=(const NRVec &rhs); //assignment + NRVec & operator=(const T &a); //assign a to every element + inline T & operator[](const int i); //i¡Çth element + inline const T & operator[](const int i) const; + void Allocator(int i = 0); // by Steffen, mpg + inline int size() const; + ~NRVec(); +}; + +template +NRVec::NRVec() : nn(0), v(0) {} + +template +NRVec::NRVec(int n) : nn(n), v(new T[n]) {} + +template +NRVec::NRVec(const T& a, int n) : nn(n), v(new T[n]) +{ + for(int i=0; i +NRVec::NRVec(const T *a, int n) : nn(n), v(new T[n]) +{ +for(int i=0; i +void NRVec::Allocator(int n) // by Steffen +{ + v = new T[n]; +} + +template +NRVec::NRVec(const NRVec &rhs) : nn(rhs.nn), v(new T[nn]) +{ + for(int i=0; i +NRVec & NRVec::operator=(const NRVec &rhs) +// postcondition: normal assignment via copying has been performed; +// if vector and rhs were different sizes, vector +// has been resized to match the size of rhs +{ + if (this != &rhs) +{ + if (nn != rhs.nn) { + if (v != 0) delete [] (v); + nn=rhs.nn; + v= new T[nn]; + } + for (int i=0; i +NRVec & NRVec::operator=(const T &a) //assign a to every element +{ + for (int i=0; i +inline T & NRVec::operator[](const int i) //subscripting +{ + return v[i]; +} + +template +inline const T & NRVec::operator[](const int i) const //subscripting +{ + return v[i]; +} + +template +inline int NRVec::size() const +{ + return nn; +} + +template +NRVec::~NRVec() +{ + if (v != 0) + delete[] (v); +} + +template +class NRMat { + private: + int nn; + int mm; + T **v; + public: + NRMat(); + NRMat(int n, int m); // Zero-based array + NRMat(const T &a, int n, int m); //Initialize to constant + NRMat(const T *a, int n, int m); // Initialize to array + NRMat(const NRMat &rhs); // Copy constructor + void Allocator(int n, int m); + void Allocator(const T &a, int n, int m); + void Allocator(const T *a, int n, int m); + NRMat & operator=(const NRMat &rhs); //assignment + NRMat & operator=(const T &a); //assign a to every element + inline T* operator[](const int i); //subscripting: pointer to row i + inline const T* operator[](const int i) const; + inline T & ref(const int i, const int j); + inline const T ref(const int i, const int j) const; + inline int nrows() const; + inline int ncols() const; + ~NRMat(); +}; + +template +NRMat::NRMat() : nn(0), mm(0), v(0) {} + +template +NRMat::NRMat(int n, int m) : nn(n), mm(m), v(new T*[n]) +{ + v[0] = new T[m*n]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + m; +} + +template +NRMat::NRMat(const T &a, int n, int m) : nn(n), mm(m), v(new T*[n]) +{ + int i,j; + v[0] = new T[m*n]; + for (i=1; i< n; i++) + v[i] = v[i-1] + m; + for (i=0; i< n; i++) + for (j=0; j +NRMat::NRMat(const T *a, int n, int m) : nn(n), mm(m), v(new T*[n]) +{ + int i,j; + v[0] = new T[m*n]; + for (i=1; i< n; i++) + v[i] = v[i-1] + m; + for (i=0; i< n; i++) + for (j=0; j +void NRMat::Allocator(int n, int m) +{ + if( v != 0 ) { + delete[] (v[0]); delete (v); + } + + nn = n; mm = m; v = new T*[n]; + + v[0] = new T[m*n]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + m; +} + +template +void NRMat::Allocator(const T &a, int n, int m) +{ + if( v != 0 ) { + delete[] (v[0]); delete (v); + } + + int i,j; + + nn = n; mm = m; v = new T*[n]; + + v[0] = new T[m*n]; + for (i=1; i< n; i++) + v[i] = v[i-1] + m; + for (i=0; i< n; i++) + for (j=0; j +void NRMat::Allocator(const T *a, int n, int m) +{ + if( v != 0 ) { + delete[] (v[0]); delete (v); + } + + int i,j; + + nn = n; mm = m; v = new T*[n]; + + v[0] = new T[m*n]; + for (i=1; i< n; i++) + v[i] = v[i-1] + m; + for (i=0; i< n; i++) + for (j=0; j +NRMat::NRMat(const NRMat &rhs) : nn(rhs.nn), mm(rhs.mm), v(new T*[nn]) +{ + int i,j; + v[0] = new T[mm*nn]; + for (i=1; i< nn; i++) + v[i] = v[i-1] + mm; + for (i=0; i< nn; i++) + for (j=0; j +NRMat & NRMat::operator=(const NRMat &rhs) +// postcondition: normal assignment via copying has been performed; +// if matrix and rhs were different sizes, matrix +// has been resized to match the size of rhs +{ + if (this != &rhs) { + int i,j; + if (nn != rhs.nn || mm != rhs.mm) { + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } + nn=rhs.nn; + mm=rhs.mm; + v = new T*[nn]; + v[0] = new T[mm*nn]; + } + for (i=1; i< nn; i++) + v[i] = v[i-1] + mm; + for (i=0; i< nn; i++) + for (j=0; j +NRMat & NRMat::operator=(const T &a) //assign a to every element +{ + for (int i=0; i< nn; i++) + for (int j=0; j +inline T* NRMat::operator[](const int i) //subscripting: pointer to row i +{ + return v[i]; +} + +template +inline const T* NRMat::operator[](const int i) const +{ + return v[i]; +} + +template +inline T & NRMat::ref(const int i, const int j) +{ + return v[i][j]; +} + +template +inline const T NRMat::ref(const int i, const int j) const +{ + return v[i][j]; +} + +template +inline int NRMat::nrows() const +{ + return nn; +} + +template +inline int NRMat::ncols() const +{ + return mm; +} + +template +NRMat::~NRMat() +{ + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } +} + +template +class NRMat3d { + private: + int nn; + int mm; + int kk; + T ***v; + public: + NRMat3d(); + NRMat3d(int n, int m, int k); + inline void Allocator(int n, int m, int k); + inline T** operator[](const int i); //subscripting: pointer to row i + inline const T* const * operator[](const int i) const; + inline int dim1() const; + inline int dim2() const; + inline int dim3() const; + ~NRMat3d(); +}; + +template +NRMat3d::NRMat3d(): nn(0), mm(0), kk(0), v(0) {} +template +NRMat3d::NRMat3d(int n, int m, int k) : nn(n), mm(m), kk(k), v(new T**[n]) +{ + int i,j; + v[0] = new T*[n*m]; + v[0][0] = new T[n*m*k]; + for(j=1; j +inline void NRMat3d::Allocator(int n, int m, int k) +{ + int i,j; + v[0] = new T*[n*m]; + v[0][0] = new T[n*m*k]; + for(j=1; j +inline T** NRMat3d::operator[](const int i) //subscripting: pointer to row i +{ + return v[i]; +} + +template +inline const T* const * NRMat3d::operator[](const int i) const +{ + return v[i]; +} + +template +inline int NRMat3d::dim1() const +{ + return nn; +} + +template +inline int NRMat3d::dim2() const +{ + return mm; +} + +template +inline int NRMat3d::dim3() const +{ + return kk; +} + +template +NRMat3d::~NRMat3d() +{ + if (v != 0) { + delete[] (v[0][0]); + delete[] (v[0]); + delete[] (v); + } +} + +//The next 3 classes are used in artihmetic coding, Huffman coding, and +//wavelet transforms respectively. This is as good a place as any to put them! +class arithcode { + private: + NRVec *ilob_p,*iupb_p,*ncumfq_p; + public: + NRVec &ilob,&iupb,&ncumfq; + unsigned long jdif,nc,minint,nch,ncum,nrad; + arithcode(unsigned long n1, unsigned long n2, unsigned long n3) + : ilob_p(new NRVec(n1)), + iupb_p(new NRVec(n2)), + ncumfq_p(new NRVec(n3)), + ilob(*ilob_p),iupb(*iupb_p),ncumfq(*ncumfq_p) {} + ~arithcode() { + if (ilob_p != 0) delete ilob_p; + if (iupb_p != 0) delete iupb_p; + if (ncumfq_p != 0) delete ncumfq_p; + } +}; + +class huffcode { + private: + NRVec *icod_p,*ncod_p,*left_p,*right_p; + public: + NRVec &icod,&ncod,&left,&right; + int nch,nodemax; + huffcode(unsigned long n1, unsigned long n2, unsigned long n3, + unsigned long n4) : + icod_p(new NRVec(n1)), + ncod_p(new NRVec(n2)), + left_p(new NRVec(n3)), + right_p(new NRVec(n4)), + icod(*icod_p),ncod(*ncod_p),left(*left_p),right(*right_p) {} + ~huffcode() { + if (icod_p != 0) delete icod_p; + if (ncod_p != 0) delete ncod_p; + if (left_p != 0) delete left_p; + if (right_p != 0) delete right_p; + } +}; + +class wavefilt { + private: + NRVec *cc_p,*cr_p; + public: + int ncof,ioff,joff; + NRVec &cc,&cr; + wavefilt() : cc(*cc_p),cr(*cr_p) {} + wavefilt(const DP *a, const int n) : //initialize to array + cc_p(new NRVec(n)),cr_p(new NRVec(n)), + ncof(n),ioff(-(n >> 1)),joff(-(n >> 1)),cc(*cc_p),cr(*cr_p) { + int i; + for (i=0; i +class Trimat { + private: + int nn; + T **v; + inline T* operator[](const int i); //subscripting: pointer to row i + inline const T* operator[](const int i) const; + public: + Trimat(); + Trimat(int n); // Zero-based array + Trimat(const T &a, int n); //Initialize to constant + Trimat(const T *a, int n); // Initialize to array + Trimat(const Trimat &rhs); // Copy constructor + void Allocator(int n); + void Allocator(const T &a, int n); + void Allocator(const T *a, int n); + Trimat & operator=(const Trimat &rhs); //assignment + Trimat & operator=(const T &a); //assign a to every element + inline T & ref(const int i, const int j); + inline T * getPointer(const int i, const int j); + inline T * begin() const; + inline T * end() const; + inline const T ref(const int i, const int j) const; + inline int nrows() const; + ~Trimat(); +}; + +template +Trimat::Trimat() : nn(0), v(0) {} + +template +Trimat::Trimat(int n) : nn(n), v(new T*[n]) +{ + v[0] = new T[n*(n+1)/2]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + (n-i+1); + + for (int i=0; i< n; i++) + for (int j=0; j<(n-i); j++) + v[i][j] = 0; +} +template +Trimat::Trimat(const T &a, int n) : nn(n), v(new T*[n]) +{ + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + (n-i+1); + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = a; +} + +template +Trimat::Trimat(const T *a, int n) : nn(n), v(new T*[n]) +{ + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + (n-i+1); + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = *a++; +} + + +template +void Trimat::Allocator(int n) +{ + nn = n; v = new T*[n]; + + v[0] = new T[n*(n+1)/2]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + (n-i+1); +} + +template +void Trimat::Allocator(const T &a, int n) +{ + nn = n; v = new T*[n]; + + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i < n; i++) + v[i] = v[i-1] + (n-i+1); + for (i=0; i < n; i++) + for (j=0; j < (n-i); j++) + v[i][j] = a; +} + +template +void Trimat::Allocator(const T *a, int n) +{ + nn = n; v = new T*[n]; + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + (n-i+1); + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = *a++; +} + + +template +Trimat::Trimat(const Trimat &rhs) : nn(rhs.nn), v(new T*[nn]) +{ + int i,j; + v[0] = new T[nn*(nn+1)/2]; + for (i=1; i< nn; i++) + v[i] = v[i-1] + (nn-i+1); + for (i=0; i< nn; i++) + for (j=0; j<(nn-i); j++) + v[i][j] = rhs[i][j]; +} +template +Trimat & Trimat::operator=(const Trimat &rhs) +// postcondition: normal assignment via copying has been performed; +// if matrix and rhs were different sizes, matrix +// has been resized to match the size of rhs +{ + if (this != &rhs) { + int i,j; + if (nn != rhs.nn) { + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } + nn=rhs.nn; + v = new T*[nn]; + v[0] = new T[nn*(nn+1)/2]; + } + for (i=1; i< nn; i++) + v[i] = v[i-1] + (nn-i+1); + for (i=0; i< nn; i++) + for (j=0; j<(nn-i); j++) + v[i][j] = rhs[i][j]; + } + return *this; +} + +template +Trimat & Trimat::operator=(const T &a) //assign a to every element +{ + for (int i=0; i< nn; i++) + for (int j=0; j +inline T & Trimat::ref(const int i, const int j) +{ + return v[i][j-i]; +} + +template +inline const T Trimat::ref(const int i, const int j) const +{ + return v[i][j-i]; +} + +template +inline T * Trimat::getPointer(const int i, const int j) +{ + return &v[i][j-i]; +} + +template +inline T * Trimat::begin() const +{ + return &v[0][0]; +} + +template +inline T * Trimat::end() const +{ + return (&v[nn-1][0] + 1); +} + +template +inline int Trimat::nrows() const +{ + return nn; +} + +template +Trimat::~Trimat() +{ + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } +} + + +/* Triangle Vertical Matrix Class + --------------------------------------------------------- + |v[0][0]|v[1][0]| | | |v[n-1][0]| + |-------|-------|------|------------|---------|---------| + |v[0][1]|v[1][1]| | |v[n-2][1]| | + |-------|-------|------|------------|---------|---------| + | | | | | | | + |-------|-------|------|------------|---------|---------| + | | | + | | | + | | | + |-------|-----------------------------------------------| + | | | + |-------|-----------------------------------------------| + |v[0][n-2]|v[n-2][n-2]| | + |-------|-----------------------------------------------| + |v[0][n-1]| | + |-------------------------------------------------------| + */ +template +class TriVertMat { + private: + int nn; + T **v; + inline T* operator[](const int i); //subscripting: pointer to row i + inline const T* operator[](const int i) const; + public: + TriVertMat(); + TriVertMat(int n); // Zero-based array + TriVertMat(const T &a, int n); //Initialize to constant + TriVertMat(const T *a, int n); // Initialize to array + TriVertMat(const TriVertMat &rhs); // Copy constructor + void Allocator(int n); + void Allocator(const T &a, int n); + void Allocator(const T *a, int n); + TriVertMat & operator=(const TriVertMat &rhs); //assignment + TriVertMat & operator=(const T &a); //assign a to every element + inline T & ref(const int i, const int j); + inline T * getPointer(const int i, const int j); + inline const T ref(const int i, const int j) const; + inline int nrows() const; + ~TriVertMat(); +}; + +template +TriVertMat::TriVertMat() : nn(0), v(0) {} + +template +TriVertMat::TriVertMat(int n) : nn(n), v(new T*[n]) +{ + v[0] = new T[n*(n+1)/2]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + i; +} + +template +TriVertMat::TriVertMat(const T &a, int n) : nn(n), v(new T*[n]) +{ + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + i; + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = a; +} + +template +TriVertMat::TriVertMat(const T *a, int n) : nn(n), v(new T*[n]) +{ + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + i; + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = *a++; +} + + +template +void TriVertMat::Allocator(int n) +{ + nn = n; v = new T*[n]; + + v[0] = new T[n*(n+1)/2]; + for (int i=1; i< n; i++) + v[i] = v[i-1] + i; +} + +template +void TriVertMat::Allocator(const T &a, int n) +{ + nn = n; v = new T*[n]; + + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + i; + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = a; +} + +template +void TriVertMat::Allocator(const T *a, int n) +{ + nn = n; v = new T*[n]; + int i,j; + v[0] = new T[n*(n+1)/2]; + for (i=1; i< n; i++) + v[i] = v[i-1] + i; + for (i=0; i< n; i++) + for (j=0; j<(n-i); j++) + v[i][j] = *a++; +} + + +template +TriVertMat::TriVertMat(const TriVertMat &rhs) : nn(rhs.nn), v(new T*[nn]) +{ + int i,j; + v[0] = new T[nn*(nn+1)/2]; + for (i=1; i< nn; i++) + v[i] = v[i-1] + i; + for (i=0; i< nn; i++) + for (j=0; j<(nn-i); j++) + v[i][j] = rhs[i][j]; +} +template +TriVertMat & TriVertMat::operator=(const TriVertMat &rhs) +// postcondition: normal assignment via copying has been performed; +// if matrix and rhs were different sizes, matrix +// has been resized to match the size of rhs +{ + if (this != &rhs) { + int i,j; + if (nn != rhs.nn) { + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } + nn=rhs.nn; + v = new T*[nn]; + v[0] = new T[nn*(nn+1)/2]; + } + for (i=1; i< nn; i++) + v[i] = v[i-1] + i; + for (i=0; i< nn; i++) + for (j=0; j<(nn-i); j++) + v[i][j] = rhs[i][j]; + } + return *this; +} + +template +TriVertMat & TriVertMat::operator=(const T &a) //assign a to every element +{ + for (int i=0; i< nn; i++) + for (int j=0; j +inline T & TriVertMat::ref(const int i, const int j) +{ + return v[j][i]; +} + +template +inline const T TriVertMat::ref(const int i, const int j) const +{ + return v[j][i]; +} + +template +inline T * TriVertMat::getPointer(const int i, const int j) +{ + return &v[j][i]; +} + +template +inline int TriVertMat::nrows() const +{ + return nn; +} + +template +TriVertMat::~TriVertMat() +{ + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } +} + + +//Overloaded complex operations to handle mixed float and double +//This takes care of e.g. 1.0/z, z complex +inline const complex operator+(const double &a, + const complex &b) { return float(a)+b; } +inline const complex operator+(const complex &a, + const double &b) { return a+float(b); } +inline const complex operator-(const double &a, + const complex &b) { return float(a)-b; } +inline const complex operator-(const complex &a, + const double &b) { return a-float(b); } +inline const complex operator*(const double &a, + const complex &b) { return float(a)*b; } +inline const complex operator*(const complex &a, + const double &b) { return a*float(b); } +inline const complex operator/(const double &a, + const complex &b) { return float(a)/b; } +inline const complex operator/(const complex &a, + const double &b) { return a/float(b); } +//some compilers choke on pow(float,double) in single precision. also atan2 +inline float pow (float x, double y) {return pow(double(x),y);} +inline float pow (double x, float y) {return pow(x,double(y));} +inline float atan2 (float x, double y) {return atan2(double(x),y);} +inline float atan2 (double x, float y) {return atan2(x,double(y));} + +#endif /* _NR_UTIL_H_ */ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/params-weird b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/params-weird new file mode 100644 index 0000000000..58601f4628 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/params-weird @@ -0,0 +1,10 @@ +0.8969780803 0.0000000001 0.0000000001 0.0515111387 0.0515111387 +0.0006874357 0.0006874357 0.0502248816 0.0502248816 +0.1025763303 0.1025763303 0.2891978920 0.2891978920 +ACGTN +0.1907979101 +0.0187792275 0.2023714036 +0.0437292010 0.0242512580 0.2525959611 +0.0171148051 0.0289713815 0.0146772768 0.1689696163 +0.0000359111 0.0000737346 0.0000853324 0.0000768761 0.0000296087 +0.1390289217 0.2925130725 0.1882306933 0.2944687903 0.0016553127 diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/postProcessings.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/postProcessings.cpp new file mode 100644 index 0000000000..1028630653 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/postProcessings.cpp @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////////////// +// postProcessings.cpp +// +// several post process functions after aligning two profile stem candidate sequences +////////////////////////////////////////////////////////////////////////////////////// + +#include +#include "scarna.hpp" +#include "StemCandidate.hpp" +#include +#include + +using namespace::MXSCARNA; + +void printStructure(std::vector *pscs1, std::vector *pscs2, std::vector *matchPSCS1, std::vector *matchPSCS2); + +void removeConflicts(std::vector *pscs1, std::vector *pscs2, std::vector *matchPSCS1, std::vector *matchPSCS2) +{ + int size = matchPSCS1->size(); + + std::vector found(size, 0); + for(int k = size - 1; k >= 0; k--) { + int i = matchPSCS1->at(k); + int i_rv = pscs1->at(i).GetRvscnumber(); + int j = matchPSCS2->at(k); + int j_rv = pscs2->at(j).GetRvscnumber(); + + found[k] = 0; + + for(int m = size - 1; m >= 0; m--) { + if ( (matchPSCS1->at(m) == i_rv) && (matchPSCS2->at(m) == j_rv) ) { + found[k] = 1; + break; + } + } + } + + int pt = 0; + for(int k = 0; k < size; k++) { + matchPSCS1->at(pt) = matchPSCS1->at(k); + matchPSCS2->at(pt) = matchPSCS2->at(k); + if(found[k] == 1) ++pt; + } + + matchPSCS1->resize(pt); + matchPSCS2->resize(pt); + + //printStructure (pscs1, pscs2, matchPSCS1, matchPSCS2); +} + +void printStructure(std::vector *pscs1, std::vector *pscs2, std::vector *matchPSCS1, std::vector *matchPSCS2) +{ + int size = matchPSCS1->size(); + int len = WORDLENGTH; + std::vector structure1(100, '.'); + std::vector structure2(100, '.'); + for(int k = 0; k < size; k++) { + int i = matchPSCS1->at(k); + int pos1 = pscs1->at(i).GetPosition(); + int j = matchPSCS2->at(k); + int pos2 = pscs2->at(j).GetPosition(); + for(int l = 0; l < len; l++) { + if(pscs1->at(i).GetDistance() > 0) { + structure1[pos1 + l] = '('; + } + else { + structure1[pos1 + l] = ')'; + } + + if(pscs2->at(j).GetDistance() > 0) { + structure2[pos2 + l] = '('; + } + else { + structure2[pos2 + l] = ')'; + } + } + /* + std::cout << i << "\t" << pscs1->at(i).GetLength() << "\t" << pscs1->at(i).GetPosition() << "\t" << pscs1->at(i).GetRvposition() << "\t" << pscs1->at(i).GetDistance() << "\t" << pscs1->at(i).GetContPos() << "\t" << pscs1->at(i).GetBeforePos() << "\t" << pscs1->at(i).GetRvscnumber() << endl; + */ + } + size = structure1.size(); + for(int k = 0; k < size; k++) { + std::cout << structure1[k]; + } + std::cout << endl; + for(int k = 0; k < size; k++) { + std::cout << structure2[k]; + } + std::cout << endl; +} + diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/CompareToRef.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/CompareToRef.cc new file mode 100644 index 0000000000..142fa4c072 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/CompareToRef.cc @@ -0,0 +1,348 @@ +///////////////////////////////////////////////////////////////// +// CompareToRef.cc +// +// Program for scoring alignments according to the SUM-OF-PAIRS +// or COLUMN score. +///////////////////////////////////////////////////////////////// + +#include "SafeVector.h" +#include "MultiSequence.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char CORE_BLOCK = 'h'; +typedef pair PII; +bool useCoreBlocks = false; +bool useColScore = false; +bool useCaps = false; +bool useBaliAnnot = false; +bool makeAnnot = false; + +///////////////////////////////////////////////////////////////// +// Function prototypes +///////////////////////////////////////////////////////////////// + +set ComputePairs (MultiSequence *align, bool isRef); +set ComputeColumns (MultiSequence *align, bool isRef); +string GetName (string s); +set coreCols; + +set refCols, testCols; +set refPairs, testPairs; +VI annotation; + +///////////////////////////////////////////////////////////////// +// main() +// +// Main program. +///////////////////////////////////////////////////////////////// + +int main (int argc, char **argv){ + + // check arguments + if (argc < 3){ + cerr << "Usage: score TEST_ALIGNMENT REFERENCE_ALIGNMENT [BALIBASE_ANNOT_FILE] [-col] [-core] [-caps] [-annot FILENAME]" << endl; + exit (1); + } + + // try opening file + FileBuffer infile (argv[1]); + + MultiSequence *testAlign; + if (infile.fail()){ + cerr << "ERROR: Could not open file '" << argv[1] << "' for reading." << endl; + testAlign = NULL; + } + else { + testAlign = new MultiSequence(); assert (testAlign); + testAlign->LoadMFA (infile); + } + infile.close(); + + MultiSequence *refAlign = new MultiSequence (string (argv[2])); assert (refAlign); + + string outFilename = ""; + + for (int i = 3; i < argc; i++){ + if (strcmp (argv[i], "-core") == 0) + useCoreBlocks = true; + else if (strcmp (argv[i], "-col") == 0) + useColScore = true; + else if (strcmp (argv[i], "-caps") == 0) + useCaps = true; + else if (strcmp (argv[i], "-annot") == 0){ + makeAnnot = true; + outFilename = string (argv[++i]); + } + else { // annotation file + useBaliAnnot = true; + + ifstream annotFile (argv[i]); + if (annotFile.fail()){ + cerr << "ERROR: Could not read BAliBASE annotation file." << endl; + exit (1); + } + + SafeVector *indices = refAlign->GetSequence(0)->GetMapping(); + + char buffer[10000]; + while (annotFile.getline (buffer, 10000)){ + istringstream ss; + ss.str (string (buffer)); + + string s; + + if ((ss >> s) && s == string ("BPOS")){ + while (ss >> s){ + int begin=-1, end=-1; + if (sscanf (s.c_str(), "%d=%d", &begin, &end) == 2){ + for (int i = (*indices)[begin]; i <= (*indices)[end]; i++) + coreCols.insert (i); + } + } + } + } + + delete indices; + + annotFile.close(); + } + } + + if (useColScore) makeAnnot = false; + + if (testAlign){ + for (int i = 0; i < testAlign->GetNumSequences(); i++){ + bool found = false; + + for (int j = 0; !found && j < refAlign->GetNumSequences(); j++){ + if (testAlign->GetSequence(i)->GetHeader() == refAlign->GetSequence(j)->GetHeader()) + found = true; + } + + if (!found){ + testAlign->RemoveSequence (i); + i--; + } + } + + for (int i = 0; i < refAlign->GetNumSequences(); i++){ + bool found = false; + + for (int j = 0; !found && j < testAlign->GetNumSequences(); j++){ + if (refAlign->GetSequence(i)->GetHeader() == testAlign->GetSequence(j)->GetHeader()) + found = true; + } + + if (!found){ + refAlign->RemoveSequence (i); + i--; + } + } + + testAlign->SortByHeader(); + refAlign->SortByHeader(); + } + + int TP = 0; + int TPFN = 0; + int TPFP = 0; + double FD, FM; + if (useColScore){ + refCols = ComputeColumns (refAlign, true); + if (testAlign) testCols = ComputeColumns (testAlign, false); + set colIntersect; + insert_iterator > colIntersectIter (colIntersect, colIntersect.begin()); + set_intersection (testCols.begin(), testCols.end(), refCols.begin(), refCols.end(), colIntersectIter); + TP = (int) colIntersect.size(); + TPFN = (int) refCols.size(); + if (testAlign) TPFP = (int) testCols.size(); + } + else { + refPairs = ComputePairs (refAlign, true); + if (testAlign) testPairs = ComputePairs (testAlign, false); + set pairIntersect; + + insert_iterator > pairIntersectIter (pairIntersect, pairIntersect.begin()); + set_intersection (testPairs.begin(), testPairs.end(), refPairs.begin(), refPairs.end(), pairIntersectIter); + TP = (int) pairIntersect.size(); + TPFN = (int) refPairs.size(); + if (testAlign) TPFP = (int) testPairs.size(); + } + + FD = (double) TP / TPFN; + FM = (double) TP / TPFP; + + cout << GetName(string (argv[2])) << " " << TP << " " << TPFN << " " << TPFP << " " << FD << " " << FM << endl; + + if (makeAnnot){ + ofstream outfile (outFilename.c_str()); + for (int i = 0; i < (int) annotation.size(); i++){ + outfile << annotation[i] << endl; + } + outfile.close(); + } + + if (testAlign) delete testAlign; + delete refAlign; +} + +int GetOffset (Sequence *testSeq, Sequence *refSeq){ + string test = testSeq->GetString(); + string ref = refSeq->GetString(); + + for (int i = 0; i < (int) test.length(); i++) test[i] = toupper(test[i]); + for (int i = 0; i < (int) ref.length(); i++) ref[i] = toupper(ref[i]); + + size_t offset = test.find (ref, 0); + if (offset == string::npos){ + cerr << "ERROR: Reference string not found in original sequence!" << endl; + cerr << " test = " << test << endl; + cerr << " ref = " << ref << endl; + exit (1); + } + + cerr << "Offset found: " << offset << endl; + + return (int) offset; +} + +string GetName (string s){ + + size_t index1 = s.rfind ('/'); + size_t index2 = s.rfind ('.'); + + if (index1 == string::npos) index1 = 0; else index1++; + if (index2 == string::npos) index2 = s.length(); + + if (index2 < index1) index2 = s.length(); + + return s.substr (index1, index2 - index1); +} + +bool isCore (char ch, int col){ + if (ch == '-') return false; + if (useBaliAnnot){ + return coreCols.find (col) != coreCols.end(); + } + if (useCaps){ + return ch >= 'A' && ch <= 'Z'; + } + return ch == CORE_BLOCK; +} + +///////////////////////////////////////////////////////////////// +// ComputePairs +// +// Returns the set of all matching pairs. +///////////////////////////////////////////////////////////////// + +set ComputePairs (MultiSequence *align, bool isRef){ + int N = align->GetNumSequences(); + int L = align->GetSequence(0)->GetLength(); + + // retrieve all sequence data pointers + SafeVector::iterator> seqs (N); + for (int i = 0; i < N; i++){ + seqs[i] = align->GetSequence(i)->GetDataPtr(); + assert (align->GetSequence(i)->GetLength() == L); + } + + set ret; + VI ctr(N); + + // compute pairs + for (int i = 1; i <= L; i++){ + + // ctr keeps track of the current position in each sequence + for (int j = 0; j < N; j++){ + ctr[j] += (seqs[j][i] != '-'); + } + + int good = 0; + int ct = 0; + + // check for all matching pairs + for (int j = 0; j < N - 1; j++){ + for (int k = j + 1; k < N; k++){ + + // skip if one of the sequences is gapped + if (seqs[j][i] == '-' || seqs[k][i] == '-') continue; + + // check for core blocks in the reference sequence + if (isRef && useCoreBlocks) + if (!isCore (seqs[j][i], i) || !isCore (seqs[k][i], i)) continue; + + // if all ok, then add pair to list of pairs + pair p (10000 * j + ctr[j], 10000 * k + ctr[k]); + + // if we're making an annotation, compute annotation statistics + if (makeAnnot && !isRef){ + ct++; + if (refPairs.find (p) != refPairs.end()) good++; + } + ret.insert (p); + } + } + + // build annotation + if (makeAnnot && !isRef){ + annotation.push_back ((ct == 0) ? 0 : 100 * good / ct); + } + + } + + return ret; +} + +///////////////////////////////////////////////////////////////// +// ComputeColumns +// +// Returns the set of all columns. +///////////////////////////////////////////////////////////////// + +set ComputeColumns (MultiSequence *align, bool isRef){ + int N = align->GetNumSequences(); + int L = align->GetSequence(0)->GetLength(); + + // retrieve all sequence data pointers + SafeVector::iterator> seqs (N); + for (int i = 0; i < N; i++){ + seqs[i] = align->GetSequence(i)->GetDataPtr(); + } + + set ret; + VI ctr(N); + + // compute pairs + for (int i = 1; i <= L; i++){ + + // ctr keeps track of the current position in each sequence + for (int j = 0; j < N; j++){ + ctr[j] += (seqs[j][i] != '-'); + } + + // add column, pick only positions that are matched + SafeVector column (N); + bool useThisColumn = !useCoreBlocks; + + for (int j = 0; j < N; j++){ + if (isCore (seqs[j][i], i)) useThisColumn = true; + column[j] = (seqs[j][i] == '-') ? -1 : ctr[j]; + } + + if (useThisColumn || !isRef) + ret.insert (column); + } + + return ret; +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h new file mode 100644 index 0000000000..e8ad944beb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////// +// Defaults.h +// +// Default constants for use in PROBCONS. The emission +// probabilities were computed using the program used to build +// the BLOSUM62 matrix from the BLOCKS 5.0 dataset. Transition +// parameters were obtained via unsupervised EM training on the +// BALIBASE 2.0 benchmark alignment database. +///////////////////////////////////////////////////////////////// + +#ifndef DEFAULTS_H +#define DEFAULTS_H + +#include + +using namespace std; +/* Default */ +namespace MXSCARNA { +/* +float initDistrib1Default[] = { 0.9588437676f, 0.0205782652f, 0.0205782652f }; +float gapOpen1Default[] = { 0.0190259293f, 0.0190259293f }; +float gapExtend1Default[] = { 0.3269913495f, 0.3269913495f }; +*/ + +/* EMtrainingALL.txt*/ +float initDistrib1Default[] = { 0.9234497547, 0.0385021642, 0.0385021642 }; +float gapOpen1Default[] = { 0.0266662259, 0.0266662259 }; +float gapExtend1Default[] = { 0.3849118352, 0.3849118352 }; + + +float initDistrib2Default[] = { 0.9615409374f, 0.0000004538f, 0.0000004538f, 0.0192291681f, 0.0192291681f }; +float gapOpen2Default[] = { 0.0082473317f, 0.0082473317f, 0.0107844425f, 0.0107844425f }; +float gapExtend2Default[] = { 0.3210460842f, 0.3210460842f, 0.3298229277f, 0.3298229277f }; + +string alphabetDefault = "ACGUTN"; + +//float emitSingleDefault[6] = { +// 0.2174750715, 0.2573366761, 0.3005372882, 0.2233072966, 0.2233072966, 0.0004049665 +//}; + +/* Default */ +/* +float emitSingleDefault[6] = { + 0.2270790040f, 0.2422080040f, 0.2839320004f, 0.2464679927f, 0.2464679927f, 0.0003124650f +}; +*/ + +/* EMtrainingALL.txt */ +float emitSingleDefault[6] = { + 0.2017124593, 0.2590311766, 0.2929603755, 0.2453189045, 0.2453189045, 0.0000873194 }; + +/* ACGUTN */ +/* Default */ +/* +float emitPairsDefault[6][6] = { + { 0.1487240046f, 0.0184142999f, 0.0361397006f, 0.0238473993f, 0.0238473993f, 0.0000375308f }, + { 0.0184142999f, 0.1583919972f, 0.0275536999f, 0.0389291011f, 0.0389291011f, 0.0000815823f }, + { 0.0361397006f, 0.0275536999f, 0.1979320049f, 0.0244289003f, 0.0244289003f, 0.0000824765f }, + { 0.0238473993f, 0.0389291011f, 0.0244289003f, 0.1557479948f, 0.1557479948f, 0.0000743985f }, + { 0.0238473993f, 0.0389291011f, 0.0244289003f, 0.1557479948f, 0.1557479948f, 0.0000743985f }, + { 0.0000375308f, 0.0000815823f, 0.0000824765f, 0.0000743985f, 0.0000743985f, 0.0000263252f } +}; +*/ +/* EMtrainingALL.txt */ +float emitPairsDefault[6][6] = { + { 0.1659344733, 0.0298952684, 0.0543937907, 0.0344539173, 0.0344539173, 0.0000032761 }, + { 0.0298952684, 0.1817403436, 0.0415624641, 0.0589077808, 0.0589077808, 0.0000117011 }, + { 0.0543937907, 0.0415624641, 0.2342105955, 0.0410407558, 0.0410407558, 0.0000072893 }, + { 0.0344539173, 0.0589077808, 0.0410407558, 0.1578272283, 0.1578272283, 0.0000067871 }, + { 0.0344539173, 0.0589077808, 0.0410407558, 0.1578272283, 0.1578272283, 0.0000067871 }, + { 0.0344539173, 0.0589077808, 0.0410407558, 0.1578272283, 0.1578272283, 0.0000067871 }, +// { 0.0000032761, 0.0000117011, 0.0000072893, 0.0000067871, 0.0000067871, 0.0000000166 } +}; + + /* +float emitPairsDefault[6][6] = { + {0.1731323451, 0.0378843173, 0.0656677559, 0.0450690985, 0.0450690985, 0.0000215275}, + {0.0378843173, 0.1611578614, 0.0492933467, 0.0651549697, 0.0651549697, 0.0000362353}, + {0.0656677559, 0.0492933467, 0.1937607974, 0.0464556068, 0.0464556068, 0.0000293904}, + {0.0450690985, 0.0651549697, 0.0464556068, 0.1622997671, 0.1622997671, 0.0000352637}, + {0.0450690985, 0.0651549697, 0.0464556068, 0.1622997671, 0.1622997671, 0.0000352637}, + {0.0000215275, 0.0000362353, 0.0000293904, 0.0000352637, 0.0000352637, 0.0000000000} +}; + */ +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h_backup b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h_backup new file mode 100644 index 0000000000..e09abb52c3 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Defaults.h_backup @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////// +// Defaults.h +// +// Default constants for use in PROBCONS. The emission +// probabilities were computed using the program used to build +// the BLOSUM62 matrix from the BLOCKS 5.0 dataset. Transition +// parameters were obtained via unsupervised EM training on the +// BALIBASE 2.0 benchmark alignment database. +///////////////////////////////////////////////////////////////// + +#ifndef DEFAULTS_H +#define DEFAULTS_H + +#include + +using namespace std; + +float initDistrib1Default[] = { 0.9588437676f, 0.0205782652f, 0.0205782652f }; +float gapOpen1Default[] = { 0.0190259293f, 0.0190259293f }; +float gapExtend1Default[] = { 0.3269913495f, 0.3269913495f }; + +float initDistrib2Default[] = { 0.9615409374f, 0.0000004538f, 0.0000004538f, 0.0192291681f, 0.0192291681f }; +float gapOpen2Default[] = { 0.0082473317f, 0.0082473317f, 0.0107844425f, 0.0107844425f }; +float gapExtend2Default[] = { 0.3210460842f, 0.3210460842f, 0.3298229277f, 0.3298229277f }; + +string alphabetDefault = "ACGUTN"; + +//float emitSingleDefault[6] = { +// 0.2174750715, 0.2573366761, 0.3005372882, 0.2233072966, 0.2233072966, 0.0004049665 +//}; + +float emitSingleDefault[6] = { + 0.2270790040f, 0.2422080040f, 0.2839320004f, 0.2464679927f, 0.2464679927f, 0.0003124650f +}; + +/* ACGUTN */ + +float emitPairsDefault[6][6] = { + { 0.1487240046f, 0.0184142999f, 0.0361397006f, 0.0238473993f, 0.0238473993f, 0.0000375308f }, + { 0.0184142999f, 0.1583919972f, 0.0275536999f, 0.0389291011f, 0.0389291011f, 0.0000815823f }, + { 0.0361397006f, 0.0275536999f, 0.1979320049f, 0.0244289003f, 0.0244289003f, 0.0000824765f }, + { 0.0238473993f, 0.0389291011f, 0.0244289003f, 0.1557479948f, 0.1557479948f, 0.0000743985f }, + { 0.0238473993f, 0.0389291011f, 0.0244289003f, 0.1557479948f, 0.1557479948f, 0.0000743985f }, + { 0.0000375308f, 0.0000815823f, 0.0000824765f, 0.0000743985f, 0.0000743985f, 0.0000263252f } +}; + + /* +float emitPairsDefault[6][6] = { + {0.1731323451, 0.0378843173, 0.0656677559, 0.0450690985, 0.0450690985, 0.0000215275}, + {0.0378843173, 0.1611578614, 0.0492933467, 0.0651549697, 0.0651549697, 0.0000362353}, + {0.0656677559, 0.0492933467, 0.1937607974, 0.0464556068, 0.0464556068, 0.0000293904}, + {0.0450690985, 0.0651549697, 0.0464556068, 0.1622997671, 0.1622997671, 0.0000352637}, + {0.0450690985, 0.0651549697, 0.0464556068, 0.1622997671, 0.1622997671, 0.0000352637}, + {0.0000215275, 0.0000362353, 0.0000293904, 0.0000352637, 0.0000352637, 0.0000000000} +}; + */ +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EMtrainingALL.txt b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EMtrainingALL.txt new file mode 100644 index 0000000000..c2f24a0a5d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EMtrainingALL.txt @@ -0,0 +1,11 @@ +0.9234497547 0.0385021642 0.0385021642 +0.0266662259 0.0266662259 +0.3849118352 0.3849118352 +ACGUTN +0.1659344733 +0.0298952684 0.1817403436 +0.0543937907 0.0415624641 0.2342105955 +0.0344539173 0.0589077808 0.0410407558 0.1578272283 +0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 +0.0000032761 0.0000117011 0.0000072893 0.0000067871 0.0000000000 0.0000000166 +0.2017124593 0.2590311766 0.2929603755 0.2453189045 0.0000000000 0.0000873194 diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EvolutionaryTree.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EvolutionaryTree.h new file mode 100644 index 0000000000..eceeafedc7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/EvolutionaryTree.h @@ -0,0 +1,200 @@ +///////////////////////////////////////////////////////////////// +// EvolutionaryTree.hpp +// +// Utilities for reading/writing multiple sequence data. +///////////////////////////////////////////////////////////////// + +#ifndef __EVOLUTIONARYTREE_HPP__ +#define __EVOLUTIONARYTREE_HPP__ + +#include +#include +#include +#include "SafeVector.h" +#include "MultiSequence.h" +#include "Sequence.h" +#include "Util.hpp" + +using namespace std; + + +///////////////////////////////////////////////////////////////// +// TreeNode +// +// The fundamental unit for representing an alignment tree. The +// guide tree is represented as a binary tree. +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +class TreeNode { + int sequenceLabel; // sequence label + float sequenceIdentity; // sequence identity + TreeNode *left, *right, *parent; // pointers to left, right children + float leftLength, rightLength; // the length of left and right edge + ///////////////////////////////////////////////////////////////// + // TreeNode::PrintNode() + // + // Internal routine used to print out the sequence comments + // associated with the evolutionary tree, using a hierarchical + // parenthesized format. + ///////////////////////////////////////////////////////////////// + + void PrintNode (ostream &outfile, const MultiSequence *sequences) const { + + // if this is a leaf node, print out the associated sequence comment + if (sequenceLabel >= 0) + //outfile << sequences->GetSequence (sequenceLabel)->GetHeader(); + outfile << sequences->GetSequence (sequenceLabel)->GetLabel(); + + // otherwise, it must have two children; print out their subtrees recursively + else { + assert (left); + assert (right); + + outfile << "("; + left->PrintNode (outfile, sequences); + outfile << ","; + right->PrintNode (outfile, sequences); + outfile << ")"; + } + } + + public: + + ///////////////////////////////////////////////////////////////// + // TreeNode::TreeNode() + // + // Constructor for a tree node. Note that sequenceLabel = -1 + // implies that the current node is not a leaf in the tree. + ///////////////////////////////////////////////////////////////// + + TreeNode (int sequenceLabel) : sequenceLabel (sequenceLabel), + left (NULL), right (NULL), parent (NULL) { + assert (sequenceLabel >= -1); + } + + ///////////////////////////////////////////////////////////////// + // TreeNode::~TreeNode() + // + // Destructor for a tree node. Recursively deletes all children. + ///////////////////////////////////////////////////////////////// + + ~TreeNode (){ + if (left){ delete left; left = NULL; } + if (right){ delete right; right = NULL; } + parent = NULL; + } + + + // getters + int GetSequenceLabel () const { return sequenceLabel; } + TreeNode *GetLeftChild () const { return left; } + TreeNode *GetRightChild () const { return right; } + TreeNode *GetParent () const { return parent; } + float GetIdentity () const { return sequenceIdentity; } + float GetLeftLength () const { return leftLength; } + float GetRightLength () const { return rightLength; } + // setters + void SetSequenceLabel (int sequenceLabel){ this->sequenceLabel = sequenceLabel; assert (sequenceLabel >= -1); } + void SetLeftChild (TreeNode *left){ this->left = left; } + void SetRightChild (TreeNode *right){ this->right = right; } + void SetParent (TreeNode *parent){ this->parent = parent; } + void SetIdentity (float identity) { this->sequenceIdentity = identity; } + void SetLeftLength (float identity) { this->leftLength = identity; } + void SetRightLength (float identity) {this->rightLength = identity; } + ///////////////////////////////////////////////////////////////// + // TreeNode::ComputeTree() + // + // Routine used to compute an evolutionary tree based on the + // given distance matrix. We assume the distance matrix has the + // form, distMatrix[i][j] = expected accuracy of aligning i with j. + ///////////////////////////////////////////////////////////////// + + static TreeNode *ComputeTree (const VVF &distMatrix, const VVF &identityMatrix){ + + int numSeqs = distMatrix.size(); // number of sequences in distance matrix + VVF distances (numSeqs, VF (numSeqs)); // a copy of the distance matrix + SafeVector nodes (numSeqs, NULL); // list of nodes for each sequence + SafeVector valid (numSeqs, 1); // valid[i] tells whether or not the ith + // nodes in the distances and nodes array + // are valid + VVF identities (numSeqs, VF (numSeqs)); + SafeVector countCluster (numSeqs, 1); + + // initialization: make a copy of the distance matrix + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + distances[i][j] = distMatrix[i][j]; + identities[i][j] = identityMatrix[i][j]; + } + } + + // initialization: create all the leaf nodes + for (int i = 0; i < numSeqs; i++){ + nodes[i] = new TreeNode (i); + assert (nodes[i]); + } + + // repeat until only a single node left + for (int numNodesLeft = numSeqs; numNodesLeft > 1; numNodesLeft--){ + float bestProb = -1; + pair bestPair; + + // find the closest pair + for (int i = 0; i < numSeqs; i++) if (valid[i]){ + for (int j = i+1; j < numSeqs; j++) if (valid[j]){ + if (distances[i][j] > bestProb){ + bestProb = distances[i][j]; + bestPair = make_pair(i, j); + } + } + } + + // merge the closest pair + TreeNode *newParent = new TreeNode (-1); + newParent->SetLeftChild (nodes[bestPair.first]); + newParent->SetRightChild (nodes[bestPair.second]); + nodes[bestPair.first]->SetParent (newParent); + nodes[bestPair.second]->SetParent (newParent); + nodes[bestPair.first] = newParent; + nodes[bestPair.second] = NULL; + newParent->SetIdentity(identities[bestPair.first][bestPair.second]); + + + // now update the distance matrix + for (int i = 0; i < numSeqs; i++) if (valid[i]){ + distances[bestPair.first][i] = distances[i][bestPair.first] + = (distances[i][bestPair.first]*countCluster[bestPair.first] + + distances[i][bestPair.second]*countCluster[bestPair.second]) + / (countCluster[bestPair.first] + countCluster[bestPair.second]); +// distances[bestPair.first][i] = distances[i][bestPair.first] +// = (distances[i][bestPair.first] + distances[i][bestPair.second]) * bestProb / 2; + identities[bestPair.first][i] = identities[i][bestPair.first] + = (identities[i][bestPair.first]*countCluster[bestPair.first] + + identities[i][bestPair.second]*countCluster[bestPair.second]) + / (countCluster[bestPair.first] + countCluster[bestPair.second]); + } + + // finally, mark the second node entry as no longer valid + countCluster[bestPair.first] += countCluster[bestPair.second]; + valid[bestPair.second] = 0; + } + + assert (nodes[0]); + return nodes[0]; + } + + ///////////////////////////////////////////////////////////////// + // TreeNode::Print() + // + // Print out the subtree associated with this node in a + // parenthesized representation. + ///////////////////////////////////////////////////////////////// + + void Print (ostream &outfile, const MultiSequence *sequences) const { +// outfile << "Alignment tree: "; + PrintNode (outfile, sequences); + outfile << endl; + } +}; +} +#endif //__EVOLUTIONARYTREE_HPP__ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FileBuffer.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FileBuffer.h new file mode 100644 index 0000000000..9c36188720 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FileBuffer.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////// +// FileBuffer.h +// +// Buffered file reading. +///////////////////////////////////////////////////////////////// + + +#ifndef FILEBUFFER_H +#define FILEBUFFER_H + +#include +#include +#include + +using namespace std; + +const int BufferSize = 1000; + +///////////////////////////////////////////////////////////////// +// FileBuffer +// +// Class for buffering file reading. +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +class FileBuffer { + ifstream file; + char buffer[BufferSize]; + int currPos; + int size; + bool isEOF; + bool isValid; + bool canUnget; + + public: + + // Some common routines + + FileBuffer (const char *filename) : file (filename), currPos (0), size (0), isEOF (false), isValid (!file.fail()), canUnget (false){} + ~FileBuffer (){ close(); } + bool fail () const { return !isValid; } + bool eof () const { return (!isValid || isEOF); } + void close(){ file.close(); isValid = false; } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::Get() + // + // Retrieve a character from the file buffer. Returns true if + // and only if a character is read. + ///////////////////////////////////////////////////////////////// + + bool Get (char &ch){ + + // check to make sure that there's more stuff in the file + if (!isValid || isEOF) return false; + + // if the buffer is empty, it's time to reload it + if (currPos == size){ + file.read (buffer, BufferSize); + size = file.gcount(); + isEOF = (size == 0); + currPos = 0; + if (isEOF) return false; + } + + // store the read character + ch = buffer[currPos++]; + canUnget = true; + return true; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::UnGet() + // + // Unretrieve the most recently read character from the file + // buffer. Note that this allows only a one-level undo. + ///////////////////////////////////////////////////////////////// + + void UnGet (){ + assert (canUnget); + assert (isValid); + assert (currPos > 0); + currPos--; + assert (currPos < size); + isEOF = false; + canUnget = false; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::GetLine() + // + // Retrieve characters of text until a newline character is + // encountered. Terminates properly on end-of-file condition. + ///////////////////////////////////////////////////////////////// + + void GetLine (string &s){ + char ch; + s = ""; + while (Get (ch) && ch != '\n') + s += ch; + } + +}; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FixRef.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FixRef.cc new file mode 100644 index 0000000000..7060c79557 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/FixRef.cc @@ -0,0 +1,1000 @@ +///////////////////////////////////////////////////////////////// +// Main.cc +///////////////////////////////////////////////////////////////// + +#include "SafeVector.h" +#include "MultiSequence.h" +#include "Defaults.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "EvolutionaryTree.h" +#include "SparseMatrix.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +string matrixFilename = ""; +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; + +bool enableTraining = false; +bool enableVerbose = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float gapOpenPenalty = 0; +float gapContinuePenalty = 0; +VF initDistrib (NumMatrixTypes); +VF gapOpen (2*NumInsertStates); +VF gapExtend (2*NumInsertStates); +SafeVector alphabet; +VVF emitPairs; +VF emitSingle; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +///////////////////////////////////////////////////////////////// +// Function prototypes +///////////////////////////////////////////////////////////////// + +void PrintHeading(); +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const char *filename); +MultiSequence *DoAlign (MultiSequence *sequence, const ProbabilisticModel &model); +SafeVector ParseParams (int argc, char **argv); +void ReadParameters (); +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); +void DoRelaxation (MultiSequence *sequences, SafeVector > &sparseMatrices); +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior); +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment); +//float ScoreAlignment (MultiSequence *alignment, MultiSequence *sequences, SparseMatrix **sparseMatrices, const int numSeqs); + +///////////////////////////////////////////////////////////////// +// main() +// +// Calls all initialization routines and runs the PROBCONS +// aligner. +///////////////////////////////////////////////////////////////// + +int main (int argc, char **argv){ + + if (argc != 3){ + cerr << "Usage: FixRef inputfile reffile" << endl; + exit (1); + } + + string inputFilename = string (argv[1]); + string refFilename = string (argv[2]); + + ReadParameters(); + + // build new model for aligning + ProbabilisticModel model (initDistrib, gapOpen, gapExtend, + alphabet, emitPairs, emitSingle); + + MultiSequence *inputSeq = new MultiSequence(); inputSeq->LoadMFA (inputFilename); + MultiSequence *refSeq = new MultiSequence(); refSeq->LoadMFA (refFilename); + + SafeVector *ali = new SafeVector; + + if (refSeq->GetNumSequences() != 2){ + cerr << "ERROR: Expected two sequences in reference alignment." << endl; + exit (1); + } + set s; s.insert (0); + MultiSequence *ref1 = refSeq->Project (s); + s.clear(); s.insert (1); + MultiSequence *ref2 = refSeq->Project (s); + + for (int i = 0; i < inputSeq->GetNumSequences(); i++){ + if (inputSeq->GetSequence(i)->GetHeader() == ref1->GetSequence(0)->GetHeader()){ + ref1->AddSequence (inputSeq->GetSequence(i)->Clone()); + } + if (inputSeq->GetSequence(i)->GetHeader() == ref2->GetSequence(0)->GetHeader()) + ref2->AddSequence (inputSeq->GetSequence(i)->Clone()); + } + if (ref1->GetNumSequences() != 2){ + cerr << "ERROR: Expected two sequences in reference1 alignment." << endl; + exit (1); + } + if (ref2->GetNumSequences() != 2){ + cerr << "ERROR: Expected two sequences in reference2 alignment." << endl; + exit (1); + } + + ref1->GetSequence(0)->SetLabel(0); + ref2->GetSequence(0)->SetLabel(0); + ref1->GetSequence(1)->SetLabel(1); + ref2->GetSequence(1)->SetLabel(1); + + // cerr << "Aligning..." << endl; + + // now, we can perform the alignments and write them out + MultiSequence *alignment1 = DoAlign (ref1, + ProbabilisticModel (initDistrib, gapOpen, gapExtend, + alphabet, emitPairs, emitSingle)); + + //cerr << "Aligning second..." << endl; + MultiSequence *alignment2 = DoAlign (ref2, + ProbabilisticModel (initDistrib, gapOpen, gapExtend, + alphabet, emitPairs, emitSingle)); + + SafeVector::iterator iter1 = alignment1->GetSequence(0)->GetDataPtr(); + SafeVector::iterator iter2 = alignment1->GetSequence(1)->GetDataPtr(); + for (int i = 1; i <= alignment1->GetSequence(0)->GetLength(); i++){ + if (islower(iter1[i])) iter2[i] = tolower(iter2[i]); + if (isupper(iter1[i])) iter2[i] = toupper(iter2[i]); + } + iter1 = alignment2->GetSequence(0)->GetDataPtr(); + iter2 = alignment2->GetSequence(1)->GetDataPtr(); + for (int i = 1; i <= alignment2->GetSequence(0)->GetLength(); i++){ + if (islower(iter1[i])) iter2[i] = tolower(iter2[i]); + if (isupper(iter1[i])) iter2[i] = toupper(iter2[i]); + } + //alignment1->WriteMFA (cout); + //alignment2->WriteMFA (cout); + + int a1 = 0, a = 0; + int b1 = 0, b = 0; + + for (int i = 1; i <= refSeq->GetSequence(0)->GetLength(); i++){ + + // catch up in filler sequences + if (refSeq->GetSequence(0)->GetPosition(i) != '-'){ + while (true){ + a++; + if (alignment1->GetSequence(0)->GetPosition(a) != '-') break; + ali->push_back ('X'); + } + } + if (refSeq->GetSequence(1)->GetPosition(i) != '-'){ + while (true){ + b++; + if (alignment2->GetSequence(0)->GetPosition(b) != '-') break; + ali->push_back ('Y'); + } + } + + if (refSeq->GetSequence(0)->GetPosition(i) != '-' && + refSeq->GetSequence(1)->GetPosition(i) != '-'){ + //cerr << "M: " << refSeq->GetSequence(0)->GetPosition(i) << refSeq->GetSequence(1)->GetPosition(i) << endl; + ali->push_back ('B'); + } + else if (refSeq->GetSequence(0)->GetPosition(i) != '-'){ + //cerr << "X" << endl; + ali->push_back ('X'); + } + else if (refSeq->GetSequence(1)->GetPosition(i) != '-'){ + //cerr << "Y" << endl; + ali->push_back ('Y'); + } + } + + while (a < alignment1->GetSequence(0)->GetLength()){ + a++; + ali->push_back ('X'); + if (alignment1->GetSequence(0)->GetPosition(a) != '-') a1++; + } + while (b < alignment2->GetSequence(0)->GetLength()){ + b++; + ali->push_back ('Y'); + if (alignment2->GetSequence(0)->GetPosition(b) != '-') b1++; + } + + Sequence *seq1 = alignment1->GetSequence(1)->AddGaps (ali, 'X'); + Sequence *seq2 = alignment2->GetSequence(1)->AddGaps (ali, 'Y'); + seq1->WriteMFA (cout, 60); + seq2->WriteMFA (cout, 60); + + delete seq1; + delete seq2; + + delete ali; + delete alignment1; + delete alignment2; + delete inputSeq; + delete refSeq; +} + +///////////////////////////////////////////////////////////////// +// PrintHeading() +// +// Prints heading for PROBCONS program. +///////////////////////////////////////////////////////////////// + +void PrintHeading (){ + cerr << endl + << "PROBCONS version 1.02 - align multiple protein sequences and print to standard output" << endl + << "Copyright (C) 2004 Chuong Ba Do" << endl + << endl; +} + +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints PROBCONS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const char *filename){ + + // print parameters to the screen + cerr << message << endl + << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) cerr << setprecision (10) << initDistrib[i] << " "; + cerr << "}" << endl + << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapOpen[i] << " "; + cerr << "}" << endl + << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapExtend[i] << " "; + cerr << "}" << endl + << endl; + + // if a file name is specified + if (filename){ + + // attempt to open the file for writing + FILE *file = fopen (filename, "w"); + if (!file){ + cerr << "ERROR: Unable to write parameter file: " << filename << endl; + exit (1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) fprintf (file, "%.10f ", initDistrib[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapOpen[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapExtend[i]); fprintf (file, "\n"); + fclose (file); + } +} + +///////////////////////////////////////////////////////////////// +// DoAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// + +MultiSequence *DoAlign (MultiSequence *sequences, const ProbabilisticModel &model){ + + assert (sequences); + + const int numSeqs = sequences->GetNumSequences(); + VVF distances (numSeqs, VF (numSeqs, 0)); + SafeVector > sparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + // do all pairwise alignments + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + Sequence *seq1 = sequences->GetSequence (a); + Sequence *seq2 = sequences->GetSequence (b); + + // verbose output + if (enableVerbose) + cerr << "(" << a+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << b+1 << ") " << seq2->GetHeader() << ": "; + + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix (seq1, seq2); assert (forward); + VF *backward = model.ComputeBackwardMatrix (seq1, seq2); assert (backward); + + // if we are training, then we'll simply want to compute the + // expected counts for each region within the matrix separately; + // otherwise, we'll need to put all of the regions together and + // assemble a posterior probability match matrix + + // compute posterior probability matrix + VF *posterior = model.ComputePosteriorMatrix (seq1, seq2, *forward, *backward); assert (posterior); + + // compute "expected accuracy" distance for evolutionary tree computation + pair *, float> alignment = model.ComputeAlignment (seq1->GetLength(), + seq2->GetLength(), + *posterior); + + float distance = alignment.second / min (seq1->GetLength(), seq2->GetLength()); + + if (enableVerbose) + cerr << setprecision (10) << distance << endl; + + // save posterior probability matrices in sparse format + distances[a][b] = distances[b][a] = distance; + sparseMatrices[a][b] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), *posterior); + sparseMatrices[b][a] = sparseMatrices[a][b]->ComputeTranspose(); + + delete alignment.first; + delete posterior; + + delete forward; + delete backward; + } + } + + if (!enableTraining){ + if (enableVerbose) + cerr << endl; + + // now, perform the consistency transformation the desired number of times + for (int i = 0; i < numConsistencyReps; i++) + DoRelaxation (sequences, sparseMatrices); + + // compute the evolutionary tree + TreeNode *tree = TreeNode::ComputeTree (distances); + + //tree->Print (cerr, sequences); + //cerr << endl; + + // make the final alignment + MultiSequence *alignment = ComputeFinalAlignment (tree, sequences, sparseMatrices, model); + delete tree; + + return alignment; + } + + return NULL; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger (char *data, int *val){ + char *endPtr; + long int retVal; + + assert (val); + + errno = 0; + retVal = strtol (data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat (char *data, float *val){ + char *endPtr; + double retVal; + + assert (val); + + errno = 0; + retVal = strtod (data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// + +SafeVector ParseParams (int argc, char **argv){ + + if (argc < 2){ + + cerr << "PROBCONS comes with ABSOLUTELY NO WARRANTY. This is free software, and" << endl + << "you are welcome to redistribute it under certain conditions. See the" << endl + << "file COPYING.txt for details." << endl + << endl + << "Usage:" << endl + << " probcons [OPTION]... [MFAFILE]..." << endl + << endl + << "Description:" << endl + << " Align sequences in MFAFILE(s) and print result to standard output" << endl + << endl + << " -t, --train FILENAME" << endl + << " compute EM transition probabilities, store in FILENAME (default: " + << parametersOutputFilename << ")" << endl + << endl + << " -m, --matrixfile FILENAME" << endl + << " read transition parameters from FILENAME (default: " + << matrixFilename << ")" << endl + << endl + << " -p, --paramfile FILENAME" << endl + << " read scoring matrix probabilities from FILENAME (default: " + << parametersInputFilename << ")" << endl + << endl + << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " << MAX_CONSISTENCY_REPS + << " (default: " << numConsistencyReps << ") passes of consistency transformation" << endl + << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS + << " (default: " << numIterativeRefinementReps << ") passes of iterative-refinement" << endl + << endl + << " -pre, --pre-training REPS" << endl + << " use " << MIN_PRETRAINING_REPS << " <= REPS <= " << MAX_PRETRAINING_REPS + << " (default: " << numPreTrainingReps << ") rounds of pretraining" << endl + << endl + << " -go, --gap-open VALUE" << endl + << " gap opening penalty of VALUE <= 0 (default: " << gapOpenPenalty << ")" << endl + << endl + << " -ge, --gap-extension VALUE" << endl + << " gap extension penalty of VALUE <= 0 (default: " << gapContinuePenalty << ")" << endl + << endl + << " -v, --verbose" << endl + << " report progress while aligning (default: " << (enableVerbose ? "on" : "off") << ")" << endl + << endl; + + exit (1); + } + + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++){ + if (argv[i][0] == '-'){ + + // training + if (!strcmp (argv[i], "-t") || !strcmp (argv[i], "--train")){ + enableTraining = true; + if (i < argc - 1) + parametersOutputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + + // scoring matrix file + else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--matrixfile")){ + if (i < argc - 1) + matrixFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + + // transition/initial distribution parameter file + else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + + // number of consistency transformations + else if (!strcmp (argv[i], "-c") || !strcmp (argv[i], "--consistency")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_CONSISTENCY_REPS || tempInt > MAX_CONSISTENCY_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " << MAX_CONSISTENCY_REPS << "." << endl; + exit (1); + } + else + numConsistencyReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp (argv[i], "-ir") || !strcmp (argv[i], "--iterative-refinement")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS || tempInt > MAX_ITERATIVE_REFINEMENT_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " << MAX_ITERATIVE_REFINEMENT_REPS << "." << endl; + exit (1); + } + else + numIterativeRefinementReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // number of EM pre-training rounds + else if (!strcmp (argv[i], "-pre") || !strcmp (argv[i], "--pre-training")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_PRETRAINING_REPS || tempInt > MAX_PRETRAINING_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_PRETRAINING_REPS << " and " << MAX_PRETRAINING_REPS << "." << endl; + exit (1); + } + else + numPreTrainingReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap open penalty + else if (!strcmp (argv[i], "-go") || !strcmp (argv[i], "--gap-open")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapOpenPenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap extension penalty + else if (!strcmp (argv[i], "-ge") || !strcmp (argv[i], "--gap-extension")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapContinuePenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // verbose reporting + else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--verbose")){ + enableVerbose = true; + } + + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit (1); + } + } + else { + sequenceNames.push_back (string (argv[i])); + } + } + + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void ReadParameters (){ + + ifstream data; + + // read initial state distribution and transition parameters + if (parametersInputFilename == string ("")){ + if (NumInsertStates == 1){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend1Default[i]; + } + else if (NumInsertStates == 2){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend2Default[i]; + } + else { + cerr << "ERROR: No default initial distribution/parameter settings exist" << endl + << " for " << NumInsertStates << " pairs of insert states. Use --paramfile." << endl; + exit (1); + } + } + else { + data.open (parametersInputFilename.c_str()); + if (data.fail()){ + cerr << "ERROR: Unable to read parameter file: " << parametersInputFilename << endl; + exit (1); + } + for (int i = 0; i < NumMatrixTypes; i++) data >> initDistrib[i]; + for (int i = 0; i < 2*NumInsertStates; i++) data >> gapOpen[i]; + for (int i = 0; i < 2*NumInsertStates; i++) data >> gapExtend[i]; + data.close(); + } + + // read emission parameters + int alphabetSize = 20; + + // allocate memory + alphabet = SafeVector(alphabetSize); + emitPairs = VVF (alphabetSize, VF (alphabetSize, 0)); + emitSingle = VF (alphabetSize); + + if (matrixFilename == string ("")){ + for (int i = 0; i < alphabetSize; i++) alphabet[i] = alphabetDefault[i]; + for (int i = 0; i < alphabetSize; i++){ + emitSingle[i] = emitSingleDefault[i]; + for (int j = 0; j <= i; j++){ + emitPairs[i][j] = emitPairs[j][i] = (i == j); + } + } + } + else { + data.open (matrixFilename.c_str()); + if (data.fail()){ + cerr << "ERROR: Unable to read scoring matrix file: " << matrixFilename << endl; + exit (1); + } + + for (int i = 0; i < alphabetSize; i++) data >> alphabet[i]; + for (int i = 0; i < alphabetSize; i++){ + for (int j = 0; j <= i; j++){ + data >> emitPairs[i][j]; + emitPairs[j][i] = emitPairs[i][j]; + } + } + for (int i = 0; i < alphabetSize; i++){ + char ch; + data >> ch; + assert (ch == alphabet[i]); + } + for (int i = 0; i < alphabetSize; i++) data >> emitSingle[i]; + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// + +MultiSequence *ProcessTree (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model){ + MultiSequence *result; + + // check if this is a node of the alignment tree + if (tree->GetSequenceLabel() == -1){ + MultiSequence *alignLeft = ProcessTree (tree->GetLeftChild(), sequences, sparseMatrices, model); + MultiSequence *alignRight = ProcessTree (tree->GetRightChild(), sequences, sparseMatrices, model); + + assert (alignLeft); + assert (alignRight); + + result = AlignAlignments (alignLeft, alignRight, sparseMatrices, model); + assert (result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); assert (result); + result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model){ + + MultiSequence *alignment = ProcessTree (tree, sequences, sparseMatrices, model); + + // iterative refinement + for (int i = 0; i < numIterativeRefinementReps; i++) + DoIterativeRefinement (sparseMatrices, model, alignment); + + cerr << endl; + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model){ + + // print some info about the alignment + if (enableVerbose){ + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } + + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices); + pair *, float> alignment; + + // choose the alignment routine depending on the "cosmetic" gap penalties used + if (gapOpenPenalty == 0 && gapContinuePenalty == 0) + alignment = model.ComputeAlignment (align1->GetSequence(0)->GetLength(), align2->GetSequence(0)->GetLength(), *posterior); + else + alignment = model.ComputeAlignmentWithGapPenalties (align1, align2, + *posterior, align1->GetNumSequences(), align2->GetNumSequences(), + gapOpenPenalty, gapContinuePenalty); + + delete posterior; + + if (enableVerbose){ + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min (align1->GetSequence(i)->GetLength(), align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence (align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence (align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the consistency transformation. The +// formula used is: +// 1 +// P'(x[i]-y[j]) = --- sum sum P(x[i]-z[k]) P(z[k]-y[j]) +// |S| z in S k +// +// where S = {x, y, all other sequences...} +// +///////////////////////////////////////////////////////////////// + +void DoRelaxation (MultiSequence *sequences, SafeVector > &sparseMatrices){ + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + // for every pair of sequences + for (int i = 0; i < numSeqs; i++){ + for (int j = i+1; j < numSeqs; j++){ + Sequence *seq1 = sequences->GetSequence (i); + Sequence *seq2 = sequences->GetSequence (j); + + if (enableVerbose) + cerr << "Relaxing (" << i+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << j+1 << ") " << seq2->GetHeader() << ": "; + + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] += posterior[k]; + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) if (k != i && k != j){ + Relax (sparseMatrices[i][k], sparseMatrices[k][j], posterior); + } + + // now renormalization + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] /= numSeqs; + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), posterior); + newSparseMatrices[j][i] = newSparseMatrices[i][j]->ComputeTranspose(); + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; + } + } + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++){ + for (int j = 0; j < numSeqs; j++){ + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior){ + + assert (matXZ); + assert (matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert (matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++){ + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend){ + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend){ + base[ZYptr->first] += XZval * ZYptr->second;; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// + +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment){ + set groupOne, groupTwo; + + // create two separate groups + for (int i = 0; i < alignment->GetNumSequences(); i++){ + if (random() % 2) + groupOne.insert (i); + else + groupTwo.insert (i); + } + + if (groupOne.empty() || groupTwo.empty()) return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project (groupOne); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (groupTwo); assert (groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model); +} + +/* +float ScoreAlignment (MultiSequence *alignment, MultiSequence *sequences, SparseMatrix **sparseMatrices, const int numSeqs){ + int totLength = 0; + float score = 0; + + for (int a = 0; a < alignment->GetNumSequences(); a++){ + for (int b = a+1; b < alignment->GetNumSequences(); b++){ + Sequence *seq1 = alignment->GetSequence(a); + Sequence *seq2 = alignment->GetSequence(b); + + const int seq1Length = sequences->GetSequence(seq1->GetLabel())->GetLength(); + const int seq2Length = sequences->GetSequence(seq2->GetLabel())->GetLength(); + + totLength += min (seq1Length, seq2Length); + + int pos1 = 0, pos2 = 0; + for (int i = 1; i <= seq1->GetLength(); i++){ + char ch1 = seq1->GetPosition(i); + char ch2 = seq2->GetPosition(i); + + if (ch1 != '-') pos1++; + if (ch2 != '-') pos2++; + if (ch1 != '-' && ch2 != '-'){ + score += sparseMatrices[a * numSeqs + b]->GetValue (pos1, pos2); + } + } + } + } + + return score / totLength; +} +*/ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Main.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Main.cc new file mode 100644 index 0000000000..5392f40a2e --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Main.cc @@ -0,0 +1,1870 @@ +///////////////////////////////////////////////////////////////// +// Main.cc +// +// Main routines for MXSCARNA program. +///////////////////////////////////////////////////////////////// + +#include "scarna.hpp" +#include "SafeVector.h" +#include "MultiSequence.h" +#include "Defaults.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "EvolutionaryTree.h" +#include "SparseMatrix.h" +#include "BPPMatrix.hpp" +#include "StemCandidate.hpp" +#include "Globaldp.hpp" +#include "nrutil.h" +#include "AlifoldMEA.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "RfoldWrapper.hpp" +//static RFOLD::Rfold folder; + +using namespace::MXSCARNA; +using namespace::RFOLD; + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; +string weboutputFileName = ""; + +ofstream *outputFile; + +bool enableTraining = false; +bool enableVerbose = false; +bool enableAllPairs = false; +bool enableAnnotation = false; +bool enableViterbi = false; +bool enableClustalWOutput = false; +bool enableTrainEmissions = false; +bool enableAlignOrder = false; +bool enableWebOutput = false; +bool enableStockholmOutput = false; +bool enableMXSCARNAOutput = false; +bool enableMcCaskillMEAMode = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; +int scsLength = SCSLENGTH; +float cutoff = 0; +float gapOpenPenalty = 0; +float gapContinuePenalty = 0; +float threshhold = 1.0; +float BaseProbThreshold = BASEPROBTHRESHOLD; +float BasePairConst = BASEPAIRCONST; +int BandWidth = BANDWIDTH; +bool useRfold = USERFOLD; +SafeVector sequenceNames; + +VF initDistrib (NumMatrixTypes); +VF gapOpen (2*NumInsertStates); +VF gapExtend (2*NumInsertStates); +VVF emitPairs (256, VF (256, 1e-10)); +VF emitSingle (256, 1e-5); + +string alphabet = alphabetDefault; + +string *ssCons = NULL; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +///////////////////////////////////////////////////////////////// +// Function prototypes +///////////////////////////////////////////////////////////////// + +void PrintHeading(); +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const VVF &emitPairs, const VF &emitSingle, const char *filename); +MultiSequence *DoAlign (MultiSequence *sequence, const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, VF &gapExtend, VVF &emitPairs, VF &emitSingle); +SafeVector ParseParams (int argc, char **argv); +void ReadParameters (); +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices); +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, SafeVector &BPPMatrices, float identity); +SafeVector > DoRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices); +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior); +void Relax1 (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior); +void DoBasePairProbabilityRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices, + SafeVector &BPPMatrices); +set GetSubtree (const TreeNode *tree); +void TreeBasedBiPartitioning (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + const TreeNode *tree, SafeVector &BPPMatrices); +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment); +void WriteAnnotation (MultiSequence *alignment, + const SafeVector > &sparseMatrices); +int ComputeScore (const SafeVector > &active, + const SafeVector > &sparseMatrices); +std::vector* seq2scs(MultiSequence *Sequences, SafeVector &BPPMatrices, int BandWidth); +void removeConflicts(std::vector *pscs1, std::vector *pscs2, std::vector *matchPSCS1, std::vector *matchPSCS2); + +struct prob { + int i; + int j; + float p; +}; + +///////////////////////////////////////////////////////////////// +// main() +// +// Calls all initialization routines and runs the MXSCARNA +// aligner. +///////////////////////////////////////////////////////////////// + + +int main (int argc, char **argv){ + + // print MXSCARNA heading + PrintHeading(); + + // parse program parameters + sequenceNames = ParseParams (argc, argv); + ReadParameters(); + PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + // now, we'll process all the files given as input. If we are given + // several filenames as input, then we'll load all of those sequences + // simultaneously, as long as we're not training. On the other hand, + // if we are training, then we'll treat each file as a separate + // training instance + + if (enableMcCaskillMEAMode) { + MultiSequence *sequences = new MultiSequence(); assert (sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++){ + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA (sequenceNames[i], true); + } + + const int numSeqs = sequences->GetNumSequences(); + SafeVector BPPMatrices; + + // compute the base pairing matrices for each sequences + for(int i = 0; i < numSeqs; i++) { + Sequence *tmpSeq = sequences->GetSequence(i); + string seq = tmpSeq->GetString(); + int n_seq = tmpSeq->GetLength(); + BPPMatrix *bppmat = new BPPMatrix(seq, n_seq); + BPPMatrices.push_back(bppmat); + } + AlifoldMEA alifold(sequences, BPPMatrices, BasePairConst); + alifold.Run(); + ssCons = alifold.getSScons(); + + if (enableStockholmOutput) { + sequences->WriteSTOCKHOLM (cout, ssCons); + } + else if (enableMXSCARNAOutput){ + sequences->WriteMXSCARNA (cout, ssCons); + } + else { + sequences->WriteMFA (cout, ssCons); + } + + delete sequences; + } + // if we are training + else if (enableTraining){ + + // build new model for aligning + ProbabilisticModel model (initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + // prepare to average parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] = 0; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] = 0; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] = 0; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] = 0; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] = 0; + } + + // align each file individually + for (int i = 0; i < (int) sequenceNames.size(); i++){ + + VF thisInitDistrib (NumMatrixTypes); + VF thisGapOpen (2*NumInsertStates); + VF thisGapExtend (2*NumInsertStates); + VVF thisEmitPairs (256, VF (256, 1e-10)); + VF thisEmitSingle (256, 1e-5); + + // load sequence file + MultiSequence *sequences = new MultiSequence(); assert (sequences); + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA (sequenceNames[i], true); + + // align sequences + DoAlign (sequences, model, thisInitDistrib, thisGapOpen, thisGapExtend, thisEmitPairs, thisEmitSingle); + + // add in contribution of the derived parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] += thisInitDistrib[i]; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] += thisGapOpen[i]; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] += thisGapExtend[i]; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] += thisEmitPairs[i][j]; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] += thisEmitSingle[i]; + } + + delete sequences; + } + + // compute new parameters and print them out + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] /= (int) sequenceNames.size(); + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] /= (int) sequenceNames.size(); + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] /= sequenceNames.size(); + } + + PrintParameters ("Trained parameter set:", + initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, + parametersOutputFilename.c_str()); + } + // pass + // if we are not training, we must simply want to align some sequences + else { + // load all files together + MultiSequence *sequences = new MultiSequence(); assert (sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++){ + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + + sequences->LoadMFA (sequenceNames[i], true); + } + + // do all "pre-training" repetitions first + // NOT execute + for (int ct = 0; ct < numPreTrainingReps; ct++){ + enableTraining = true; + + // build new model for aligning + ProbabilisticModel model (initDistrib, gapOpen, gapExtend, + emitPairs, emitSingle); + + // do initial alignments + DoAlign (sequences, model, initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + // print new parameters + PrintParameters ("Recomputed parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + enableTraining = false; + } + + // now, we can perform the alignments and write them out + if (enableWebOutput) { + outputFile = new ofstream(weboutputFileName.c_str()); + if (!outputFile) { + cerr << "cannot open output file." << weboutputFileName << endl; + exit(1); + } + *outputFile << "" << endl; + *outputFile << "" << endl; + } + MultiSequence *alignment = DoAlign (sequences, + ProbabilisticModel (initDistrib, gapOpen, gapExtend, emitPairs, emitSingle), + initDistrib, gapOpen, gapExtend, emitPairs, emitSingle); + + + if (!enableAllPairs){ + if (enableClustalWOutput) { + alignment->WriteALN (cout); + } + else if (enableWebOutput) { + alignment->WriteWEB (*outputFile, ssCons); +// computeStructureWithAlifold (); + } + else if (enableStockholmOutput) { + alignment->WriteSTOCKHOLM (cout, ssCons); + } + else if (enableMXSCARNAOutput) { + alignment->WriteMXSCARNA (cout, ssCons); + } + else { + alignment->WriteMFA (cout, ssCons); + } + } + + if (enableWebOutput) { + *outputFile << "" << endl; + delete outputFile; + } + + delete ssCons; + delete alignment; + delete sequences; + + } +} + +///////////////////////////////////////////////////////////////// +// PrintHeading() +// +// Prints heading for PROBCONS program. +///////////////////////////////////////////////////////////////// + +void PrintHeading (){ + cerr << endl + << "Multiplex SCARNA"<< endl + << "version " << VERSION << " - align multiple RNA sequences and print to standard output" << endl + << "Written by Yasuo Tabei" << endl + << endl; +} + +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints PROBCONS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void PrintParameters (const char *message, const VF &initDistrib, const VF &gapOpen, + const VF &gapExtend, const VVF &emitPairs, const VF &emitSingle, const char *filename){ + + // print parameters to the screen + cerr << message << endl + << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) cerr << setprecision (10) << initDistrib[i] << " "; + cerr << "}" << endl + << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapOpen[i] << " "; + cerr << "}" << endl + << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates*2; i++) cerr << setprecision (10) << gapExtend[i] << " "; + cerr << "}" << endl + << endl; + + /* + for (int i = 0; i < 5; i++){ + for (int j = 0; j <= i; j++){ + cerr << emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]] << " "; + } + cerr << endl; + }*/ + + // if a file name is specified + if (filename){ + + // attempt to open the file for writing + FILE *file = fopen (filename, "w"); + if (!file){ + cerr << "ERROR: Unable to write parameter file: " << filename << endl; + exit (1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) fprintf (file, "%.10f ", initDistrib[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapOpen[i]); fprintf (file, "\n"); + for (int i = 0; i < 2*NumInsertStates; i++) fprintf (file, "%.10f ", gapExtend[i]); fprintf (file, "\n"); + fprintf (file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++){ + for (int j = 0; j <= i; j++) + fprintf (file, "%.10f ", emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf (file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf (file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf (file, "\n"); + fclose (file); + } +} + +///////////////////////////////////////////////////////////////// +// DoAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +MultiSequence *DoAlign (MultiSequence *sequences, const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, VF &gapExtend, VVF &emitPairs, VF &emitSingle){ + + assert (sequences); + + const int numSeqs = sequences->GetNumSequences(); + VVF distances (numSeqs, VF (numSeqs, 0)); + VVF identities (numSeqs, VF (numSeqs, 0)); + SafeVector > sparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + SafeVector BPPMatrices; + + RfoldWrapper rfoldWrapper; + if (useRfold) { + BPPMatrices + = rfoldWrapper.getProb(sequenceNames, sequences, BASEPROBTHRESHOLD, BandWidth); + } + else { + for(int i = 0; i < numSeqs; i++) { + Sequence *tmpSeq = sequences->GetSequence(i); + string seq = tmpSeq->GetString(); + int n_seq = tmpSeq->GetLength(); + BPPMatrix *bppmat = new BPPMatrix(seq, n_seq, BASEPROBTHRESHOLD); + BPPMatrices.push_back(bppmat); + } + } + + if (enableTraining){ + // prepare to average parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] = 0; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] = 0; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] = 0; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] = 0; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] = 0; + } + } + + // skip posterior calculations if we just want to do Viterbi alignments + if (!enableViterbi){ + + // do all pairwise alignments for posterior probability matrices + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + Sequence *seq1 = sequences->GetSequence (a); + Sequence *seq2 = sequences->GetSequence (b); + + // verbose output + if (enableVerbose) + cerr << "Computing posterior matrix: (" << a+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << b+1 << ") " << seq2->GetHeader() << " -- "; + + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix (seq1, seq2); assert (forward); + VF *backward = model.ComputeBackwardMatrix (seq1, seq2); assert (backward); + + // if we are training, then we'll simply want to compute the + // expected counts for each region within the matrix separately; + // otherwise, we'll need to put all of the regions together and + // assemble a posterior probability match matrix + + // so, if we're training + if (enableTraining){ + + // compute new parameters + VF thisInitDistrib (NumMatrixTypes); + VF thisGapOpen (2*NumInsertStates); + VF thisGapExtend (2*NumInsertStates); + VVF thisEmitPairs (256, VF (256, 1e-10)); + VF thisEmitSingle (256, 1e-5); + + model.ComputeNewParameters (seq1, seq2, *forward, *backward, thisInitDistrib, thisGapOpen, thisGapExtend, thisEmitPairs, thisEmitSingle, enableTrainEmissions); + + // add in contribution of the derived parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] += thisInitDistrib[i]; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] += thisGapOpen[i]; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] += thisGapExtend[i]; + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] += thisEmitPairs[i][j]; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] += thisEmitSingle[i]; + } + + // let us know that we're done. + if (enableVerbose) cerr << "done." << endl; + } + // pass + else { + + // compute posterior probability matrix + VF *posterior = model.ComputePosteriorMatrix (seq1, seq2, *forward, *backward); assert (posterior); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + if (!enableAllPairs){ + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment (seq1->GetLength(), + seq2->GetLength(), + *posterior); + + Sequence *tmpSeq1 = seq1->AddGaps (alignment.first, 'X'); + Sequence *tmpSeq2 = seq2->AddGaps (alignment.first, 'Y'); + + // compute sequence identity for each pair of sequenceses + int length = tmpSeq1->GetLength(); + int matchCount = 0; + int misMatchCount = 0; + for (int k = 1; k <= length; k++) { + int ch1 = tmpSeq1->GetPosition(k); + int ch2 = tmpSeq2->GetPosition(k); + if (ch1 == ch2 && ch1 != '-' && ch2 != '-') { ++matchCount; } + else if (ch1 != ch2 && ch1 != '-' && ch2 != '-') { ++misMatchCount; } + } + + identities[a][b] = identities[b][a] = (float)matchCount/(float)(matchCount + misMatchCount); + + // compute "expected accuracy" distance for evolutionary tree computation + float distance = alignment.second / min (seq1->GetLength(), seq2->GetLength()); + distances[a][b] = distances[b][a] = distance; + + if (enableVerbose) + cerr << setprecision (10) << distance << endl; + + delete alignment.first; + } + else { + // let us know that we're done. + if (enableVerbose) cerr << "done." << endl; + } + + delete posterior; + } + + delete forward; + delete backward; + } + } + } + + // now average out parameters derived + if (enableTraining){ + // compute new parameters + for (int i = 0; i < (int) initDistrib.size(); i++) initDistrib[i] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) gapOpen.size(); i++) gapOpen[i] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) gapExtend.size(); i++) gapExtend[i] /= numSeqs * (numSeqs - 1) / 2; + + if (enableTrainEmissions){ + for (int i = 0; i < (int) emitPairs.size(); i++) + for (int j = 0; j < (int) emitPairs[i].size(); j++) emitPairs[i][j] /= numSeqs * (numSeqs - 1) / 2; + for (int i = 0; i < (int) emitSingle.size(); i++) emitSingle[i] /= numSeqs * (numSeqs - 1) / 2; + } + } + + // see if we still want to do some alignments + else { + // pass + if (!enableViterbi){ + + // perform the consistency transformation the desired number of times + for (int r = 0; r < numConsistencyReps; r++){ + SafeVector > newSparseMatrices = DoRelaxation (sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++){ + for (int j = 0; j < numSeqs; j++){ + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + if (numSeqs > 8) { + for (int r = 0; r < 1; r++) + DoBasePairProbabilityRelaxation(sequences, sparseMatrices, BPPMatrices); + } + } + + MultiSequence *finalAlignment = NULL; + + if (enableAllPairs){ + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + Sequence *seq1 = sequences->GetSequence (a); + Sequence *seq2 = sequences->GetSequence (b); + + if (enableVerbose) + cerr << "Performing pairwise alignment: (" << a+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << b+1 << ") " << seq2->GetHeader() << " -- "; + + + // perform the pairwise sequence alignment + pair *, float> alignment; + if (enableViterbi) + alignment = model.ComputeViterbiAlignment (seq1, seq2); + else { + + // build posterior matrix + VF *posterior = sparseMatrices[a][b]->GetPosterior(); assert (posterior); + int length = (seq1->GetLength() + 1) * (seq2->GetLength() + 1); + for (int i = 0; i < length; i++) (*posterior)[i] -= cutoff; + + alignment = model.ComputeAlignment (seq1->GetLength(), seq2->GetLength(), *posterior); + delete posterior; + } + + // write pairwise alignments + string name = seq1->GetHeader() + "-" + seq2->GetHeader() + (enableClustalWOutput ? ".aln" : ".fasta"); + ofstream outfile (name.c_str()); + + MultiSequence *result = new MultiSequence(); + result->AddSequence (seq1->AddGaps(alignment.first, 'X')); + result->AddSequence (seq2->AddGaps(alignment.first, 'Y')); + if (enableClustalWOutput) + result->WriteALN (outfile); + else + result->WriteMFA (outfile); + + outfile.close(); + + delete alignment.first; + } + } + } + + // now if we still need to do a final multiple alignment + else { + + if (enableVerbose) + cerr << endl; + + // compute the evolutionary tree + TreeNode *tree = TreeNode::ComputeTree (distances, identities); + + if (enableWebOutput) { + *outputFile << "" << endl; + tree->Print (*outputFile, sequences); + *outputFile << "" << endl; + } + else { + tree->Print (cerr, sequences); + cerr << endl; + } + // make the final alignment + finalAlignment = ComputeFinalAlignment (tree, sequences, sparseMatrices, model, BPPMatrices); + + // build annotation + if (enableAnnotation){ + WriteAnnotation (finalAlignment, sparseMatrices); + } + + delete tree; + } + + if (!enableViterbi){ + // delete sparse matrices + for (int a = 0; a < numSeqs-1; a++){ + for (int b = a+1; b < numSeqs; b++){ + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + } + + AlifoldMEA alifold(finalAlignment, BPPMatrices, BasePairConst); + alifold.Run(); + ssCons = alifold.getSScons(); + + return finalAlignment; + + } + + return NULL; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger (char *data, int *val){ + char *endPtr; + long int retVal; + + assert (val); + + errno = 0; + retVal = strtol (data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat (char *data, float *val){ + char *endPtr; + double retVal; + + assert (val); + + errno = 0; + retVal = strtod (data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// + +SafeVector ParseParams (int argc, char **argv){ + + if (argc < 2){ + + cerr << "MXSCARNA comes with ABSOLUTELY NO WARRANTY. This is free software, and" << endl + << "you are welcome to redistribute it under certain conditions. See the" << endl + << "file COPYING.txt for details." << endl + << endl + << "Usage:" << endl + << " mxscarna [OPTION]... [MFAFILE]..." << endl + << endl + << "Description:" << endl + << " Align sequences in MFAFILE(s) and print result to standard output" << endl + << endl + << " -clustalw" << endl + << " use CLUSTALW output format instead of MFA" << endl + << endl + << " -stockholm" << endl + << " use STOCKHOLM output format instead of MFA" << endl + << endl + << " -mxscarna" << endl + << " use MXSCARNA output format instead of MFA" << endl + << endl + << " -weboutput //" << endl + << " use web output format" << endl + << endl + << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " << MAX_CONSISTENCY_REPS + << " (default: " << numConsistencyReps << ") passes of consistency transformation" << endl + << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS + << " (default: " << numIterativeRefinementReps << ") passes of iterative-refinement" << endl + << endl + << " -pre, --pre-training REPS" << endl + << " use " << MIN_PRETRAINING_REPS << " <= REPS <= " << MAX_PRETRAINING_REPS + << " (default: " << numPreTrainingReps << ") rounds of pretraining" << endl + << endl + << " -pairs" << endl + << " generate all-pairs pairwise alignments" << endl + << endl + << " -viterbi" << endl + << " use Viterbi algorithm to generate all pairs (automatically enables -pairs)" << endl + << endl + << " -v, --verbose" << endl + << " report progress while aligning (default: " << (enableVerbose ? "on" : "off") << ")" << endl + << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" << endl + << endl + << " -t, --train FILENAME" << endl + << " compute EM transition probabilities, store in FILENAME (default: " + << parametersOutputFilename << ")" << endl + << endl + << " -e, --emissions" << endl + << " also reestimate emission probabilities (default: " + << (enableTrainEmissions ? "on" : "off") << ")" << endl + << endl + << " -p, --paramfile FILENAME" << endl + << " read parameters from FILENAME (default: " + << parametersInputFilename << ")" << endl + << endl + << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << endl + << " -s THRESHOLD" << endl + << " the threshold of SCS alignment" << endl + << endl + << " In default, for less than " << threshhold << ", the SCS aligment is applied. " << endl + << " -l SCSLENGTH" << endl + << " the length of stem candidates " << SCSLENGTH << endl + << endl + << " -b BASEPROBTRHESHHOLD" << endl + << " the threshold of base pairing probability " << BASEPROBTHRESHOLD << endl + << endl + << " -m, --mccaskillmea" << endl + << " McCaskill MEA MODE: input the clustalw format file and output the secondary structure predicted by McCaskill MEA" << endl + << endl + << " -g BASEPAIRSCORECONST" << endl + << " the control parameter of the prediction of base pairs, default:" << BasePairConst << endl + << endl + << " -w BANDWIDTH" << endl + << " the control parameter of the distance of stem candidates, default:" << BANDWIDTH << endl + << " -rfold" << endl + << " use Rfold instead of global McCaskill algorithm to calcurate base paring probality matrices, default: (" << (useRfold? "on" : "off") << ")" << endl + << endl; + + + // << " -go, --gap-open VALUE" << endl + // << " gap opening penalty of VALUE <= 0 (default: " << gapOpenPenalty << ")" << endl + // << endl + // << " -ge, --gap-extension VALUE" << endl + // << " gap extension penalty of VALUE <= 0 (default: " << gapContinuePenalty << ")" << endl + // << endl + // << " -co, --cutoff CUTOFF" << endl + // << " subtract 0 <= CUTOFF <= 1 (default: " << cutoff << ") from all posterior values before final alignment" << endl + // << endl + + exit (1); + } + + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++){ + if (argv[i][0] == '-'){ + + // training + if (!strcmp (argv[i], "-t") || !strcmp (argv[i], "--train")){ + enableTraining = true; + if (i < argc - 1) + parametersOutputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + + // emission training + else if (!strcmp (argv[i], "-e") || !strcmp (argv[i], "--emissions")){ + enableTrainEmissions = true; + } + + // parameter file + else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + } + else if (! strcmp (argv[i], "-s")) { + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + threshhold = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + else if (! strcmp (argv[i], "-l")) { + if (i < argc - 1) { + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt <= 0 || 6 <= tempInt) { + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << "1 and 6" << "." << endl; + exit (1); + } + else + scsLength = tempInt; + } + } + } + else if (! strcmp (argv[i], "-b")) { + if (i < argc - 1) { + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 && 1 < tempFloat) { + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + BaseProbThreshold = tempFloat; + } + } + } + else if (! strcmp (argv[i], "-g")) { + if (i < argc - 1) { + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 && 1 < tempFloat) { + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be nagative." << endl; + exit (1); + } + else + BasePairConst = tempFloat; + } + } + } + + // number of consistency transformations + else if (!strcmp (argv[i], "-c") || !strcmp (argv[i], "--consistency")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_CONSISTENCY_REPS || tempInt > MAX_CONSISTENCY_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " << MAX_CONSISTENCY_REPS << "." << endl; + exit (1); + } + else + numConsistencyReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp (argv[i], "-ir") || !strcmp (argv[i], "--iterative-refinement")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS || tempInt > MAX_ITERATIVE_REFINEMENT_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " << MAX_ITERATIVE_REFINEMENT_REPS << "." << endl; + exit (1); + } + else + numIterativeRefinementReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + else if (!strcmp (argv[i], "-rfold")){ + useRfold = true; + } + // number of EM pre-training rounds + else if (!strcmp (argv[i], "-pre") || !strcmp (argv[i], "--pre-training")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempInt < MIN_PRETRAINING_REPS || tempInt > MAX_PRETRAINING_REPS){ + cerr << "ERROR: For option " << argv[i-1] << ", integer must be between " + << MIN_PRETRAINING_REPS << " and " << MAX_PRETRAINING_REPS << "." << endl; + exit (1); + } + else + numPreTrainingReps = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // the distance of stem candidate + else if (!strcmp (argv[i], "-w")){ + if (i < argc - 1){ + if (!GetInteger (argv[++i], &tempInt)){ + cerr << "ERROR: Invalid integer following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + BandWidth = tempInt; + } + } + else { + cerr << "ERROR: Integer expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap open penalty + else if (!strcmp (argv[i], "-go") || !strcmp (argv[i], "--gap-open")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapOpenPenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // gap extension penalty + else if (!strcmp (argv[i], "-ge") || !strcmp (argv[i], "--gap-extension")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat > 0){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must not be positive." << endl; + exit (1); + } + else + gapContinuePenalty = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // all-pairs pairwise alignments + else if (!strcmp (argv[i], "-pairs")){ + enableAllPairs = true; + } + + // all-pairs pairwise Viterbi alignments + else if (!strcmp (argv[i], "-viterbi")){ + enableAllPairs = true; + enableViterbi = true; + } + + // annotation files + else if (!strcmp (argv[i], "-annot")){ + enableAnnotation = true; + if (i < argc - 1) + annotationFilename = argv[++i]; + else { + cerr << "ERROR: FILENAME expected for option " << argv[i] << endl; + exit (1); + } + } + + // clustalw output format + else if (!strcmp (argv[i], "-clustalw")){ + enableClustalWOutput = true; + } + // mxscarna output format + else if (!strcmp (argv[i], "-mxscarna")) { + enableMXSCARNAOutput = true; + } + // stockholm output format + else if (!strcmp (argv[i], "-stockholm")) { + enableStockholmOutput = true; + } + // web output format + else if (!strcmp (argv[i], "-weboutput")) { + if (i < argc - 1) { + weboutputFileName = string(argv[++i]); + } + else { + cerr << "ERROR: Invalid following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + + enableWebOutput = true; + } + + // cutoff + else if (!strcmp (argv[i], "-co") || !strcmp (argv[i], "--cutoff")){ + if (i < argc - 1){ + if (!GetFloat (argv[++i], &tempFloat)){ + cerr << "ERROR: Invalid floating-point value following option " << argv[i-1] << ": " << argv[i] << endl; + exit (1); + } + else { + if (tempFloat < 0 || tempFloat > 1){ + cerr << "ERROR: For option " << argv[i-1] << ", floating-point value must be between 0 and 1." << endl; + exit (1); + } + else + cutoff = tempFloat; + } + } + else { + cerr << "ERROR: Floating-point value expected for option " << argv[i] << endl; + exit (1); + } + } + + // verbose reporting + else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--verbose")){ + enableVerbose = true; + } + + // alignment order + else if (!strcmp (argv[i], "-a") || !strcmp (argv[i], "--alignment-order")){ + enableAlignOrder = true; + } + // McCaskill MEA MODE + else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--mccaskillmea")){ + enableMcCaskillMEAMode = true; + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit (1); + } + } + else { + sequenceNames.push_back (string (argv[i])); + } + } + + if (enableTrainEmissions && !enableTraining){ + cerr << "ERROR: Training emissions (-e) requires training (-t)" << endl; + exit (1); + } + + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void ReadParameters (){ + + ifstream data; + + emitPairs = VVF (256, VF (256, 1e-10)); + emitSingle = VF (256, 1e-5); + + // read initial state distribution and transition parameters + // pass + if (parametersInputFilename == string ("")){ + if (NumInsertStates == 1){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend1Default[i]; + } + else if (NumInsertStates == 2){ + for (int i = 0; i < NumMatrixTypes; i++) initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2*NumInsertStates; i++) gapExtend[i] = gapExtend2Default[i]; + } + else { + cerr << "ERROR: No default initial distribution/parameter settings exist" << endl + << " for " << NumInsertStates << " pairs of insert states. Use --paramfile." << endl; + exit (1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++){ + emitSingle[(unsigned char) tolower(alphabet[i])] = emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = emitSingleDefault[i]; + for (int j = 0; j <= i; j++){ + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper(alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower(alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper(alphabet[i])] = emitPairsDefault[i][j]; + } + } + } + else { + data.open (parametersInputFilename.c_str()); + if (data.fail()){ + cerr << "ERROR: Unable to read parameter file: " << parametersInputFilename << endl; + exit (1); + } + + string line[3]; + for (int i = 0; i < 3; i++){ + if (!getline (data, line[i])){ + cerr << "ERROR: Unable to read transition parameters from parameter file: " << parametersInputFilename << endl; + exit (1); + } + } + istringstream data2; + data2.clear(); data2.str (line[0]); for (int i = 0; i < NumMatrixTypes; i++) data2 >> initDistrib[i]; + data2.clear(); data2.str (line[1]); for (int i = 0; i < 2*NumInsertStates; i++) data2 >> gapOpen[i]; + data2.clear(); data2.str (line[2]); for (int i = 0; i < 2*NumInsertStates; i++) data2 >> gapExtend[i]; + + if (!getline (data, line[0])){ + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " << parametersInputFilename << endl; + exit (1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); data2.str (line[0]); while (data2 >> token) alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++){ + for (int j = 0; j <= i; j++){ + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower(alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper(alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower(alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper(alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower(alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper(alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower(alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper(alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++){ + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +float ide; +MultiSequence *ProcessTree (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, SafeVector &BPPMatrices) { + MultiSequence *result; + + // check if this is a node of the alignment tree + if (tree->GetSequenceLabel() == -1){ + MultiSequence *alignLeft = ProcessTree (tree->GetLeftChild(), sequences, sparseMatrices, model, BPPMatrices); + MultiSequence *alignRight = ProcessTree (tree->GetRightChild(), sequences, sparseMatrices, model, BPPMatrices); + + assert (alignLeft); + assert (alignRight); + + result = AlignAlignments (alignLeft, alignRight, sparseMatrices, model, BPPMatrices, tree->GetIdentity()); + assert (result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); assert (result); + result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence *ComputeFinalAlignment (const TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices) { + + MultiSequence *alignment = ProcessTree (tree, sequences, sparseMatrices, model, BPPMatrices); + + if (enableAlignOrder){ + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // if you use the function, you can degrade the quality of the software. + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree, BPPMatrices); + + // iterative refinement +/* + for (int i = 0; i < numIterativeRefinementReps; i++) + DoIterativeRefinement (sparseMatrices, model, alignment); + + cerr << endl; +*/ + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence *AlignAlignments (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, + SafeVector &BPPMatrices, float identity){ + + // print some info about the alignment + if (enableVerbose){ + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i==0) ? "[" : ",") << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } + + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); + + pair *, float> alignment; + // choose the alignment routine depending on the "cosmetic" gap penalties used + if (gapOpenPenalty == 0 && gapContinuePenalty == 0) { + + if(identity < threshhold) { + std::vector *pscs1, *pscs2; + pscs1 = seq2scs(align1, BPPMatrices, BandWidth); + pscs2 = seq2scs(align2, BPPMatrices, BandWidth); + std::vector *matchPSCS1 = new std::vector; + std::vector *matchPSCS2 = new std::vector; + + Globaldp globaldp(pscs1, pscs2, align1, align2, matchPSCS1, matchPSCS2, posterior, BPPMatrices); + //float scsScore = globaldp.Run(); + + globaldp.Run(); + + removeConflicts(pscs1, pscs2, matchPSCS1, matchPSCS2); + + alignment = model.ComputeAlignment2 (align1->GetSequence(0)->GetLength(), align2->GetSequence(0)->GetLength(), *posterior, pscs1, pscs2, matchPSCS1, matchPSCS2); + + } else { + alignment = model.ComputeAlignment (align1->GetSequence(0)->GetLength(), align2->GetSequence(0)->GetLength(), *posterior); + } + } + else { + alignment = model.ComputeAlignmentWithGapPenalties (align1, align2, + *posterior, align1->GetNumSequences(), align2->GetNumSequences(), + gapOpenPenalty, gapContinuePenalty); + } + + delete posterior; + + if (enableVerbose){ + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min (align1->GetSequence(i)->GetLength(), align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence (align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence (align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the consistency transformation. The +// formula used is: +// 1 +// P'(x[i]-y[j]) = --- sum sum P(x[i]-z[k]) P(z[k]-y[j]) +// |S| z in S k +// +// where S = {x, y, all other sequences...} +// +///////////////////////////////////////////////////////////////// + +SafeVector > DoRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices){ + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices (numSeqs, SafeVector(numSeqs, NULL)); + + // for every pair of sequences + for (int i = 0; i < numSeqs; i++){ + for (int j = i+1; j < numSeqs; j++){ + Sequence *seq1 = sequences->GetSequence (i); + Sequence *seq2 = sequences->GetSequence (j); + + if (enableVerbose) + cerr << "Relaxing (" << i+1 << ") " << seq1->GetHeader() << " vs. " + << "(" << j+1 << ") " << seq2->GetHeader() << ": "; + + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] += posterior[k]; + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) if (k != i && k != j){ + if (k < i) + Relax1 (sparseMatrices[k][i], sparseMatrices[k][j], posterior); + else if (k > i && k < j) + Relax (sparseMatrices[i][k], sparseMatrices[k][j], posterior); + else { + SparseMatrix *temp = sparseMatrices[j][k]->ComputeTranspose(); + Relax (sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + + // now renormalization + for (int k = 0; k < (seq1Length+1) * (seq2Length+1); k++) posterior[k] /= numSeqs; + + // mask out positions not originally in the posterior matrix + SparseMatrix *matXY = sparseMatrices[i][j]; + for (int y = 0; y <= seq2Length; y++) posterior[y] = 0; + for (int x = 1; x <= seq1Length; x++){ + SafeVector::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend){ + + // zero out all cells until the first filled column + while (curr < XYptr->first){ + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length){ + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix (seq1->GetLength(), seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; + } + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void Relax (SparseMatrix *matXZ, SparseMatrix *matZY, VF &posterior){ + + assert (matXZ); + assert (matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert (matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++){ + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend){ + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend){ + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void Relax1 (SparseMatrix *matZX, SparseMatrix *matZY, VF &posterior){ + + assert (matZX); + assert (matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++){ + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend){ + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend){ + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} + +void DoBasePairProbabilityRelaxation (MultiSequence *sequences, + SafeVector > &sparseMatrices, + SafeVector &BPPMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + for (int i = 0; i < numSeqs; i++) { + Sequence *seq1 = sequences->GetSequence (i); + BPPMatrix *seq1BppMatrix = BPPMatrices[seq1->GetLabel()]; + Trimat consBppMat(seq1->GetLength() + 1); + int seq1Length = seq1->GetLength(); + + for (int k = 1; k <= seq1Length; k++) { + for (int l = k; l <= seq1Length; l++) { + consBppMat.ref(k, l) = seq1BppMatrix->GetProb(k, l); + } + } + + for (int j = i + 1; j < numSeqs; j++) { + + // VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior() + Sequence *seq2 = sequences->GetSequence (j); + BPPMatrix *seq2BppMatrix = BPPMatrices[seq2->GetLabel()]; +// int seq2Length = seq2->GetLength(); + SparseMatrix *matchProb = sparseMatrices[i][j]; + +// vector &probs1 = seq1BppMatrix->bppMat.data2; + for(int k = 1; k <= seq1Length; k++) { + for(int m = k, n = k; n <= k + 200 && m >= 1 && n <= seq1Length; m--, n++) { + +// for (int k = 0; k < (int)probs1.size(); k++) { +// float tmpProb1 = probs1[k].prob; +// int tmp1I = probs1[k].i; +// int tmp1J = probs1[k].j; + + float sumProb = 0; + vector &probs2 = seq2BppMatrix->bppMat.data2; + for(int l = 0; l < (int)probs2.size(); l++) { + float tmpProb2 = probs2[l].prob; + int tmp2I = probs2[l].i; + int tmp2J = probs2[l].j; + sumProb += matchProb->GetValue(m, tmp2I)*matchProb->GetValue(n, tmp2J)*tmpProb2; + } + + consBppMat.ref(m, n) += sumProb; + } + + for(int m = k, n = k + 1; n <= k + 200 && m >= 1 && n <= seq1Length; m--, n++) { + +// for (int k = 0; k < (int)probs1.size(); k++) { +// float tmpProb1 = probs1[k].prob; +// int tmp1I = probs1[k].i; +// int tmp1J = probs1[k].j; + + float sumProb = 0; + vector &probs2 = seq2BppMatrix->bppMat.data2; + for(int l = 0; l < (int)probs2.size(); l++) { + float tmpProb2 = probs2[l].prob; + int tmp2I = probs2[l].i; + int tmp2J = probs2[l].j; + sumProb += matchProb->GetValue(m, tmp2I)*matchProb->GetValue(n, tmp2J)*tmpProb2; + } + + consBppMat.ref(m, n) += sumProb; + } + } + } + +/* + for(int k = 1; k <= seq1Length; k++) { + for(int m = k, n = k; n <= k + 30 && m >= 1 && n <= seq1Length; m--, n++) { + float tmpProb = seq1BppMatrix->GetProb(m, n); + for(int l = 1; l <= seq2Length; l++) { + for(int s = l, t = l; t <= l + 30 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + for(int s = l, t = l + 1; t <= l + 31 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + } + consBppMat.ref(m, n) += tmpProb; + } + + for(int m = k, n = k + 1; n <= k + 31 && m >= 1 && n <= seq1Length; m--, n++) { + float tmpProb = seq1BppMatrix->GetProb(m, n); + for(int l = 1; l <= seq2Length; l++) { + for(int s = l, t = l; t <= l + 30 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + for(int s = l, t = l + 1; t <= l + 31 && s >= 1 && t <= seq2Length; s--, t++) { + tmpProb += matchProb->GetValue(m,s)*matchProb->GetValue(n,t)*seq2BppMatrix->GetProb(s,t); + } + } + consBppMat.ref(m,n) += tmpProb; + } + } + } +*/ + for (int m = 1; m <= seq1Length; m++) { + for (int n = m + 4; n <= seq1Length; n++) { + consBppMat.ref(m,n) = consBppMat.ref(m,n)/(float)numSeqs; + } + } + seq1BppMatrix->updateBPPMatrix(consBppMat); + } +} + +///////////////////////////////////////////////////////////////// +// GetSubtree +// +// Returns set containing all leaf labels of the current subtree. +///////////////////////////////////////////////////////////////// + +set GetSubtree (const TreeNode *tree){ + set s; + + if (tree->GetSequenceLabel() == -1){ + s = GetSubtree (tree->GetLeftChild()); + set t = GetSubtree (tree->GetRightChild()); + + for (set::iterator iter = t.begin(); iter != t.end(); ++iter) + s.insert (*iter); + } + else { + s.insert (tree->GetSequenceLabel()); + } + + return s; +} + +///////////////////////////////////////////////////////////////// +// TreeBasedBiPartitioning +// +// Uses the iterative refinement scheme from MUSCLE. +///////////////////////////////////////////////////////////////// + +void TreeBasedBiPartitioning (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + const TreeNode *tree, SafeVector &BPPMatrices){ + // check if this is a node of the alignment tree + if (tree->GetSequenceLabel() == -1){ + TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree->GetLeftChild(), BPPMatrices); + TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree->GetRightChild(), BPPMatrices); + + set leftSubtree = GetSubtree (tree->GetLeftChild()); + set rightSubtree = GetSubtree (tree->GetRightChild()); + set leftSubtreeComplement, rightSubtreeComplement; + + // calculate complement of each subtree + for (int i = 0; i < alignment->GetNumSequences(); i++){ + if (leftSubtree.find(i) == leftSubtree.end()) leftSubtreeComplement.insert (i); + if (rightSubtree.find(i) == rightSubtree.end()) rightSubtreeComplement.insert (i); + } + + // perform realignments for edge to left child + if (!leftSubtree.empty() && !leftSubtreeComplement.empty()){ + MultiSequence *groupOneSeqs = alignment->Project (leftSubtree); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (leftSubtreeComplement); assert (groupTwoSeqs); + delete alignment; + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model, BPPMatrices, tree->GetLeftChild()->GetIdentity()); + } + + // perform realignments for edge to right child + if (!rightSubtree.empty() && !rightSubtreeComplement.empty()){ + MultiSequence *groupOneSeqs = alignment->Project (rightSubtree); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (rightSubtreeComplement); assert (groupTwoSeqs); + delete alignment; + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model, BPPMatrices, tree->GetRightChild()->GetIdentity()); + } + } +} + +///////////////////////////////////////////////////////////////// +// DoterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// +/* +void DoIterativeRefinement (const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment){ + set groupOne, groupTwo; + + // create two separate groups + for (int i = 0; i < alignment->GetNumSequences(); i++){ + if (rand() % 2) + groupOne.insert (i); + else + groupTwo.insert (i); + } + + if (groupOne.empty() || groupTwo.empty()) return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project (groupOne); assert (groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project (groupTwo); assert (groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments (groupOneSeqs, groupTwoSeqs, sparseMatrices, model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} +*/ + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void WriteAnnotation (MultiSequence *alignment, + const SafeVector > &sparseMatrices){ + ofstream outfile (annotationFilename.c_str()); + + if (outfile.fail()){ + cerr << "ERROR: Unable to write annotation file." << endl; + exit (1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position (numSeqs, 0); + SafeVector::iterator> seqs (numSeqs); + for (int i = 0; i < numSeqs; i++) seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve (numSeqs); + + // for every column + for (int i = 1; i <= alignLength; i++){ + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++){ + if (seqs[j][i] != '-'){ + active.push_back (make_pair(j, ++position[j])); + } + } + + outfile << setw(4) << ComputeScore (active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int ComputeScore (const SafeVector > &active, + const SafeVector > &sparseMatrices){ + + if (active.size() <= 1) return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++){ + for (int j = i+1; j < (int) active.size(); j++){ + val += sparseMatrices[active[i].first][active[j].first]->GetValue(active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MakeGnuPlot.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MakeGnuPlot.cc new file mode 100644 index 0000000000..fe6641a587 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MakeGnuPlot.cc @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////// +// MakeGnuPlot.cc +///////////////////////////////////////////////////////////////// + +#include +#include + +using namespace std; + +int main (int argc, char **argv){ + + if (argc == 1 || argc > 3){ + cerr << "Usage: makegnuplot annotscores [refscores]" << endl; + exit (1); + } + + ifstream data (argv[1]); + + if (data.fail()){ + cerr << "ERROR: Could not open file " << argv[1] << endl; + exit (1); + } + + int x, ct = 0; + while (data >> x) ct++; + data.close(); + + ofstream out ("temporary_gnuplot_script"); + + if (out.fail()){ + cerr << "ERROR: Could not create temporary file." << endl; + exit (1); + } + + out << "set title \"Column Reliability Scores\"" << endl + << "set xlabel \"Alignment Position\"" << endl + << "set ylabel \"Column Reliability\"" << endl + << "set xr [1:" << ct << "]" << endl + << "set term postscript enhanced color" << endl + << "set output \"reliability.ps\"" << endl; + + if (argc == 3){ + out << "set style fill solid 0.5 noborder" << endl + << "plot \"" << argv[2] << "\" title \"actual\" with boxes lt 2, \\" << endl + << " \"" << argv[1] << "\" title \"predicted\" with histeps lt 1 lw 3" << endl; + } + else + out << "plot \"" << argv[1] << "\" title \"predicted\" with histeps lt 1 lw 3" << endl; + + out.close(); + + if (system ("gnuplot temporary_gnuplot_script") == -1){ + cerr << "ERROR: Could not run Gnuplot correctly." << endl; + exit (1); + } + + //system ("rm temporary_gnuplot_script"); +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Makefile b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Makefile new file mode 100644 index 0000000000..d7581ec6f7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Makefile @@ -0,0 +1,58 @@ +################################################################################ +# Makefile for probcons +################################################################################ + +################################################################################ +# 1) Choose C++ compiler. +################################################################################ + +CXX = g++ + +################################################################################ +# 2) Set C++ flags. +# a) DEBUG mode -- no optimizations, enable SafeVector checking, no inlining +# b) PROFILE mode -- for gprof +# c) RELEASE mode +################################################################################ + +OTHERFLAGS = -DNumInsertStates=1 -DVERSION="1.10" + +# debug mode +#CXXFLAGS = -g -W -Wall -pedantic -DENABLE_CHECKS -fno-inline $(OTHERFLAGS) + +# profile mode +#CXXFLAGS = -pg -W -Wall -pedantic $(OTHERFLAGS) + +# release mode +#CXXFLAGS = -O3 -W -Wall -pedantic -DNDEBUG $(OTHERFLAGS) -mmmx -msse -msse2 -mfpmath=sse -march=pentium4 -mcpu=pentium4 -funroll-loops -fomit-frame-pointer +CXXFLAGS = -O3 -W -Wall -pedantic -DNDEBUG $(OTHERFLAGS) -funroll-loops + +################################################################################ +# 3) Dependencies +################################################################################ + +TARGETS = probcons +#compare project makegnuplot + +.PHONY : all +all : $(TARGETS) + +#probcons : MultiSequence.h ProbabilisticModel.h ScoreType.h Sequence.h FileBuffer.h SparseMatrix.h EvolutionaryTree.h Defaults.h SafeVector.h Main.cc +probcons : MultiSequence.h ProbabilisticModel.h ScoreType.h Sequence.h FileBuffer.h SparseMatrix.h EvolutionaryTree.h Defaults.h SafeVector.h + $(CXX) $(CXXFLAGS) -lm -o probcons Main.cc + +compare : MultiSequence.h Sequence.h FileBuffer.h SafeVector.h CompareToRef.cc + $(CXX) $(CXXFLAGS) -o compare CompareToRef.cc + +fixref : MultiSequence.h ProbabilisticModel.h ScoreType.h Sequence.h FileBuffer.h SparseMatrix.h EvolutionaryTree.h Defaults.h SafeVector.h FixRef.cc + $(CXX) $(CXXFLAGS) -o fixref FixRef.cc + +project : MultiSequence.h Sequence.h SafeVector.h ProjectPairwise.cc + $(CXX) $(CXXFLAGS) -o project ProjectPairwise.cc + +makegnuplot : MakeGnuPlot.cc + $(CXX) $(CXXFLAGS) -o makegnuplot MakeGnuPlot.cc + +.PHONY : clean +clean: + rm -f $(TARGETS) diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MultiSequence.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MultiSequence.h new file mode 100644 index 0000000000..b28c186f14 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/MultiSequence.h @@ -0,0 +1,1120 @@ +//////////////////////////////////////////////////////////////// +// MultiSequence.h +// +// Utilities for reading/writing multiple sequence data. +///////////////////////////////////////////////////////////////// + +#ifndef MULTISEQUENCE_H +#define MULTISEQUENCE_H + +#include +#include +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "Sequence.h" +#include "FileBuffer.h" + +///////////////////////////////////////////////////////////////// +// MultiSequence +// +// Class for multiple sequence alignment input/output. +///////////////////////////////////////////////////////////////// + +namespace MXSCARNA { +class MultiSequence { + + SafeVector *sequences; + + public: + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Default constructor. + ///////////////////////////////////////////////////////////////// + + MultiSequence () : sequences (NULL) {} + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + MultiSequence (FileBuffer &infile) : sequences (NULL) { + LoadMFA (infile); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + MultiSequence (const string &filename) : sequences (NULL){ + LoadMFA (filename); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::~MultiSequence() + // + // Destructor. Gets rid of sequence objects contained in the + // multiple alignment. + ///////////////////////////////////////////////////////////////// + + ~MultiSequence(){ + + // if sequences allocated + if (sequences){ + + // free all sequences + for (SafeVector::iterator iter = sequences->begin(); iter != sequences->end(); ++iter){ + assert (*iter); + delete *iter; + *iter = NULL; + } + + // free sequence vector + delete sequences; + sequences = NULL; + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + void LoadMFA (const string &filename, bool stripGaps = false){ + + // try opening file + FileBuffer infile (filename.c_str()); + + if (infile.fail()){ + cerr << "ERROR: Could not open file '" << filename << "' for reading." << endl; + exit (1); + } + + // if successful, then load using other LoadMFA() routine + LoadMFA (infile, stripGaps); + + infile.close(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MSF from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void ParseMSF (FileBuffer &infile, string header, bool stripGaps = false){ + + SafeVector *> seqData; + SafeVector seqNames; + SafeVector seqLengths; + + istringstream in; + bool valid = true; + bool missingHeader = false; + bool clustalW = false; + + // read until data starts + while (!infile.eof() && header.find ("..", 0) == string::npos){ + if (header.find ("CLUSTAL", 0) == 0 || header.find ("PROBCONS", 0) == 0){ + clustalW = true; + break; + } + infile.GetLine (header); + if (header.find ("//", 0) != string::npos){ + missingHeader = true; + break; + } + } + + // read until end-of-file + while (valid){ + infile.GetLine (header); + if (infile.eof()) break; + + string word; + in.clear(); + in.str(header); + + // check if there's anything on this line + if (in >> word){ + + // clustalw name parsing + if (clustalW){ + if (!isspace(header[0]) && find (seqNames.begin(), seqNames.end(), word) == seqNames.end()){ + seqNames.push_back (word); + seqData.push_back (new SafeVector()); + seqLengths.push_back (0); + seqData[(int) seqData.size() - 1]->push_back ('@'); + } + } + + // look for new sequence label + if (word == string ("Name:")){ + if (in >> word){ + seqNames.push_back (word); + seqData.push_back (new SafeVector()); + seqLengths.push_back (0); + seqData[(int) seqData.size() - 1]->push_back ('@'); + } + else + valid = false; + } + + // check if this is sequence data + else if (find (seqNames.begin(), seqNames.end(), word) != seqNames.end()){ + int index = find (seqNames.begin(), seqNames.end(), word) - seqNames.begin(); + + // read all remaining characters on the line + char ch; + while (in >> ch){ + if (isspace (ch)) continue; +// if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 'A'; + if (ch == '.') ch = '-'; + if (stripGaps && ch == '-') continue; +/* + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')){ + cerr << "ERROR: Unknown character encountered: " << ch << endl; + exit (1); + } +*/ + if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '*' || ch == '-')){ + cerr << "ERROR: Unknown character encountered: " << ch << endl; + exit (1); + } + + // everything's ok so far, so just store this character. + seqData[index]->push_back (ch); + seqLengths[index]++; + } + } + else if (missingHeader){ + seqNames.push_back (word); + seqData.push_back (new SafeVector()); + seqLengths.push_back (0); + seqData[(int) seqData.size() - 1]->push_back ('@'); + + int index = (int) seqNames.size() - 1; + + // read all remaining characters on the line + char ch; + while (in >> ch){ + if (isspace (ch)) continue; +// if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 'A'; + if (ch == '.') ch = '-'; + if (stripGaps && ch == '-') continue; + + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')){ + cerr << "ERROR: Unknown character encountered: " << ch << endl; + exit (1); + } +/* + if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '*' || ch == '-')){ + cerr << "ERROR: Unknown character encountered: " << ch << endl; + exit (1); + } +*/ + // everything's ok so far, so just store this character. + seqData[index]->push_back (ch); + seqLengths[index]++; + } + } + } + } + + // check for errorsq + if (seqNames.size() == 0){ + cerr << "ERROR: No sequences read!" << endl; + exit (1); + } + + assert (!sequences); + sequences = new SafeVector; + for (int i = 0; i < (int) seqNames.size(); i++){ + if (seqLengths[i] == 0){ + cerr << "ERROR: Sequence of zero length!" << endl; + exit (1); + } + Sequence *seq = new Sequence (seqData[i], seqNames[i], seqLengths[i], i, i); + sequences->push_back (seq); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void LoadMFA (FileBuffer &infile, bool stripGaps = false){ + + // check to make sure that file reading is ok + if (infile.fail()){ + cerr << "ERROR: Error reading file." << endl; + exit (1); + } + + // read all sequences + while (true){ + + // get the sequence label as being the current # of sequences + // NOTE: sequence labels here are zero-based + int index = (!sequences) ? 0 : sequences->size(); + + // read the sequence + Sequence *seq = new Sequence (infile, stripGaps); + if (seq->Fail()){ + + // check if alternative file format (i.e. not MFA) + if (index == 0){ + string header = seq->GetHeader(); + if (header.length() > 0 && header[0] != '>'){ + // try MSF format + ParseMSF (infile, header); + break; + } + } + + delete seq; + break; + } + seq->SetLabel (index); + + // add the sequence to the list of current sequences + if (!sequences) sequences = new SafeVector; + sequences->push_back (seq); + } + + // make sure at least one sequence was read + if (!sequences){ + cerr << "ERROR: No sequences read." << endl; + exit (1); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::AddSequence() + // + // Add another sequence to an existing sequence list + ///////////////////////////////////////////////////////////////// + + void AddSequence (Sequence *sequence){ + assert (sequence); + assert (!sequence->Fail()); + + // add sequence + if (!sequences) sequences = new SafeVector; + sequences->push_back (sequence); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::RemoveSequence() + // + // Remove a sequence from the MultiSequence + ///////////////////////////////////////////////////////////////// + + void RemoveSequence (int index){ + assert (sequences); + + assert (index >= 0 && index < (int) sequences->size()); + delete (*sequences)[index]; + + sequences->erase (sequences->begin() + index); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteMFA() + // + // Write MFA to the outfile. Allows the user to specify the + // number of columns for the output. Also, useIndices determines + // whether or not the actual sequence comments will be printed + // out or whether the artificially assigned sequence labels will + // be used instead. + ///////////////////////////////////////////////////////////////// + + void WriteMFA (ostream &outfile, string *ssCons = NULL, int numColumns = 60, bool useIndices = false){ + if (!sequences) return; + + // loop through all sequences and write them out + for (SafeVector::iterator iter = sequences->begin(); iter != sequences->end(); ++iter){ + (*iter)->WriteMFA (outfile, numColumns, useIndices); + } + + int count = 0; + if (ssCons != NULL) { + outfile << ">#=GC SS_cons" << endl; + int length = ssCons->length(); + for (int i = 1; i < length; i++ ) { + outfile << ssCons->at(i); + ++count; + + if (numColumns <= count) { + outfile << endl; + count = 0; + } + + } + } + outfile << endl; + } + + void WriteMFAseq (ostream &outfile, int numColumns = 60, bool useIndices = false){ + if (!sequences) return; + + // loop through all sequences and write them out + for (SafeVector::iterator iter = sequences->begin(); iter != sequences->end(); ++iter){ + (*iter)->WriteMFA (outfile, numColumns, useIndices); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetAnnotationChar() + // + // Return CLUSTALW annotation for column. + ///////////////////////////////////////////////////////////////// + + char GetAnnotationChar (SafeVector &column){ + SafeVector counts (256, 0); + int allChars = (int) column.size(); + + for (int i = 0; i < allChars; i++){ + counts[(unsigned char) toupper(column[i])]++; + } + + allChars -= counts[(unsigned char) '-']; + if (allChars == 1) return ' '; + + for (int i = 0; i < 256; i++) if ((char) i != '-' && counts[i] == allChars) return '*'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'A'] == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'K'] == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'K'] == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] == allChars) + return ':'; + + if (counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'R'] + + counts[(unsigned char) 'K'] == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + + counts[(unsigned char) 'V'] == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + + counts[(unsigned char) 'F'] == allChars) + return ':'; + + if (counts[(unsigned char) 'H'] + + counts[(unsigned char) 'Y'] == allChars) + return ':'; + + if (counts[(unsigned char) 'F'] + + counts[(unsigned char) 'Y'] + + counts[(unsigned char) 'W'] == allChars) + return ':'; + + if (counts[(unsigned char) 'C'] + + counts[(unsigned char) 'S'] + + counts[(unsigned char) 'A'] == allChars) + return '.'; + + if (counts[(unsigned char) 'A'] + + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'V'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'A'] + + counts[(unsigned char) 'G'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'N'] + + counts[(unsigned char) 'K'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'P'] + + counts[(unsigned char) 'A'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'G'] + + counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + + counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'K'] == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'K'] == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'R'] + + counts[(unsigned char) 'K'] == allChars) + return '.'; + + if (counts[(unsigned char) 'F'] + + counts[(unsigned char) 'V'] + + counts[(unsigned char) 'L'] + + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'M'] == allChars) + return '.'; + + if (counts[(unsigned char) 'H'] + + counts[(unsigned char) 'F'] + + counts[(unsigned char) 'Y'] == allChars) + return '.'; + + return ' '; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteALN() + // + // Write ALN to the outfile. Allows the user to specify the + // number of columns for the output. + ///////////////////////////////////////////////////////////////// + + void WriteALN (ostream &outfile, int numColumns = 60){ + if (!sequences) return; + +// outfile << "Multplex SCARNA version " << VERSION << " multiple sequence alignment" << endl; +// outfile << "PROBCONS version " << VERSION << " multiple sequence alignment" << endl; + outfile << "CLUSTAL W(1.83) multiple sequence alignment" << endl; +// outfile << "//" << endl; + + int longestComment = 0; + SafeVector::iterator> ptrs (GetNumSequences()); + SafeVector lengths (GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++){ + ptrs[i] = GetSequence (i)->GetDataPtr(); + lengths[i] = GetSequence (i)->GetLength(); + longestComment = max (longestComment, (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone){ + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++){ + + if (writtenChars < lengths[i]){ + outfile << GetSequence(i)->GetName(); + for (int j = 0; j < longestComment - (int) GetSequence(i)->GetName().length(); j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + if (writtenChars + j < lengths[i]) + outfile << ptrs[i][writtenChars + j + 1]; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) allDone = false; + } + } + + // write annotation line + for (int j = 0; j < longestComment; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + SafeVector column; + + for (int i = 0; i < GetNumSequences(); i++) + if (writtenChars + j < lengths[i]) + column.push_back (ptrs[i][writtenChars + j + 1]); + + if (column.size() > 0) + outfile << GetAnnotationChar (column); + } + + outfile << endl; + writtenChars += numColumns; + } + outfile << endl; + } + + //////////////////////////////////////////////////////////////// + // MultiSequence::WriteWEB(); + // + // Write ALN to the outfile. Allows the user to specify the + // number of columns for the output. + /////////////////////////////////////////////////////////////// + void WriteWEB (ostream &outfile, string *ssCons = NULL, int numColumns = 60, bool useIndices = false){ + if (!sequences) return; + + // loop through all sequences and write them out + for (SafeVector::iterator iter = sequences->begin(); iter != sequences->end(); ++iter){ + (*iter)->WriteWEB (outfile, numColumns, useIndices); + } + + // write conservation + outfile << "" << endl; + int longestComment = 0; + SafeVector::iterator> ptrs (GetNumSequences()); + SafeVector lengths (GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++){ + ptrs[i] = GetSequence (i)->GetDataPtr(); + lengths[i] = GetSequence (i)->GetLength(); + longestComment = max (longestComment, (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone){ +// outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++){ + + if (writtenChars < lengths[i]){ +// outfile << GetSequence(i)->GetName(); + for (int j = 0; j < longestComment - (int) GetSequence(i)->GetName().length(); j++) +// outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + if (writtenChars + j < lengths[i]); +// outfile << ptrs[i][writtenChars + j + 1]; + else + break; + } + +// outfile << endl; + + if (writtenChars + numColumns < lengths[i]) allDone = false; + } + } + + // write annotation line +// for (int j = 0; j < longestComment; j++) +// outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + SafeVector column; + + for (int i = 0; i < GetNumSequences(); i++) + if (writtenChars + j < lengths[i]) + column.push_back (ptrs[i][writtenChars + j + 1]); + + if (column.size() > 0) + outfile << GetAnnotationChar (column); + } + +// outfile << endl; + writtenChars += numColumns; + } + outfile << endl; + outfile << "" << endl; + + // write structure information + if (ssCons != NULL) { + outfile << "" << endl; + int length = ssCons->length(); + for (int i = 1; i < length; i++ ) { + outfile << ssCons->at(i); + } + outfile << endl; + outfile << "" << endl; + + // add coordinate information 06/09/14 + outfile << "" << endl; + + int segmentPos = 1; + for (int i = 1; i < length; i++) { + int count = 0; + + if ( ssCons->at(i) == '(' ) { + ++count; + + int j = i; + while (count != 0) { + char ch = ssCons->at(++j); + if (ch == '(') + ++count; + else if (ch == ')') + --count; + } + + outfile << "" << endl; + + } + } + } + outfile << "" << endl; + + outfile << "" << endl; + WriteMXSCARNA (outfile, ssCons); + outfile << "" << endl; + + outfile << "" << endl; + WriteALN (outfile); + outfile << "" << endl; + + outfile << "" << endl; + WriteMFA (outfile, ssCons); + outfile << "" << endl; + + outfile << "" << endl; + WriteWebSTOCKHOLM (outfile, ssCons); + outfile << "" << endl; + } + + //////////////////////////////////////////////////////////////// + // MultiSequence::WriteSTOCKHOLM(); + // + // Write STOCKHOLM to the outfile. Allows the user to specify the + // number of columns for the output. + /////////////////////////////////////////////////////////////// + void WriteSTOCKHOLM (ostream &outfile, string *ssCons = NULL, int numColumns = 60) { + if (!sequences) return; + + outfile << "# STOCKHOLM 1.0" << endl; + + int longestComment = 0; + SafeVector::iterator> ptrs (GetNumSequences()); + SafeVector lengths (GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++){ + ptrs[i] = GetSequence (i)->GetDataPtr(); + lengths[i] = GetSequence (i)->GetLength(); + longestComment = max (longestComment, (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone){ + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++){ + + if (writtenChars < lengths[i]){ + outfile << GetSequence(i)->GetName(); + for (int j = 0; j < longestComment - (int) GetSequence(i)->GetName().length(); j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + if (writtenChars + j < lengths[i]) + if (ptrs[i][writtenChars + j + 1] != '-') + outfile << ptrs[i][writtenChars + j + 1]; + else + outfile << "."; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) allDone = false; + } + } + + // write ssCons + + if (ssCons != NULL) { + outfile << "#=GC SS_cons"; + int lengthSScons = 12; + for (int j = 0; j < longestComment - lengthSScons; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + if (ssCons->at(writtenChars + j + 1) == '(') + outfile << "<"; + else if (ssCons->at(writtenChars + j + 1) == ')') + outfile << ">"; + else + outfile << "."; + if ((unsigned int)writtenChars + j + 1 >= ssCons->length() - 1) + break; + } + outfile << endl; + } + + writtenChars += numColumns; + } + outfile << "//"; + outfile << endl; + } + + //////////////////////////////////////////////////////////////// + // MultiSequence::WriteSTOCKHOLM(); + // + // Write STOCKHOLM to the outfile. Allows the user to specify the + // number of columns for the output. + /////////////////////////////////////////////////////////////// + void WriteWebSTOCKHOLM (ostream &outfile, string *ssCons = NULL, int numColumns = 60) { + if (!sequences) return; + + outfile << "# STOCKHOLM 1.0" << endl; + + int longestComment = 0; + SafeVector::iterator> ptrs (GetNumSequences()); + SafeVector lengths (GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++){ + ptrs[i] = GetSequence (i)->GetDataPtr(); + lengths[i] = GetSequence (i)->GetLength(); + longestComment = max (longestComment, (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone){ + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++){ + + if (writtenChars < lengths[i]){ + outfile << GetSequence(i)->GetName(); + for (int j = 0; j < longestComment - (int) GetSequence(i)->GetName().length(); j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + if (writtenChars + j < lengths[i]) + if (ptrs[i][writtenChars + j + 1] != '-') + outfile << ptrs[i][writtenChars + j + 1]; + else + outfile << "."; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) allDone = false; + } + } + + // write ssCons + + if (ssCons != NULL) { + outfile << "#=GC SS_cons"; + int lengthSScons = 12; + for (int j = 0; j < longestComment - lengthSScons; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + outfile << ssCons->at(writtenChars + j + 1); + + if ((unsigned int)writtenChars + j + 1 >= ssCons->length() - 1) + break; + } + outfile << endl; + } + + writtenChars += numColumns; + } + outfile << "//"; + outfile << endl; + } + + //////////////////////////////////////////////////////////////// + // MultiSequence::WriteMXSCARNA(); + // + // Write MXSCARNA to the outfile. Allows the user to specify the + // number of columns for the output. + /////////////////////////////////////////////////////////////// + void WriteMXSCARNA (ostream &outfile, string *ssCons = NULL, int numColumns = 60){ + if (!sequences) return; + + outfile << "Multplex SCARNA version " << VERSION << " multiple sequence alignment" << endl; + + int longestComment = 0; + SafeVector::iterator> ptrs (GetNumSequences()); + SafeVector lengths (GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++){ + ptrs[i] = GetSequence (i)->GetDataPtr(); + lengths[i] = GetSequence (i)->GetLength(); + longestComment = max (longestComment, (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone){ + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++){ + + if (writtenChars < lengths[i]){ + outfile << GetSequence(i)->GetName(); + for (int j = 0; j < longestComment - (int) GetSequence(i)->GetName().length(); j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + if (writtenChars + j < lengths[i]) + outfile << ptrs[i][writtenChars + j + 1]; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) allDone = false; + } + } + + // write ssCons + if (ssCons != NULL) { + outfile << "ss_cons"; + int lengthSScons = 7; + for (int j = 0; j < longestComment - lengthSScons; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + outfile << ssCons->at(writtenChars + j + 1); + if ((unsigned int)writtenChars + j + 1 >= ssCons->length() - 1) + break; + } + outfile << endl; + } + + // write annotation line + for (int j = 0; j < longestComment; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++){ + SafeVector column; + + for (int i = 0; i < GetNumSequences(); i++) + if (writtenChars + j < lengths[i]) + column.push_back (ptrs[i][writtenChars + j + 1]); + + if (column.size() > 0) + outfile << GetAnnotationChar (column); + } + + outfile << endl; + writtenChars += numColumns; + } + outfile << endl; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object. + ///////////////////////////////////////////////////////////////// + + Sequence* GetSequence (int i){ + assert (sequences); + assert (0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object + // (const version). + ///////////////////////////////////////////////////////////////// + + const Sequence* GetSequence (int i) const { + assert (sequences); + assert (0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetNumSequences() + // + // Returns the number of sequences in the MultiSequence. + ///////////////////////////////////////////////////////////////// + + int GetNumSequences () const { + if (!sequences) return 0; + return (int) sequences->size(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByHeader() + // + // Organizes the sequences according to their sequence headers + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByHeader () { + assert (sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size()-1; i++){ + for (int j = i+1; j < (int) sequences->size(); j++){ + if ((*sequences)[i]->GetHeader() > (*sequences)[j]->GetHeader()) + swap ((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByLabel() + // + // Organizes the sequences according to their sequence labels + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByLabel () { + assert (sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size()-1; i++){ + for (int j = i+1; j < (int) sequences->size(); j++){ + if ((*sequences)[i]->GetSortLabel() > (*sequences)[j]->GetSortLabel()) + swap ((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SaveOrdering() + // + // Relabels sequences so as to preserve the current ordering. + ///////////////////////////////////////////////////////////////// + + void SaveOrdering () { + assert (sequences); + + for (int i = 0; i < (int) sequences->size(); i++) + (*sequences)[i]->SetSortLabel (i); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::Project() + // + // Given a set of indices, extract all sequences from the current + // MultiSequence object whose index is included in the set. + // Then, project the multiple alignments down to the desired + // subset, and return the projection as a new MultiSequence + // object. + ///////////////////////////////////////////////////////////////// + + MultiSequence *Project (const set &indices){ + SafeVector::iterator> oldPtrs (indices.size()); + SafeVector *> newPtrs (indices.size()); + + assert (indices.size() != 0); + + // grab old data + int i = 0; + for (set::const_iterator iter = indices.begin(); iter != indices.end(); ++iter){ + oldPtrs[i++] = GetSequence (*iter)->GetDataPtr(); + } + + // compute new length + int oldLength = GetSequence (*indices.begin())->GetLength(); + int newLength = 0; + for (i = 1; i <= oldLength; i++){ + + // check to see if there is a gap in every sequence of the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then this column counts towards the sequence length + if (found) newLength++; + } + + // build new alignments + for (i = 0; i < (int) indices.size(); i++){ + newPtrs[i] = new SafeVector(); assert (newPtrs[i]); + newPtrs[i]->push_back ('@'); + } + + // add all needed columns + for (i = 1; i <= oldLength; i++){ + + // make sure column is not gapped in all sequences in the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then add it + if (found){ + for (int j = 0; j < (int) indices.size(); j++) + newPtrs[j]->push_back (oldPtrs[j][i]); + } + } + + // wrap sequences in MultiSequence object + MultiSequence *ret = new MultiSequence(); + i = 0; + for (set::const_iterator iter = indices.begin(); iter != indices.end(); ++iter){ + ret->AddSequence (new Sequence (newPtrs[i++], GetSequence (*iter)->GetHeader(), newLength, + GetSequence (*iter)->GetSortLabel(), GetSequence (*iter)->GetLabel())); + } + + return ret; + } +}; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProbabilisticModel.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProbabilisticModel.h new file mode 100644 index 0000000000..cd9dae9dd7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProbabilisticModel.h @@ -0,0 +1,1211 @@ +///////////////////////////////////////////////////////////////// +// ProbabilisticModel.h +// +// Routines for (1) posterior probability computations +// (2) chained anchoring +// (3) maximum weight trace alignment +///////////////////////////////////////////////////////////////// + +#ifndef PROBABILISTICMODEL_H +#define PROBABILISTICMODEL_H + +#include +#include +#include +#include "SafeVector.h" +#include "ScoreType.h" +#include "SparseMatrix.h" +#include "MultiSequence.h" +#include "StemCandidate.hpp" +#include "scarna.hpp" +#include "nrutil.h" +#include + +using namespace std; + +const int NumMatchStates = 1; // note that in this version the number + // of match states is fixed at 1...will + // change in future versions +const int NumMatrixTypes = NumMatchStates + NumInsertStates * 2; + +///////////////////////////////////////////////////////////////// +// ProbabilisticModel +// +// Class for storing the parameters of a probabilistic model and +// performing different computations based on those parameters. +// In particular, this class handles the computation of +// posterior probabilities that may be used in alignment. +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +class ProbabilisticModel { + + float initialDistribution[NumMatrixTypes]; // holds the initial probabilities for each state + float transProb[NumMatrixTypes][NumMatrixTypes]; // holds all state-to-state transition probabilities + float matchProb[256][256]; // emission probabilities for match states + float insProb[256][NumMatrixTypes]; // emission probabilities for insert states + NRMat WM; + + public: + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ProbabilisticModel() + // + // Constructor. Builds a new probabilistic model using the + // given parameters. + ///////////////////////////////////////////////////////////////// + + ProbabilisticModel (const VF &initDistribMat, const VF &gapOpen, const VF &gapExtend, + const VVF &emitPairs, const VF &emitSingle){ + + // build transition matrix + VVF transMat (NumMatrixTypes, VF (NumMatrixTypes, 0.0f)); + transMat[0][0] = 1; + for (int i = 0; i < NumInsertStates; i++){ + transMat[0][2*i+1] = gapOpen[2*i]; + transMat[0][2*i+2] = gapOpen[2*i+1]; + transMat[0][0] -= (gapOpen[2*i] + gapOpen[2*i+1]); + assert (transMat[0][0] > 0); + transMat[2*i+1][2*i+1] = gapExtend[2*i]; + transMat[2*i+2][2*i+2] = gapExtend[2*i+1]; + transMat[2*i+1][2*i+2] = 0; + transMat[2*i+2][2*i+1] = 0; + transMat[2*i+1][0] = 1 - gapExtend[2*i]; + transMat[2*i+2][0] = 1 - gapExtend[2*i+1]; + } + + // create initial and transition probability matrices + for (int i = 0; i < NumMatrixTypes; i++){ + initialDistribution[i] = LOG (initDistribMat[i]); + for (int j = 0; j < NumMatrixTypes; j++) + transProb[i][j] = LOG (transMat[i][j]); + } + + // create insertion and match probability matrices + for (int i = 0; i < 256; i++){ + for (int j = 0; j < NumMatrixTypes; j++) + insProb[i][j] = LOG (emitSingle[i]); + for (int j = 0; j < 256; j++) + matchProb[i][j] = LOG (emitPairs[i][j]); + } + } + + NRMat weightMatchScore(std::vector *pscs1, std::vector *pscs2, + std::vector *matchPSCS1, std::vector *matchPSCS2, NRMat WM) { + int len = WORDLENGTH; + int size = matchPSCS1->size(); + float weight = 1000; + + for(int iter = 0; iter < size; iter++) { + int i = matchPSCS1->at(iter); + int j = matchPSCS2->at(iter); + + const StemCandidate &sc1 = pscs1->at(i); + const StemCandidate &sc2 = pscs2->at(j); + + for(int k = 0; k < len; k++) { + WM[sc1.GetPosition() + k][sc2.GetPosition() + k] += weight; +// sumWeight += weight; + } + } + return WM; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeForwardMatrix() + // + // Computes a set of forward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // forward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of aligning through j characters + // of the first sequence, k characters of the second sequence, + // and ending in state i. + ///////////////////////////////////////////////////////////////// + + VF *ComputeForwardMatrix (Sequence *seq1, Sequence *seq2) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *forwardPtr = new VF (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (forwardPtr); + VF &forward = *forwardPtr; + + // initialization condition + forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] = + initialDistribution[0] + matchProb[(unsigned char) iter1[1]][(unsigned char) iter2[1]]; + + for (int k = 0; k < NumInsertStates; k++){ + forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] = + initialDistribution[2*k+1] + insProb[(unsigned char) iter1[1]][k]; + forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] = + initialDistribution[2*k+2] + insProb[(unsigned char) iter2[1]][k]; + } + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute forward scores + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 1 || j > 1){ + if (i > 0 && j > 0){ + forward[0 + ij] = forward[0 + i1j1] + transProb[0][0]; + for (int k = 1; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (forward[0 + ij], forward[k + i1j1] + transProb[k][0]); + forward[0 + ij] += matchProb[c1][c2]; + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++) + forward[2*k+1 + ij] = insProb[c1][k] + + LOG_ADD (forward[0 + i1j] + transProb[0][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1]); + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++) + forward[2*k+2 + ij] = insProb[c2][k] + + LOG_ADD (forward[0 + ij1] + transProb[0][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2]); + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + return forwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeBackwardMatrix() + // + // Computes a set of backward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // backward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of starting in state i and + // aligning from character j+1 to the end of the first + // sequence and from character k+1 to the end of the second + // sequence. + ///////////////////////////////////////////////////////////////// + + VF *ComputeBackwardMatrix (Sequence *seq1, Sequence *seq2) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *backwardPtr = new VF (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (backwardPtr); + VF &backward = *backwardPtr; + + // initialization condition + for (int k = 0; k < NumMatrixTypes; k++) + backward[NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1) + k] = initialDistribution[k]; + + // remember offset for each index combination + int ij = (seq1Length+1) * (seq2Length+1) - 1; + int i1j = ij + seq2Length + 1; + int ij1 = ij + 1; + int i1j1 = ij + seq2Length + 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute backward scores + for (int i = seq1Length; i >= 0; i--){ + unsigned char c1 = (i == seq1Length) ? '~' : (unsigned char) iter1[i+1]; + for (int j = seq2Length; j >= 0; j--){ + unsigned char c2 = (j == seq2Length) ? '~' : (unsigned char) iter2[j+1]; + + if (i < seq1Length && j < seq2Length){ + const float ProbXY = backward[0 + i1j1] + matchProb[c1][c2]; + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (backward[k + ij], ProbXY + transProb[k][0]); + } + if (i < seq1Length){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (backward[0 + ij], backward[2*k+1 + i1j] + insProb[c1][k] + transProb[0][2*k+1]); + LOG_PLUS_EQUALS (backward[2*k+1 + ij], backward[2*k+1 + i1j] + insProb[c1][k] + transProb[2*k+1][2*k+1]); + } + } + if (j < seq2Length){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (backward[0 + ij], backward[2*k+2 + ij1] + insProb[c2][k] + transProb[0][2*k+2]); + LOG_PLUS_EQUALS (backward[2*k+2 + ij], backward[2*k+2 + ij1] + insProb[c2][k] + transProb[2*k+2][2*k+2]); + } + } + + ij -= NumMatrixTypes; + i1j -= NumMatrixTypes; + ij1 -= NumMatrixTypes; + i1j1 -= NumMatrixTypes; + } + } + + return backwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeTotalProbability() + // + // Computes the total probability of an alignment given + // the forward and backward matrices. + ///////////////////////////////////////////////////////////////// + + float ComputeTotalProbability (int seq1Length, int seq2Length, + const VF &forward, const VF &backward) const { + + // compute total probability + float totalForwardProb = LOG_ZERO; + float totalBackwardProb = LOG_ZERO; + for (int k = 0; k < NumMatrixTypes; k++){ + LOG_PLUS_EQUALS (totalForwardProb, + forward[k + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[k + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + } + + totalBackwardProb = + forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] + + backward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)]; + + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (totalBackwardProb, + forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] + + backward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)]); + LOG_PLUS_EQUALS (totalBackwardProb, + forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] + + backward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)]); + } + + // cerr << totalForwardProb << " " << totalBackwardProb << endl; + + return (totalForwardProb + totalBackwardProb) / 2; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputePosteriorMatrix() + // + // Computes the posterior probability matrix based on + // the forward and backward matrices. + ///////////////////////////////////////////////////////////////// + + VF *ComputePosteriorMatrix (Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + float totalProb = ComputeTotalProbability (seq1Length, seq2Length, + forward, backward); + + // compute posterior matrices + VF *posteriorPtr = new VF((seq1Length+1) * (seq2Length+1)); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + int ij = 0; + VF::iterator ptr = posterior.begin(); + + for (int i = 0; i <= seq1Length; i++){ + for (int j = 0; j <= seq2Length; j++){ + *(ptr++) = EXP (min (LOG_ONE, forward[ij] + backward[ij] - totalProb)); + ij += NumMatrixTypes; + } + } + + posterior[0] = 0; + + return posteriorPtr; + } + + /* + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeExpectedCounts() + // + // Computes the expected counts for the various transitions. + ///////////////////////////////////////////////////////////////// + + VVF *ComputeExpectedCounts () const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability (seq1Length, seq2Length, + forward, backward); + + // initialize expected counts + VVF *countsPtr = new VVF(NumMatrixTypes + 1, VF(NumMatrixTypes, LOG_ZERO)); assert (countsPtr); + VVF &counts = *countsPtr; + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute expected counts + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0){ + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (counts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (counts[2*k+1][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (counts[2*k+2][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++) + for (int j = 0; j < NumMatrixTypes; j++) + counts[i][j] -= totalProb; + + } + */ + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeNewParameters() + // + // Computes a new parameter set based on the expected counts + // given. + ///////////////////////////////////////////////////////////////// + + void ComputeNewParameters (Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward, + VF &initDistribMat, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle, bool enableTrainEmissions) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability (seq1Length, seq2Length, + forward, backward); + + // initialize expected counts + VVF transCounts (NumMatrixTypes, VF (NumMatrixTypes, LOG_ZERO)); + VF initCounts (NumMatrixTypes, LOG_ZERO); + VVF pairCounts (256, VF (256, LOG_ZERO)); + VF singleCounts (256, LOG_ZERO); + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute initial distribution posteriors + initCounts[0] = LOG_ADD (forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] + + backward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)], + forward[0 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[0 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + for (int k = 0; k < NumInsertStates; k++){ + initCounts[2*k+1] = LOG_ADD (forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] + + backward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)], + forward[2*k+1 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[2*k+1 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + initCounts[2*k+2] = LOG_ADD (forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] + + backward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)], + forward[2*k+2 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[2*k+2 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + } + + // compute expected counts + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) toupper(iter1[i]); + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) toupper(iter2[j]); + + if (i > 0 && j > 0){ + if (enableTrainEmissions && i == 1 && j == 1){ + LOG_PLUS_EQUALS (pairCounts[c1][c2], + initialDistribution[0] + matchProb[c1][c2] + backward[0 + ij]); + LOG_PLUS_EQUALS (pairCounts[c2][c1], + initialDistribution[0] + matchProb[c2][c1] + backward[0 + ij]); + } + + for (int k = 0; k < NumMatrixTypes; k++){ + LOG_PLUS_EQUALS (transCounts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + if (enableTrainEmissions && i != 1 || j != 1){ + LOG_PLUS_EQUALS (pairCounts[c1][c2], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + LOG_PLUS_EQUALS (pairCounts[c2][c1], + forward[k + i1j1] + transProb[k][0] + + matchProb[c2][c1] + backward[0 + ij]); + } + } + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (transCounts[0][2*k+1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (transCounts[2*k+1][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + if (enableTrainEmissions){ + if (i == 1 && j == 0){ + LOG_PLUS_EQUALS (singleCounts[c1], + initialDistribution[2*k+1] + insProb[c1][k] + backward[2*k+1 + ij]); + } + else { + LOG_PLUS_EQUALS (singleCounts[c1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (singleCounts[c1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + } + } + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (transCounts[0][2*k+2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (transCounts[2*k+2][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + if (enableTrainEmissions){ + if (i == 0 && j == 1){ + LOG_PLUS_EQUALS (singleCounts[c2], + initialDistribution[2*k+2] + insProb[c2][k] + backward[2*k+2 + ij]); + } + else { + LOG_PLUS_EQUALS (singleCounts[c2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (singleCounts[c2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + } + } + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++){ + initCounts[i] -= totalProb; + for (int j = 0; j < NumMatrixTypes; j++) + transCounts[i][j] -= totalProb; + } + if (enableTrainEmissions){ + for (int i = 0; i < 256; i++){ + for (int j = 0; j < 256; j++) + pairCounts[i][j] -= totalProb; + singleCounts[i] -= totalProb; + } + } + + // compute new initial distribution + float totalInitDistribCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + totalInitDistribCounts += exp (initCounts[i]); // should be 2 + initDistribMat[0] = min (1.0f, max (0.0f, (float) exp (initCounts[0]) / totalInitDistribCounts)); + for (int k = 0; k < NumInsertStates; k++){ + float val = (exp (initCounts[2*k+1]) + exp (initCounts[2*k+2])) / 2; + initDistribMat[2*k+1] = initDistribMat[2*k+2] = min (1.0f, max (0.0f, val / totalInitDistribCounts)); + } + + // compute total counts for match state + float inMatchStateCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + inMatchStateCounts += exp (transCounts[0][i]); + for (int i = 0; i < NumInsertStates; i++){ + + // compute total counts for gap state + float inGapStateCounts = + exp (transCounts[2*i+1][0]) + + exp (transCounts[2*i+1][2*i+1]) + + exp (transCounts[2*i+2][0]) + + exp (transCounts[2*i+2][2*i+2]); + + gapOpen[2*i] = gapOpen[2*i+1] = + (exp (transCounts[0][2*i+1]) + + exp (transCounts[0][2*i+2])) / + (2 * inMatchStateCounts); + + gapExtend[2*i] = gapExtend[2*i+1] = + (exp (transCounts[2*i+1][2*i+1]) + + exp (transCounts[2*i+2][2*i+2])) / + inGapStateCounts; + } + + if (enableTrainEmissions){ + float totalPairCounts = 0; + float totalSingleCounts = 0; + for (int i = 0; i < 256; i++){ + for (int j = 0; j <= i; j++) + totalPairCounts += exp (pairCounts[j][i]); + totalSingleCounts += exp (singleCounts[i]); + } + + for (int i = 0; i < 256; i++) if (!islower ((char) i)){ + int li = (int)((unsigned char) tolower ((char) i)); + for (int j = 0; j <= i; j++) if (!islower ((char) j)){ + int lj = (int)((unsigned char) tolower ((char) j)); + emitPairs[i][j] = emitPairs[i][lj] = emitPairs[li][j] = emitPairs[li][lj] = + emitPairs[j][i] = emitPairs[j][li] = emitPairs[lj][i] = emitPairs[lj][li] = exp(pairCounts[j][i]) / totalPairCounts; + } + emitSingle[i] = emitSingle[li] = exp(singleCounts[i]) / totalSingleCounts; + } + } + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignment() + // + // Computes an alignment based on the given posterior matrix. + // This is done by finding the maximum summing path (or + // maximum weight trace) through the posterior matrix. The + // final alignment is returned as a pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float indicating the sum achieved + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignment (int seq1Length, int seq2Length, const VF &posterior) const { + + float *twoRows = new float[(seq2Length+1)*2]; assert (twoRows); + float *oldRow = twoRows; + float *newRow = twoRows + seq2Length + 1; + + char *tracebackMatrix = new char[(seq1Length+1)*(seq2Length+1)]; assert (tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++){ + oldRow[i] = 0; + *(tracebackPtr++) = 'L'; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++){ + + // initialize left column + newRow[0] = 0; + posteriorPtr++; + *(tracebackPtr++) = 'U'; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++){ + ChooseBestOfThree (*(posteriorPtr++) + oldRow[j-1], newRow[j-1], oldRow[j], + 'D', 'L', 'U', &newRow[j], tracebackPtr++); // Match, insert, delete + } + + // swap rows + float *temp = oldRow; + oldRow = newRow; + newRow = temp; + } + + // store best score + float total = oldRow[seq2Length]; + delete [] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + char ch = tracebackMatrix[r*(seq2Length+1) + c]; + switch (ch){ + case 'L': c--; alignment->push_back ('Y'); break; + case 'U': r--; alignment->push_back ('X'); break; + case 'D': c--; r--; alignment->push_back ('B'); break; + default: assert (false); + } + } + + delete [] tracebackMatrix; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, total); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignment2() + // + // Computes an alignment based on the given posterior matrix. + // This is done by finding the maximum summing path (or + // maximum weight trace) through the posterior matrix. The + // final alignment is returned as a pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float indicating the sum achieved + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignment2 (int seq1Length, int seq2Length, + const VF &posterior, std::vector *pscs1, std::vector *pscs2, + std::vector *matchPSCS1, std::vector *matchPSCS2) const { + NRMat WM(seq1Length + 1, seq2Length + 1); + for (int i = 0; i <= seq1Length; i++) { + for (int j = 0; j <= seq2Length; j++) { + WM[i][j] = 0; + } + } + + int len = WORDLENGTH; + int size = matchPSCS1->size(); + float weight = 1000; + + for(int iter = 0; iter < size; iter++) { + int i = matchPSCS1->at(iter); + int j = matchPSCS2->at(iter); + + const StemCandidate &sc1 = pscs1->at(i); + const StemCandidate &sc2 = pscs2->at(j); + for(int k = 0; k < len; k++) { + WM[sc1.GetPosition() + k][sc2.GetPosition() + k] += weight; + } + } + float *twoRows = new float[(seq2Length+1)*2]; assert (twoRows); + float *oldRow = twoRows; + float *newRow = twoRows + seq2Length + 1; + + char *tracebackMatrix = new char[(seq1Length+1)*(seq2Length+1)]; assert (tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++){ + oldRow[i] = 0; + *(tracebackPtr++) = 'L'; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++){ + + // initialize left column + newRow[0] = 0; + posteriorPtr++; + *(tracebackPtr++) = 'U'; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++){ + ChooseBestOfThree (*(posteriorPtr++) + oldRow[j-1] + WM[i][j], newRow[j-1], oldRow[j], + 'D', 'L', 'U', &newRow[j], tracebackPtr++); + } + + // swap rows + float *temp = oldRow; + oldRow = newRow; + newRow = temp; + } + + // store best score + float total = oldRow[seq2Length]; + delete [] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + char ch = tracebackMatrix[r*(seq2Length+1) + c]; + switch (ch){ + case 'L': c--; alignment->push_back ('Y'); break; + case 'U': r--; alignment->push_back ('X'); break; + case 'D': c--; r--; alignment->push_back ('B'); break; + default: assert (false); + } + } + + delete [] tracebackMatrix; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, total); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignmentWithGapPenalties() + // + // Similar to ComputeAlignment() except with gap penalties. + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignmentWithGapPenalties (MultiSequence *align1, + MultiSequence *align2, + const VF &posterior, int numSeqs1, + int numSeqs2, + float gapOpenPenalty, + float gapContinuePenalty) const { + int seq1Length = align1->GetSequence(0)->GetLength(); + int seq2Length = align2->GetSequence(0)->GetLength(); + SafeVector::iterator > dataPtrs1 (align1->GetNumSequences()); + SafeVector::iterator > dataPtrs2 (align2->GetNumSequences()); + + // grab character data + for (int i = 0; i < align1->GetNumSequences(); i++) + dataPtrs1[i] = align1->GetSequence(i)->GetDataPtr(); + for (int i = 0; i < align2->GetNumSequences(); i++) + dataPtrs2[i] = align2->GetSequence(i)->GetDataPtr(); + + // the number of active sequences at any given column is defined to be the + // number of non-gap characters in that column; the number of gap opens at + // any given column is defined to be the number of gap characters in that + // column where the previous character in the respective sequence was not + // a gap + SafeVector numActive1 (seq1Length+1), numGapOpens1 (seq1Length+1); + SafeVector numActive2 (seq2Length+1), numGapOpens2 (seq2Length+1); + + // compute number of active sequences and gap opens for each group + for (int i = 0; i < align1->GetNumSequences(); i++){ + SafeVector::iterator dataPtr = align1->GetSequence(i)->GetDataPtr(); + numActive1[0] = numGapOpens1[0] = 0; + for (int j = 1; j <= seq1Length; j++){ + if (dataPtr[j] != '-'){ + numActive1[j]++; + numGapOpens1[j] += (j != 1 && dataPtr[j-1] != '-'); + } + } + } + for (int i = 0; i < align2->GetNumSequences(); i++){ + SafeVector::iterator dataPtr = align2->GetSequence(i)->GetDataPtr(); + numActive2[0] = numGapOpens2[0] = 0; + for (int j = 1; j <= seq2Length; j++){ + if (dataPtr[j] != '-'){ + numActive2[j]++; + numGapOpens2[j] += (j != 1 && dataPtr[j-1] != '-'); + } + } + } + + VVF openingPenalty1 (numSeqs1+1, VF (numSeqs2+1)); + VF continuingPenalty1 (numSeqs1+1); + VVF openingPenalty2 (numSeqs1+1, VF (numSeqs2+1)); + VF continuingPenalty2 (numSeqs2+1); + + // precompute penalties + for (int i = 0; i <= numSeqs1; i++) + for (int j = 0; j <= numSeqs2; j++) + openingPenalty1[i][j] = i * (gapOpenPenalty * j + gapContinuePenalty * (numSeqs2 - j)); + for (int i = 0; i <= numSeqs1; i++) + continuingPenalty1[i] = i * gapContinuePenalty * numSeqs2; + for (int i = 0; i <= numSeqs2; i++) + for (int j = 0; j <= numSeqs1; j++) + openingPenalty2[i][j] = i * (gapOpenPenalty * j + gapContinuePenalty * (numSeqs1 - j)); + for (int i = 0; i <= numSeqs2; i++) + continuingPenalty2[i] = i * gapContinuePenalty * numSeqs1; + + float *twoRows = new float[6*(seq2Length+1)]; assert (twoRows); + float *oldRowMatch = twoRows; + float *newRowMatch = twoRows + (seq2Length+1); + float *oldRowInsertX = twoRows + 2*(seq2Length+1); + float *newRowInsertX = twoRows + 3*(seq2Length+1); + float *oldRowInsertY = twoRows + 4*(seq2Length+1); + float *newRowInsertY = twoRows + 5*(seq2Length+1); + + char *tracebackMatrix = new char[3*(seq1Length+1)*(seq2Length+1)]; assert (tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++){ + oldRowMatch[i] = oldRowInsertX[i] = (i == 0) ? 0 : LOG_ZERO; + oldRowInsertY[i] = (i == 0) ? 0 : oldRowInsertY[i-1] + continuingPenalty2[numActive2[i]]; + *(tracebackPtr) = *(tracebackPtr+1) = *(tracebackPtr+2) = 'Y'; + tracebackPtr += 3; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++){ + + // initialize left column + newRowMatch[0] = newRowInsertY[0] = LOG_ZERO; + newRowInsertX[0] = oldRowInsertX[0] + continuingPenalty1[numActive1[i]]; + posteriorPtr++; + *(tracebackPtr) = *(tracebackPtr+1) = *(tracebackPtr+2) = 'X'; + tracebackPtr += 3; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++){ + + // going to MATCH state + ChooseBestOfThree (oldRowMatch[j-1], + oldRowInsertX[j-1], + oldRowInsertY[j-1], + 'M', 'X', 'Y', &newRowMatch[j], tracebackPtr++); + newRowMatch[j] += *(posteriorPtr++); + + // going to INSERT X state + ChooseBestOfThree (oldRowMatch[j] + openingPenalty1[numActive1[i]][numGapOpens2[j]], + oldRowInsertX[j] + continuingPenalty1[numActive1[i]], + oldRowInsertY[j] + openingPenalty1[numActive1[i]][numGapOpens2[j]], + 'M', 'X', 'Y', &newRowInsertX[j], tracebackPtr++); + + // going to INSERT Y state + ChooseBestOfThree (newRowMatch[j-1] + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertX[j-1] + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertY[j-1] + continuingPenalty2[numActive2[j]], + 'M', 'X', 'Y', &newRowInsertY[j], tracebackPtr++); + } + + // swap rows + float *temp; + temp = oldRowMatch; oldRowMatch = newRowMatch; newRowMatch = temp; + temp = oldRowInsertX; oldRowInsertX = newRowInsertX; newRowInsertX = temp; + temp = oldRowInsertY; oldRowInsertY = newRowInsertY; newRowInsertY = temp; + } + + // store best score + float total; + char matrix; + ChooseBestOfThree (oldRowMatch[seq2Length], oldRowInsertX[seq2Length], oldRowInsertY[seq2Length], + 'M', 'X', 'Y', &total, &matrix); + + delete [] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + + int offset = (matrix == 'M') ? 0 : (matrix == 'X') ? 1 : 2; + char ch = tracebackMatrix[(r*(seq2Length+1) + c) * 3 + offset]; + switch (matrix){ + case 'Y': c--; alignment->push_back ('Y'); break; + case 'X': r--; alignment->push_back ('X'); break; + case 'M': c--; r--; alignment->push_back ('B'); break; + default: assert (false); + } + matrix = ch; + } + + delete [] tracebackMatrix; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, 1.0f); + } + + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeViterbiAlignment() + // + // Computes the highest probability pairwise alignment using the + // probabilistic model. The final alignment is returned as a + // pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float containing the log probability of the best + // alignment (not used) + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeViterbiAlignment (Sequence *seq1, Sequence *seq2) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create viterbi matrix + VF *viterbiPtr = new VF (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (viterbiPtr); + VF &viterbi = *viterbiPtr; + + // create traceback matrix + VI *tracebackPtr = new VI (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), -1); + assert (tracebackPtr); + VI &traceback = *tracebackPtr; + + // initialization condition + for (int k = 0; k < NumMatrixTypes; k++) + viterbi[k] = initialDistribution[k]; + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute viterbi scores + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0){ + for (int k = 0; k < NumMatrixTypes; k++){ + float newVal = viterbi[k + i1j1] + transProb[k][0] + matchProb[c1][c2]; + if (viterbi[0 + ij] < newVal){ + viterbi[0 + ij] = newVal; + traceback[0 + ij] = k; + } + } + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + float valFromMatch = insProb[c1][k] + viterbi[0 + i1j] + transProb[0][2*k+1]; + float valFromIns = insProb[c1][k] + viterbi[2*k+1 + i1j] + transProb[2*k+1][2*k+1]; + if (valFromMatch >= valFromIns){ + viterbi[2*k+1 + ij] = valFromMatch; + traceback[2*k+1 + ij] = 0; + } + else { + viterbi[2*k+1 + ij] = valFromIns; + traceback[2*k+1 + ij] = 2*k+1; + } + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + float valFromMatch = insProb[c2][k] + viterbi[0 + ij1] + transProb[0][2*k+2]; + float valFromIns = insProb[c2][k] + viterbi[2*k+2 + ij1] + transProb[2*k+2][2*k+2]; + if (valFromMatch >= valFromIns){ + viterbi[2*k+2 + ij] = valFromMatch; + traceback[2*k+2 + ij] = 0; + } + else { + viterbi[2*k+2 + ij] = valFromIns; + traceback[2*k+2 + ij] = 2*k+2; + } + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // figure out best terminating cell + float bestProb = LOG_ZERO; + int state = -1; + for (int k = 0; k < NumMatrixTypes; k++){ + float thisProb = viterbi[k + NumMatrixTypes * ((seq1Length+1)*(seq2Length+1) - 1)] + initialDistribution[k]; + if (bestProb < thisProb){ + bestProb = thisProb; + state = k; + } + } + assert (state != -1); + + delete viterbiPtr; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + int newState = traceback[state + NumMatrixTypes * (r * (seq2Length+1) + c)]; + + if (state == 0){ c--; r--; alignment->push_back ('B'); } + else if (state % 2 == 1){ r--; alignment->push_back ('X'); } + else { c--; alignment->push_back ('Y'); } + + state = newState; + } + + delete tracebackPtr; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, bestProb); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::BuildPosterior() + // + // Builds a posterior probability matrix needed to align a pair + // of alignments. Mathematically, the returned matrix M is + // defined as follows: + // M[i,j] = sum sum f(s,t,i,j) + // s in align1 t in align2 + // where + // [ P(s[i'] <--> t[j']) + // [ if s[i'] is a letter in the ith column of align1 and + // [ t[j'] it a letter in the jth column of align2 + // f(s,t,i,j) = [ + // [ 0 otherwise + // + ///////////////////////////////////////////////////////////////// + + VF *BuildPosterior (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + float cutoff = 0.0f) const { + const int seq1Length = align1->GetSequence(0)->GetLength(); + const int seq2Length = align2->GetSequence(0)->GetLength(); + + VF *posteriorPtr = new VF((seq1Length+1) * (seq2Length+1), 0); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + VF::iterator postPtr = posterior.begin(); + + // for each s in align1 + for (int i = 0; i < align1->GetNumSequences(); i++){ + int first = align1->GetSequence(i)->GetLabel(); + SafeVector *mapping1 = align1->GetSequence(i)->GetMapping(); + + // for each t in align2 + for (int j = 0; j < align2->GetNumSequences(); j++){ + int second = align2->GetSequence(j)->GetLabel(); + SafeVector *mapping2 = align2->GetSequence(j)->GetMapping(); + if (first < second){ + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[first][second]; + + for (int ii = 1; ii <= matrix->GetSeq1Length(); ii++){ + SafeVector::iterator row = matrix->GetRowPtr(ii); + int base = (*mapping1)[ii] * (seq2Length+1); + int rowSize = matrix->GetRowSize(ii); + // add in all relevant values + for (int jj = 0; jj < rowSize; jj++) + posterior[base + (*mapping2)[row[jj].first]] += row[jj].second; + + // subtract cutoff + for (int jj = 0; jj < matrix->GetSeq2Length(); jj++) { + posterior[base + (*mapping2)[jj]] -= cutoff; + } + + } + + } else { + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[second][first]; + + for (int jj = 1; jj <= matrix->GetSeq1Length(); jj++){ + SafeVector::iterator row = matrix->GetRowPtr(jj); + int base = (*mapping2)[jj]; + int rowSize = matrix->GetRowSize(jj); + + // add in all relevant values + for (int ii = 0; ii < rowSize; ii++) + posterior[base + (*mapping1)[row[ii].first] * (seq2Length + 1)] += row[ii].second; + + // subtract cutoff + for (int ii = 0; ii < matrix->GetSeq2Length(); ii++) + posterior[base + (*mapping1)[ii] * (seq2Length + 1)] -= cutoff; + } + + } + + + delete mapping2; + } + + delete mapping1; + } + + return posteriorPtr; + } +}; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProjectPairwise.cc b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProjectPairwise.cc new file mode 100644 index 0000000000..4696ba1e1a --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ProjectPairwise.cc @@ -0,0 +1,71 @@ +///////////////////////////////////////////////////////////////// +// ProjectPairwise +// +// Program for projecting multiple alignments to all pairwise +// alignments. +///////////////////////////////////////////////////////////////// + +#include "SafeVector.h" +#include "MultiSequence.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +bool compressGaps = true; + +///////////////////////////////////////////////////////////////// +// main() +// +// Main program. +///////////////////////////////////////////////////////////////// + +int main (int argc, char **argv){ + + // check arguments + if (argc < 2){ + cerr << "Usage: project ALIGNMENT [-nocompressgaps]" << endl; + exit (1); + } + + for (int i = 2; i < argc; i++){ + if (strcmp (argv[i], "-nocompressgaps") == 0) + compressGaps = false; + else { + cerr << "Unrecognized option: " << argv[i] << endl; + exit (1); + } + } + + MultiSequence *align = new MultiSequence (string (argv[1])); assert (align); + + int N = align->GetNumSequences(); + for (int i = 0; i < N; i++){ + for (int j = i+1; j < N; j++){ + string name = align->GetSequence(i)->GetHeader() + "-" + align->GetSequence(j)->GetHeader() + ".fasta"; + ofstream outfile (name.c_str()); + + if (compressGaps){ + set s; + s.insert (i); s.insert (j); + MultiSequence *proj = align->Project (s); + proj->WriteMFA (outfile); + delete proj; + } + else { + align->GetSequence(i)->WriteMFA (outfile, 60); + align->GetSequence(j)->WriteMFA (outfile, 60); + } + outfile.close(); + } + } + + delete align; +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/README b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/README new file mode 100644 index 0000000000..57087e17af --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/README @@ -0,0 +1,107 @@ + + PROBCONS + ~~~~~~~~ + + Probabilistic consistency-based multiple sequence alignment + +----------------------------------------------------------------- + +PROBCONS is a novel tool for generating multiple alignments +of protein sequences. Using a combination of probabilistic +modeling and consistency-based alignment techniques, PROBCONS +has achieved the highest accuracy of all alignment methods to +date. + +PROBCONS was developed by Chuong B. Do in collaboration with +Michael Brudno in the research group of Serafim Batzoglou, +Department of Computer Science, Stanford University. + +For more information on the algorithms, please see + + Do, C.B., Brudno, M., and Batzoglou, S. (2004) PROBCONS: + Probabilistic Consistency-based Multiple Alignment of + Amino Acid Sequences. 12th International Conference on + Intelligent Systems for Molecular Biology. In press. + +and + + Do, C.B., Brudno, M., and Batzoglou, S. (2004) PROBCONS: + Probabilistic Consistency-based Multiple Alignment of + Amino Acid Sequences. The 19th National Conference on + Artificial Intelligence (AAAI-04). In press. + +----------------------------------------------------------------- + +PROBCONS has been made freely available as PUBLIC DOMAIN +software and hence is not subject to copyright in the United +States. This system and/or any portion of the source code +may be used, modified, or redistributed without restrictions. +PROBCONS is distributed WITHOUT WARRANTY, express or implied. +The authors accept NO LEGAL LIABILITY OR RESPONSIBILITY for +loss due to reliance on the program. + +----------------------------------------------------------------- + +Version History + +1.0, 3/23/2004 (Chuong Do) + -- initial release + +1.01, 3/25/2004 (Chuong Do) + -- fixed error in training procedure + -- retrained default parameters for 1 and 2 pairs of insert + states + +1.02, 4/17/2004 (Chuong Do) + -- replaced LOG_ADD and EXP routines + -- added support for reading MSF format files + -- added two extra utilities for scoring PROBCONS alignments + (for benchmarking purposes) + -- added the "compare" program for scoring alignments + according to a reference alignment with respect to + sum-of-pairs and column scores + -- added the "fixref" program for adjusting PREFAB + alignments to contain all letters of the input + sequences; basically the main program for PROBCONS + "hacked" to get the job done + +1.03, 5/3/2004 (Chuong Do) + -- added option to do all-pairs pairwise alignments instead + of constructing a full multiple alignment + -- added support for reading DIALIGN style files + -- enabled support for using BAliBASE annotations for scoring + BAliBASE alignments + -- several minor bug fixes thanks to Bob Edgar + -- added "project" program to project multiple alignment to + pairwise alignments + +1.04, 5/9/2004 (Chuong Do) + -- switched over to default of one-insert state pair + -- retrained default parameters + -- added annotation scores + -- small changes to model topology to make end gaps symmetrical + -- added makegnuplot utility to plot annotation scores + +1.05, 5/26/2004 (Chuong Do) + -- added cutoff filtering for posterior scores + -- made small corrections to recurrences for computing alignments + -- added CLUSTALW output support + +1.06, 7/13/2004 (Chuong Do) + -- ProbCons is now PUBLIC DOMAIN software. + +1.07, 8/30/2004 (Chuong Do) + -- Fixed CLUSTALW output for sequence names (thanks to John Calley + for pointing this out) + +1.08, 8/31/2004 (Chuong Do) + -- Added option for alignment order output (-a). + +1.09, 9/1/2004 (Chuong Do) + -- PROBCONS now allows input files with existing gaps -- these are + automatically stripped before alignment. + +1.10, 3/16/2005 (Chuong Do) + -- Reduced memory consumption by + -- not storing posterior matrix transposes + -- restricting consistency-derived posterior matrices to original posterior matrix diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SafeVector.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SafeVector.h new file mode 100644 index 0000000000..7220316db2 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SafeVector.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////// +// SafeVector.h +// +// STL vector with array bounds checking. To enable bounds +// checking, #define ENABLE_CHECKS. +///////////////////////////////////////////////////////////////// + +#ifndef SAFEVECTOR_H +#define SAFEVECTOR_H + +#include +#include + +///////////////////////////////////////////////////////////////// +// SafeVector +// +// Class derived from the STL std::vector for bounds checking. +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +template +class SafeVector : public std::vector{ + public: + + // miscellaneous constructors + SafeVector() : std::vector() {} + SafeVector (size_t size) : std::vector(size) {} + SafeVector (size_t size, const TYPE &value) : std::vector(size, value) {} + SafeVector (const SafeVector &source) : std::vector(source) {} + +#ifdef ENABLE_CHECKS + + // [] array bounds checking + TYPE &operator[](int index){ + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index); + } + + // [] const array bounds checking + const TYPE &operator[] (int index) const { + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index) ; + } + +#endif + +}; + +// some commonly used vector types +typedef SafeVector VI; +typedef SafeVector VVI; +typedef SafeVector VVVI; +typedef SafeVector VF; +typedef SafeVector VVF; +typedef SafeVector VVVF; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ScoreType.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ScoreType.h new file mode 100644 index 0000000000..186d3fd0eb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/ScoreType.h @@ -0,0 +1,340 @@ +///////////////////////////////////////////////////////////////// +// ScoreType.h +// +// Routines for doing math operations in PROBCONS. +///////////////////////////////////////////////////////////////// + +#ifndef SCORETYPE_H +#define SCORETYPE_H + +#include +#include +#include + +typedef float ScoreType; + +const float LOG_ZERO = -2e20; +const float LOG_ONE = 0.0; + +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG (ScoreType x){ + return log (x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x). +///////////////////////////////////////////////////////////////// + +inline ScoreType EXP (ScoreType x){ + //return exp(x); + if (x > -2){ + if (x > -0.5){ + if (x > 0) + return exp(x); + return (((0.03254409303190190000*x + 0.16280432765779600000)*x + 0.49929760485974900000)*x + 0.99995149601363700000)*x + 0.99999925508501600000; + } + if (x > -1) + return (((0.01973899026052090000*x + 0.13822379685007000000)*x + 0.48056651562365000000)*x + 0.99326940370383500000)*x + 0.99906756856399500000; + return (((0.00940528203591384000*x + 0.09414963667859410000)*x + 0.40825793595877300000)*x + 0.93933625499130400000)*x + 0.98369508190545300000; + } + if (x > -8){ + if (x > -4) + return (((0.00217245711583303000*x + 0.03484829428350620000)*x + 0.22118199801337800000)*x + 0.67049462206469500000)*x + 0.83556950223398500000; + return (((0.00012398771025456900*x + 0.00349155785951272000)*x + 0.03727721426017900000)*x + 0.17974997741536900000)*x + 0.33249299994217400000; + } + if (x > -16) + return (((0.00000051741713416603*x + 0.00002721456879608080)*x + 0.00053418601865636800)*x + 0.00464101989351936000)*x + 0.01507447981459420000; + return 0; +} + +/* +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOOKUP (ScoreType x){ + //return log (exp(x) + 1); + if (x < 2){ + if (x < 0.5){ + if (x < 0) + return log (exp(x) + 1); + return (((-0.00486373205785640000*x - 0.00020245408813934800)*x + 0.12504222666029800000)*x + 0.49999685320563000000)*x + 0.69314723138948900000; + } + if (x < 1) + return (((-0.00278634205460548000*x - 0.00458097251248546000)*x + 0.12865849880472500000)*x + 0.49862228499205200000)*x + 0.69334810088688000000; + return (((0.00059633755154209200*x - 0.01918996666063320000)*x + 0.15288232492093800000)*x + 0.48039958825756900000)*x + 0.69857578503189200000; + } + if (x < 8){ + if (x < 4) + return (((0.00135958539181047000*x - 0.02329807659316430000)*x + 0.15885799609532100000)*x + 0.48167498563270800000)*x + 0.69276185058669200000; + return (((0.00011992394456683500*x - 0.00338464503306568000)*x + 0.03622746366545470000)*x + 0.82481250248383700000)*x + 0.32507892994863100000; + } + if (x < 16) + return (((0.00000051726300753785*x - 0.00002720671238876090)*x + 0.00053403733818413500)*x + 0.99536021775747900000)*x + 0.01507065715532010000; + return x; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline ScoreType LOOKUP_SLOW (ScoreType x){ + return log (exp (x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline ScoreType MAX (ScoreType x, ScoreType y, ScoreType z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG_ADD (ScoreType x, ScoreType y){ + if (x < y) return (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + return (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; +} +*/ + +/* +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline float LOG (float x){ + return log (x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x), fr -4.6 <= x <= 0. +///////////////////////////////////////////////////////////////// + +inline float EXP (float x){ + assert (x <= 0.00f); + if (x < EXP_UNDERFLOW_THRESHOLD) return 0.0f; + return (((0.006349841068584 * x + 0.080775412572352) * x + 0.397982026296272) * x + 0.95279335963787f) * x + 0.995176455837312f; + //return (((0.00681169825657f * x + 0.08386267698832f) * x + 0.40413983195844f) * x + 0.95656674979767f) * x + 0.99556744049130f; +} +*/ + +const float EXP_UNDERFLOW_THRESHOLD = -4.6; +const float LOG_UNDERFLOW_THRESHOLD = 7.5; + +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline float LOOKUP (float x){ + assert (x >= 0.00f); + assert (x <= LOG_UNDERFLOW_THRESHOLD); + //return ((-0.00653779113685f * x + 0.09537236626558f) * x + 0.55317574459331f) * x + 0.68672959851568f; + if (x <= 1.00f) return ((-0.009350833524763f * x + 0.130659527668286f) * x + 0.498799810682272f) * x + 0.693203116424741f; + if (x <= 2.50f) return ((-0.014532321752540f * x + 0.139942324101744f) * x + 0.495635523139337f) * x + 0.692140569840976f; + if (x <= 4.50f) return ((-0.004605031767994f * x + 0.063427417320019f) * x + 0.695956496475118f) * x + 0.514272634594009f; + assert (x <= LOG_UNDERFLOW_THRESHOLD); + return ((-0.000458661602210f * x + 0.009695946122598f) * x + 0.930734667215156f) * x + 0.168037164329057f; + + //return (((0.00089738532761f * x - 0.01859488697982f) * x + 0.14415772028626f) * x + 0.49515490689159f) * x + 0.69311928966454f; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline float LOOKUP_SLOW (float x){ + return log (exp (x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline float MAX (float x, float y, float z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS (float &x, float y){ + if (x < y) + x = (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? y : LOOKUP(y-x) + x; + else + x = (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? x : LOOKUP(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW (float &x, float y){ + if (x < y) + x = (x == LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y == LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x, float y){ + if (x < y) return (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? y : LOOKUP(y-x) + x; + return (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? x : LOOKUP(x-y) + y; +} + + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add three log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3){ + return LOG_ADD (x1, LOG_ADD (x2, x3)); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add four log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, x4))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add five log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, x5)))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add siz log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5, float x6){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, LOG_ADD (x5, x6))))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add seven log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD (float x1, float x2, float x3, float x4, float x5, float x6, float x7){ + return LOG_ADD (x1, LOG_ADD (x2, LOG_ADD (x3, LOG_ADD (x4, LOG_ADD (x5, LOG_ADD (x6, x7)))))); +} + +///////////////////////////////////////////////////////////////// +// ChooseBestOfThree() +// +// Store the largest of three values x1, x2, and x3 in *x. Also +// if xi is the largest value, then store bi in *b. +///////////////////////////////////////////////////////////////// + +inline void ChooseBestOfThree (float x1, float x2, float x3, char b1, char b2, char b3, float *x, char *b){ + if (x1 >= x2){ + if (x1 >= x3){ + *x = x1; + *b = b1; + return; + } + *x = x3; + *b = b3; + return; + } + if (x2 >= x3){ + *x = x2; + *b = b2; + return; + } + *x = x3; + *b = b3; +} + +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Sequence.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Sequence.h new file mode 100644 index 0000000000..ffc6ead17d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/Sequence.h @@ -0,0 +1,515 @@ +///////////////////////////////////////////////////////////////// +// Sequence.h +// +// Class for reading/manipulating single sequence character data. +///////////////////////////////////////////////////////////////// + +#ifndef __SEQUENCE_H__ +#define __SEQUENCE_H__ + +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "FileBuffer.h" + +///////////////////////////////////////////////////////////////// +// Sequence +// +// Class for storing sequence information. +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +class Sequence { + + bool isValid; // a boolean indicating whether the sequence data is valid or not + string header; // string containing the comment line of the FASTA file + SafeVector *data; // pointer to character data + int length; // length of the sequence + int sequenceLabel; // integer sequence label, typically to indicate the ordering of sequences + // in a Multi-FASTA file + int inputLabel; // position of sequence in original input + float weight; + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Default constructor. Does nothing. + ///////////////////////////////////////////////////////////////// + + Sequence () : isValid (false), header (""), data (NULL), length (0), sequenceLabel (0), inputLabel (0) {} + + public: + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Reads the sequence from a FileBuffer. + ///////////////////////////////////////////////////////////////// + + Sequence (FileBuffer &infile, bool stripGaps = false) : isValid (false), header ("~"), data (NULL), length(0), sequenceLabel (0), inputLabel (0) { + + // read until the first non-blank line + while (!infile.eof()){ + infile.GetLine (header); + if (header.length() != 0) break; + } + + // check to make sure that it is a correct header line + if (header[0] == '>'){ + + // if so, remove the leading ">" + header = header.substr (1); + + // remove any leading or trailing white space in the header comment + while (header.length() > 0 && isspace (header[0])) header = header.substr (1); + while (header.length() > 0 && isspace (header[header.length() - 1])) header = header.substr(0, header.length() - 1); + + // get ready to read the data[] array; note that data[0] is always '@' + char ch; + data = new SafeVector; assert (data); + data->push_back ('@'); + + // get a character from the file + while (infile.Get(ch)){ + + // if we've reached a new comment line, put the character back and stop + if (ch == '>'){ infile.UnGet(); break; } + + // skip whitespace + if (isspace (ch)) continue; + + // substitute gap character + if (ch == '.') ch = '-'; + if (stripGaps && ch == '-') continue; + + // check for known characters + if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '*' || ch == '-')){ + cerr << "ERROR: Unknown character encountered: " << ch << endl; + exit (1); + } + + // everything's ok so far, so just store this character. + data->push_back(ch); + ++length; + } + + // sequence must contain data in order to be valid + isValid = length > 0; + if (!isValid){ + delete data; + data = NULL; + } + } + } + + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Builds a sequence from existing data. Note + // that the data must use one-based indexing where data[0] should + // be set to '@'. + ///////////////////////////////////////////////////////////////// + + Sequence (SafeVector *data, string header, int length, int sequenceLabel, int inputLabel) : + isValid (data != NULL), header(header), data(data), length (length), sequenceLabel (sequenceLabel), inputLabel (inputLabel) { + assert (data); + assert ((*data)[0] == '@'); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Destructor. Release allocated memory. + ///////////////////////////////////////////////////////////////// + + ~Sequence (){ + if (data){ + assert (isValid); + delete data; + data = NULL; + isValid = false; + } + } + + void SetWeight(float myWeight) { + weight = myWeight; + } + float GetWeight() const { + return weight; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetHeader() + // + // Return the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetHeader () const { + return header; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetName() + // + // Return the first word of the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetName () const { + char name[1024]; + sscanf (header.c_str(), "%s", name); + return string(name); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetDataPtr() + // + // Return the iterator to data associated with this sequence. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetDataPtr(){ + assert (isValid); + assert (data); + return data->begin(); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetPosition() + // + // Return the character at position i. Recall that the character + // data is stored with one-based indexing. + ///////////////////////////////////////////////////////////////// + + char GetPosition (int i) const { + assert (isValid); + assert (data); + assert (i >= 0 && i <= length); + return (*data)[i]; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetLabel() + // + // Sets the sequence label to i. + ///////////////////////////////////////////////////////////////// + + void SetLabel (int i){ + assert (isValid); + sequenceLabel = i; + inputLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetSortLabel() + // + // Sets the sequence sorting label to i. + ///////////////////////////////////////////////////////////////// + + void SetSortLabel (int i){ + assert (isValid); + sequenceLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetLabel() + // + // Retrieves the input label. + ///////////////////////////////////////////////////////////////// + + int GetLabel () const { + assert (isValid); + return inputLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetSortLabel() + // + // Retrieves the sorting label. + ///////////////////////////////////////////////////////////////// + + int GetSortLabel () const { + assert (isValid); + return sequenceLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Fail() + // + // Checks to see if the sequence successfully loaded. + ///////////////////////////////////////////////////////////////// + + bool Fail () const { + return !isValid; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Length() + // + // Returns the length of the sequence. + ///////////////////////////////////////////////////////////////// + + int GetLength () const { + assert (isValid); + assert (data); + return length; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::WriteMFA() + // + // Writes the sequence to outfile in MFA format. Uses numColumns + // columns per line. If useIndex is set to false, then the + // header is printed as normal, but if useIndex is true, then + // ">S###" is printed where ### represents the sequence label. + ///////////////////////////////////////////////////////////////// + + void WriteMFA (ostream &outfile, int numColumns, bool useIndex = false) const { + assert (isValid); + assert (data); + assert (!outfile.fail()); + + // print out heading + if (useIndex) + outfile << ">S" << GetLabel() << endl; + else + outfile << ">" << header << endl; + + // print out character data + int ct = 1; + for (; ct <= length; ct++){ + outfile << (*data)[ct]; + if (ct % numColumns == 0) outfile << endl; + } + if ((ct-1) % numColumns != 0) outfile << endl; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::WriteWEB() + // + // output for web interfase based on Sequence::WriteMFA() + ///////////////////////////////////////////////////////////////// + + void WriteWEB (ostream &outfile, int numColumns, bool useIndex = false) const { + assert (isValid); + assert (data); + assert (!outfile.fail()); + + outfile << "" << endl; + outfile << "" << endl; + // print out heading + if (useIndex) + outfile << "S" << GetLabel() << endl; + else + outfile << "" << header << endl; + + outfile << "" << endl; + + // print out character data + outfile << "" << endl; + int ct = 1; + for (; ct <= length; ct++){ + outfile << (*data)[ct]; + if (ct % numColumns == 0) outfile << endl; + } + if ((ct-1) % numColumns != 0) outfile << endl; + + outfile << "" << endl; + outfile << "" << endl; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Clone() + // + // Returns a new deep copy of the seqeuence. + ///////////////////////////////////////////////////////////////// + + Sequence *Clone () const { + Sequence *ret = new Sequence(); + assert (ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; assert (ret->data); + *(ret->data) = *data; + ret->length = length; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + ret->weight = weight; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetRange() + // + // Returns a new sequence object consisting of a range of + // characters from the current seuquence. + ///////////////////////////////////////////////////////////////// + + Sequence *GetRange (int start, int end) const { + Sequence *ret = new Sequence(); + assert (ret); + + assert (start >= 1 && start <= length); + assert (end >= 1 && end <= length); + assert (start <= end); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; assert (ret->data); + ret->data->push_back ('@'); + for (int i = start; i <= end; i++) + ret->data->push_back ((*data)[i]); + ret->length = end - start + 1; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::AddGaps() + // + // Given an SafeVector containing the skeleton for an + // alignment and the identity of the current character, this + // routine will create a new sequence with all necesssary gaps added. + // For instance, + // alignment = "XXXBBYYYBBYYXX" + // id = 'X' + // will perform the transformation + // "ATGCAGTCA" --> "ATGCC---GT--CA" + // (XXXBBYYYBBYYXX) + ///////////////////////////////////////////////////////////////// + + Sequence *AddGaps (SafeVector *alignment, char id){ + Sequence *ret = new Sequence(); + assert (ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; assert (ret->data); + ret->length = (int) alignment->size(); + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + ret->data->push_back ('@'); + + SafeVector::iterator dataIter = data->begin() + 1; + for (SafeVector::iterator iter = alignment->begin(); iter != alignment->end(); ++iter){ + if (*iter == 'B' || *iter == id){ + ret->data->push_back (*dataIter); + ++dataIter; + } + else + ret->data->push_back ('-'); + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::AddGaps() + // + // Given an SafeVector containing the skeleton for an + // alignment and the identity of the current character, this + // routine will create a new sequence with all necesssary gaps added. + // For instance, + // alignment = "XXXBBYYYBBYYXX" + // id = 'X' + // will perform the transformation + // "ATGCAGTCA" --> "ATGCC---GT--CA" + // (XXXBBYYYBBYYXX) + ///////////////////////////////////////////////////////////////// + Sequence *AddGapsReverse (SafeVector *alignment, char id){ + Sequence *ret = new Sequence(); + assert (ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; assert (ret->data); + ret->length = (int) alignment->size(); + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + ret->data->push_back ('@'); + + SafeVector::iterator dataIter = data->begin() + 1; + for (SafeVector::reverse_iterator iter = alignment->rbegin(); iter != alignment->rend(); ++iter){ + if (*iter == 'B' || *iter == id){ + ret->data->push_back (*dataIter); + ++dataIter; + } + else + ret->data->push_back ('-'); + } + + return ret; + } + + + ///////////////////////////////////////////////////////////////// + // Sequence::GetString() + // + // Returns the sequence as a string with gaps removed. + ///////////////////////////////////////////////////////////////// + + string GetString (){ + string s = " "; + for (int i = 1; i <= length; i++){ + if ((*data)[i] != '-') s += (*data)[i]; + } + return s; + } + + + ///////////////////////////////////////////////////////////////// + // Sequence::GetMapping() + // + // Returns a SafeVector containing the indices of every + // character in the sequence. For instance, if the data is + // "ATGCC---GT--CA", the method returns {1,2,3,4,5,9,10,13,14}. + ///////////////////////////////////////////////////////////////// + + SafeVector *GetMapping () const { + SafeVector *ret = new SafeVector(1, 0); + for (int i = 1; i <= length; i++){ + if ((*data)[i] != '-') ret->push_back (i); + } + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetMappingNumber() + // + // Returns a SafeVector containing the indices of every + // character in the sequence. For instance, if the data is + // "ATGCC---GT--CA", the method returns {1,2,3,4,5,0,0,0,6,7,0,0,8,9}. + ///////////////////////////////////////////////////////////////// + SafeVector *GetMappingNumber () const { + SafeVector *ret = new SafeVector(1, 0); + int count = 0; + for(int i = 1; i <= length; i++) { + if((*data)[i] != '-') ret->push_back(++count); + else ret->push_back(0); + } + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Highlight() + // + // Changes all positions with score >= cutoff to upper case and + // all positions with score < cutoff to lower case. + ///////////////////////////////////////////////////////////////// + + void Highlight (const SafeVector &scores, const float cutoff){ + for (int i = 1; i <= length; i++){ + if (scores[i-1] >= cutoff) + (*data)[i] = toupper ((*data)[i]); + else + (*data)[i] = tolower ((*data)[i]); + } + } +}; +} +#endif // __SQUENCE_HPP__ diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SparseMatrix.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SparseMatrix.h new file mode 100644 index 0000000000..f7226425ea --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/SparseMatrix.h @@ -0,0 +1,341 @@ +///////////////////////////////////////////////////////////////// +// SparseMatrix.h +// +// Sparse matrix computations +///////////////////////////////////////////////////////////////// + +#ifndef SPARSEMATRIX_H +#define SPARSEMATRIX_H + +#include +#include "SafeVector.h" +#include "nrutil.h" + +using namespace std; + +const float POSTERIOR_CUTOFF = 0.01; // minimum posterior probability + // value that is maintained in the + // sparse matrix representation + +typedef pair PIF; // Sparse matrix entry type + // first --> column + // second --> value + +namespace MXSCARNA { +struct PIF2 { // Sparse matrix entry type + int i; + int j; + float prob; +}; +} + +///////////////////////////////////////////////////////////////// +// SparseMatrix +// +// Class for sparse matrix computations +///////////////////////////////////////////////////////////////// +namespace MXSCARNA { +class SparseMatrix { + + int seq1Length, seq2Length; // dimensions of matrix + VI rowSize; // rowSize[i] = # of cells in row i + SafeVector data; // data values + SafeVector::iterator> rowPtrs; // pointers to the beginning of each row + + public: + SafeVector data2; + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Private constructor.1 + ///////////////////////////////////////////////////////////////// + SparseMatrix() { } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Constructor. Builds a sparse matrix from a posterior matrix. + // Note that the expected format for the posterior matrix is as + // a (seq1Length+1) x (seq2Length+1) matrix where the 0th row + // and 0th column are ignored (they should contain all zeroes). + ///////////////////////////////////////////////////////////////// + + SparseMatrix (int seq1Length, int seq2Length, const VF &posterior) : + seq1Length (seq1Length), seq2Length (seq2Length) { + + int numCells = 0; + + assert (seq1Length > 0); + assert (seq2Length > 0); + + // calculate memory required; count the number of cells in the + // posterior matrix above the threshold + VF::const_iterator postPtr = posterior.begin(); + for (int i = 0; i <= seq1Length; i++){ + for (int j = 0; j <= seq2Length; j++){ + if (*(postPtr++) >= POSTERIOR_CUTOFF){ + assert (i != 0 && j != 0); + numCells++; + } + } + } + + // allocate memory + data.resize(numCells); + rowSize.resize (seq1Length + 1); rowSize[0] = -1; + rowPtrs.resize (seq1Length + 1); rowPtrs[0] = data.end(); + + // build sparse matrix + postPtr = posterior.begin() + seq2Length + 1; // note that we're skipping the first row here + SafeVector::iterator dataPtr = data.begin(); + for (int i = 1; i <= seq1Length; i++){ + postPtr++; // and skipping the first column of each row + rowPtrs[i] = dataPtr; + for (int j = 1; j <= seq2Length; j++){ + if (*postPtr >= POSTERIOR_CUTOFF){ + dataPtr->first = j; + dataPtr->second = *postPtr; + dataPtr++; + } + postPtr++; + } + rowSize[i] = dataPtr - rowPtrs[i]; + } + } + + ////////////////////////////////////////////////////////////////////////// + // SparseMatrix::SetSparseMatrix() + // + // Constructor. + ////////////////////////////////////////////////////////////////////////// + void SetSparseMatrix(int inseq1Length, int inseq2Length, const Trimat &bppMat, float cutoff = 0.01) { + seq1Length = inseq1Length; + seq2Length = inseq2Length; + + int numCells = 0; + + assert (seq1Length > 0); + assert (seq2Length > 0); + + data.clear(); + rowSize.clear(); + rowPtrs.clear(); + for (int i = 1; i <= seq1Length; i++) { + for (int j = i; j <= seq2Length; j++) { + if (bppMat.ref(i, j) >= cutoff ) { + numCells++; + } + } + } + + // allocate memory + data.resize(numCells); + for (int i = 0; i < numCells; i++) { + data[i].first = 0; + data[i].second = 0; + } + rowSize.resize (seq1Length + 1); rowSize[0] = -1; + rowPtrs.resize (seq1Length + 1); rowPtrs[0] = data.end(); + + SafeVector::iterator dataPtr = data.begin(); + for (int i = 1; i <= seq1Length; i++) { + rowPtrs[i] = dataPtr; + for (int j = i; j <= seq2Length; j++) { + if ( bppMat.ref(i, j) >= cutoff ) { + dataPtr->first = j; + dataPtr->second = bppMat.ref(i, j); + dataPtr++; + } + } + rowSize[i] = dataPtr - rowPtrs[i]; + } + + float tmp; + for(int k = 1; k <= seq1Length; k++) { + for(int m = k, n = k; n <= k + 300 && m >= 1 && n <= seq2Length; m--, n++) { + if ((tmp = GetValue(m, n)) > 0) { + PIF2 p; + p.i = m; + p.j = n; + p.prob = tmp; + data2.push_back(p); + } + } + + for(int m = k, n = k + 1; n <= k + 300 && m >= 1 && n <= seq2Length; m--, n++) { + if ((tmp = GetValue(m, n)) > 0) { + PIF2 p; + p.i = m; + p.j = n; + p.prob = tmp; + data2.push_back(p); + } + } + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr() + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetRowPtr (int row) const { + assert (row >= 1 && row <= seq1Length); + return rowPtrs[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetValue() + // + // Returns value at a particular row, column. + ///////////////////////////////////////////////////////////////// + + float GetValue (int row, int col){ + assert (row >= 1 && row <= seq1Length); + assert (col >= 1 && col <= seq2Length); + for (int i = 0; i < rowSize[row]; i++){ + if (rowPtrs[row][i].first == col) return rowPtrs[row][i].second; + } + return 0; + } + + void SetValue(int row, int col, float value) { + assert (row >= 1 && row <= seq1Length); + assert (col >= 1 && col <= seq2Length); + for (int i = 0; i < rowSize[row]; i++){ + if (rowPtrs[row][i].first == col) rowPtrs[row][i].second = value; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowSize() + // + // Returns the number of entries in a particular row. + ///////////////////////////////////////////////////////////////// + + int GetRowSize (int row) const { + assert (row >= 1 && row <= seq1Length); + return rowSize[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq1Length() + // + // Returns the first dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq1Length () const { + return seq1Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq2Length() + // + // Returns the second dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq2Length () const { + return seq2Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + int GetNumCells () const { + return data.size(); + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::Print() + // + // Prints out a sparse matrix. + ///////////////////////////////////////////////////////////////// + + void Print (ostream &outfile) const { + outfile << "Sparse Matrix:" << endl; + for (int i = 1; i <= seq1Length; i++){ + outfile << " " << i << ":"; + for (int j = 0; j < rowSize[i]; j++){ + outfile << " (" << rowPtrs[i][j].first << "," << rowPtrs[i][j].second << ")"; + } + outfile << endl; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::ComputeTranspose() + // + // Returns a new sparse matrix containing the transpose of the + // current matrix. + ///////////////////////////////////////////////////////////////// + + SparseMatrix *ComputeTranspose () const { + + // create a new sparse matrix + SparseMatrix *ret = new SparseMatrix(); + int numCells = data.size(); + + ret->seq1Length = seq2Length; + ret->seq2Length = seq1Length; + + // allocate memory + ret->data.resize (numCells); + ret->rowSize.resize (seq2Length + 1); ret->rowSize[0] = -1; + ret->rowPtrs.resize (seq2Length + 1); ret->rowPtrs[0] = ret->data.end(); + + // compute row sizes + for (int i = 1; i <= seq2Length; i++) ret->rowSize[i] = 0; + for (int i = 0; i < numCells; i++) + ret->rowSize[data[i].first]++; + + // compute row ptrs + for (int i = 1; i <= seq2Length; i++){ + ret->rowPtrs[i] = (i == 1) ? ret->data.begin() : ret->rowPtrs[i-1] + ret->rowSize[i-1]; + } + + // now fill in data + SafeVector::iterator> currPtrs = ret->rowPtrs; + + for (int i = 1; i <= seq1Length; i++){ + SafeVector::iterator row = rowPtrs[i]; + for (int j = 0; j < rowSize[i]; j++){ + currPtrs[row[j].first]->first = i; + currPtrs[row[j].first]->second = row[j].second; + currPtrs[row[j].first]++; + } + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetPosterior() + // + // Return the posterior representation of the sparse matrix. + ///////////////////////////////////////////////////////////////// + + VF *GetPosterior () const { + + // create a new posterior matrix + VF *posteriorPtr = new VF((seq1Length+1) * (seq2Length+1)); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + // build the posterior matrix + for (int i = 0; i < (seq1Length+1) * (seq2Length+1); i++) posterior[i] = 0; + for (int i = 1; i <= seq1Length; i++){ + VF::iterator postPtr = posterior.begin() + i * (seq2Length+1); + for (int j = 0; j < rowSize[i]; j++){ + postPtr[rowPtrs[i][j].first] = rowPtrs[i][j].second; + } + } + + return posteriorPtr; + } + +}; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/mlparams0 b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/mlparams0 new file mode 100644 index 0000000000..43e501fda0 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/mlparams0 @@ -0,0 +1,11 @@ +0.96 0.02 0.02 +0.01 0.01 +0.4 0.4 +ACGUTN +0.148724 +0.0184143 0.158392 +0.0361397 0.0275537 0.197932 +0.0238474 0.0389291 0.0244289 0.155748 +0.0238474 0.0389291 0.0244289 0.155748 0.155748 +3.75308e-05 8.15823e-05 8.24765e-05 7.43985e-05 7.43985e-05 2.63252e-05 +0.227079 0.242208 0.283932 0.246468 0.246468 0.000312465 diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/train-script b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/train-script new file mode 100644 index 0000000000..de909da1a7 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/probconsRNA/train-script @@ -0,0 +1,30 @@ +./probcons -p mlparams0 -t params1 ../bralibase/* +./probcons -p params1 -t params2 ../bralibase/* +./probcons -p params2 -t params3 ../bralibase/* +./probcons -p params3 -t params4 ../bralibase/* +./probcons -p params4 -t params5 ../bralibase/* +./probcons -p params5 -t params6 ../bralibase/* +./probcons -p params6 -t params7 ../bralibase/* +./probcons -p params7 -t params8 ../bralibase/* +./probcons -p params8 -t params9 ../bralibase/* +./probcons -p params9 -t params10 ../bralibase/* +./probcons -p params10 -t params11 ../bralibase/* +./probcons -p params11 -t params12 ../bralibase/* +./probcons -p params12 -t params13 ../bralibase/* +./probcons -p params13 -t params14 ../bralibase/* +./probcons -p params14 -t params15 ../bralibase/* +./probcons -p params15 -t params16 ../bralibase/* +./probcons -p params16 -t params17 ../bralibase/* +./probcons -p params17 -t params18 ../bralibase/* +./probcons -p params18 -t params19 ../bralibase/* +./probcons -p params19 -t params20 ../bralibase/* +./probcons -p params20 -t params21 ../bralibase/* +./probcons -p params21 -t params22 ../bralibase/* +./probcons -p params22 -t params23 ../bralibase/* +./probcons -p params23 -t params24 ../bralibase/* +./probcons -p params24 -t params25 ../bralibase/* +./probcons -p params25 -t params26 ../bralibase/* +./probcons -p params26 -t params27 ../bralibase/* +./probcons -p params27 -t params28 ../bralibase/* +./probcons -p params28 -t params29 ../bralibase/* +./probcons -p params29 -t params30 ../bralibase/* diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/scarna.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/scarna.hpp new file mode 100644 index 0000000000..ac58548c6b --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/scarna.hpp @@ -0,0 +1,124 @@ + +#ifndef __SCARNA_HPP__ +#define __SCARNA_HPP__ + +#include +using namespace std; + +#define WORDLENGTH 2 /* default word length in stem candidates (SCs) */ + +#define THR 0.01 + +// the parameter trained by maximazing the sps of tRNA +//#define MULTISCORE 9.870619 //multiple score with the constant. +//#define MULTIRIBOSUM 0.452626 //multiple ribosum_score with the constant +//#define MULTIPENALTY 24.263776 //multiple penalty with the constatnt +//#define MULTISTACKING 45.208927 //multiple stacking energy with the constatnt + +/* +#define MULTIRIBOSUM 1 +#define MULTIPENALTY 3.1 +#define MULTISCORE 3.7 +#define MULTISTACKING 0.1 +#define MULTIDELTASCORE 9.4 +#define MULTIDELTASTACKING 8.6 +*/ +/* +#define MULTIRIBOSUM 1 +#define MULTIPENALTY 1.1162 +#define MULTISCORE 0.53299 +#define MULTISTACKING 4.25669 +#define MULTIDELTASCORE 1.17805 +#define MULTIDELTASTACKING 4.2016 +*/ +// new CRF DATA 550 sigma 1 + +#define MULTIRIBOSUM 1 +#define MULTIPENALTY 1.82294 +#define MULTISCORE 0.250631 +#define MULTISTACKING 2.35517 +#define MULTIDELTASCORE 1.1781 +#define MULTIDELTASTACKING 2.45417 + +/* +#define MULTIRIBOSUM 1 +#define MULTIPENALTY 0.478054 +#define MULTISCORE 1.36322 +#define MULTISTACKING 4.96635 +#define MULTIDELTASCORE 1.14239 +#define MULTIDELTASTACKING 7.32992 +*/ +// CRF DATA 900 sigma 1 +/* +#define MULTIRIBOSUM 1 +#define MULTIPENALTY 2.28364 +#define MULTISCORE 0.00945681 +#define MULTISTACKING 2.25357 +#define MULTIDELTASCORE 1.02201 +#define MULTIDELTASTACKING 2.21293 +*/ + +/* +#define RNAMATCHAA 506159 +#define RNAMATCHAT 359916 +#define RNAMATCHAG 451319 +#define RNAMATCHAC 390720 +#define RNAMATCHTT 398658 +#define RNAMATCHTG 377069 +#define RNAMATCHTC 378456 +#define RNAMATCHGG 554695 +#define RNAMATCHGC 419950 +#define RNAMATCHCC 479030 +#define GAPPENALTY 190947 +#define GAPEXTENTIONPENALTY -118817 +*/ +// RIBOSUM +#define RNAMATCHAA 2.22 +#define RNAMATCHAT -1.39 +#define RNAMATCHAG -1.46 +#define RNAMATCHAC -1.86 +#define RNAMATCHTT 1.65 +#define RNAMATCHTG -1.74 +#define RNAMATCHTC -1.05 +#define RNAMATCHGG 1.03 +#define RNAMATCHGC -2.48 +#define RNAMATCHCC 1.16 +//#define GAPPENALTY 9.42 // 3default linear gap penalry in RNA sequence alignment +//#define GAPPENALTY 9.18743 +//#define GAPPENALTY 5.00 +//#define GAPEXTENTIONPENALTY 7.15 +//#define GAPEXTENTIONPENALTY 9.62003 + +#define GAPPENALTY 5 +#define GAPEXTENTIONPENALTY 2.5 +//#define GAPPENALTY 8.08875 +//#define GAPEXTENTIONPENALTY 3.89655 + +#define REFINEMENTREPS 0 +#define SCSLENGTH 2 +#define BASEPROBTHRESHOLD 0.01 +#define BASEPAIRCONST 6 +#define BANDWIDTH 500 +#define USERFOLD false + +extern float RNA_Match_AA; +extern float RNA_Match_AT; +extern float RNA_Match_AG; +extern float RNA_Match_AC; +extern float RNA_Match_TT; +extern float RNA_Match_TG; +extern float RNA_Match_TC; +extern float RNA_Match_GG; +extern float RNA_Match_GC; +extern float RNA_Match_CC; +extern float RNA_Gap_Penalty; +extern float RNA_Gap_Extension; + +extern int numIterativeRefinementReps; +extern bool PostProcessAlignment; +extern int scsLength; +extern float BaseProbThreshold; +extern float BasePairConst; + +#endif /*__SCARNA_HPP__*/ + diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/seq2scs.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/seq2scs.cpp new file mode 100644 index 0000000000..57b12fe72e --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/seq2scs.cpp @@ -0,0 +1,638 @@ +/////////////////////////////////////////////////////////////// +// seq2scs.cpp +// +// make SCS(Stem Candidate Sequence) from the profile +////////////////////////////////////////////////////////////// + +#include "scarna.hpp" +#include "SafeVector.h" +#include "StemCandidate.hpp" +#include "Sequence.h" +#include "MultiSequence.h" +#include "BPPMatrix.hpp" +#include "nrutil.h" +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace::MXSCARNA; + +// for alipfold +/* +#include "utils.h" +#include "fold_vars.h" +#include "fold.h" +#include "part_func.h" +#include "inverse.h" +#include "RNAstruct.h" +#include "treedist.h" +#include "stringdist.h" +#include "profiledist.h" +#include "alifold.h" +#include "aln_util.h" +#include "dist_vars.h" +*/ +double Stacking_Energy[36] ={ + -0.9,-2.1,-1.7,-0.5,-0.9,-1.0, + -1.8,-2.9,-2.0,-1.2,-1.7,-1.9, + -2.3,-3.4,-2.9,-1.4,-2.1,-2.1, + -1.1,-2.1,-1.9,-0.4,-1.0,1.5, + -1.1,-2.3,-1.8,-0.8,-0.9,-1.1, + -0.8,-1.4,-1.2,-0.2,-0.5,-0.4 }; + +static Trimat* makeProfileBPPMatrix(MultiSequence *Sequences, SafeVector &BPPMatrices); +static int countSCS(MultiSequence *Sequences, Trimat* consBppMat, int BandWidth); +static std::vector* makeProfileScs(std::vector *pscs, MultiSequence *Sequences, Trimat* consBppMat, int BandWidth); +static void printScs(std::vector *pscs); +static std::vector* doubleScs(std::vector *pscs); +static std::vector* findRelations(std::vector *pscs); +static std::vector* findCorresponding(std::vector* pscs); +static std::vector* calculateStackingEnergy(std::vector* pscs); + +//float alipf_fold(char **sequences, char *structure, pair_info **pi); + +struct SortCmp { + bool operator()(const StemCandidate &sc1, const StemCandidate &sc2) const { +#if 0 +// ? Incompatible with Mac + if (sc1.GetPosition() > sc2.GetPosition()) return false; + else if (sc1.GetPosition() < sc2.GetPosition()) return true; + else if (sc1.GetDistance() > sc2.GetDistance()) return false; + else return true; +// ? works correctly + if (sc1.GetPosition() < sc2.GetPosition()) return true; + else if (sc1.GetPosition() > sc2.GetPosition()) return false; + else if (sc1.GetDistance() < sc2.GetDistance()) return true; + else return false; +// works correctly, but requires c++11 + return std::tie(sc1.GetPosition(),sc1.GetDistance()) sc2.GetPosition()) return false; + else if (sc1.GetPosition() < sc2.GetPosition()) return true; + else if (sc1.GetDistance() > sc2.GetDistance()) return false; + else if (sc1.GetDistance() < sc2.GetDistance()) return true; + else return false; +#else // by katoh + return (sc1.GetPosition() < sc2.GetPosition()) || (sc1.GetPosition() == sc2.GetPosition() && sc1.GetDistance() < sc2.GetDistance() ); +#endif + } +}; + + +vector* +seq2scs(MultiSequence *Sequences, SafeVector &BPPMatrices, int BandWidth) +{ + + Trimat *consBppMat = makeProfileBPPMatrix(Sequences, BPPMatrices); + + int numberScs = countSCS(Sequences, consBppMat, BandWidth); + + std::vector *pscs = new std::vector(); // Profile Stem Candidate Sequence +// cout << "numberScs=" << numberScs << endl; + pscs->resize(numberScs+1); + + pscs = makeProfileScs(pscs, Sequences, consBppMat, BandWidth); + + pscs = doubleScs(pscs); + + std::vector::iterator startIter = pscs->begin(); + std::vector::iterator endIter = pscs->end(); + ++startIter; + std::sort(startIter, endIter, SortCmp()); + +// printScs(pscs); + pscs = findRelations(pscs); + + pscs = findCorresponding(pscs); + + pscs = calculateStackingEnergy(pscs); + +// findStemRelation() + +// exit(1); + delete consBppMat; + + return pscs; +} + +static Trimat* +makeProfileBPPMatrix(MultiSequence *Sequences, SafeVector &BPPMatrices) +{ + int length = Sequences->GetSequence(0)->GetLength(); +// float thr = BaseProbThreshold; + Trimat *consBppMat = new Trimat(length + 1); + fill(consBppMat->begin(), consBppMat->end(), 0); + +// gabage +// for(int i = 0; i <= length; i++) +// for(int j = i; j <= length; j++) +// cout << "i=" << i << " j=" << j << " " << consBppMat->ref(i,j) << endl; +// consBppMat->ref(i,j) = 0; + + + int number = Sequences->GetNumSequences(); +// if( number == 1) { + for(int seqNum = 0; seqNum < number; seqNum++) { + SafeVector *tmpMap = Sequences->GetSequence(seqNum)->GetMappingNumber(); + int label = Sequences->GetSequence(seqNum)->GetLabel(); + BPPMatrix *tmpBppMatrix = BPPMatrices[label]; + + for(int i = 1; i <= length ; i++) { + int originI = tmpMap->at(i); + for(int j = i + 3; j <= length; j++) { + int originJ = tmpMap->at(j); + if(originI != 0 && originJ != 0) { + float tmpProb = tmpBppMatrix->GetProb(originI, originJ); + +// if(tmpProb >= thr) { + consBppMat->ref(i, j) += tmpProb; +// cout << i << " " << j << " " << consBppMat->ref(i,j) << endl; +// } + } + } + } + } + + /* compute the mean of base pairing probability */ + for(int i = 1; i <= length; i++) { + for(int j = i + 3; j <= length; j++) { + consBppMat->ref(i,j) = consBppMat->ref(i,j)/(float)number; + //consBppMat->ref(i,j) = std::sqrt[number](consBppMat->ref(i,j)); + // cout << i << " " << j << " " << consBppMat->ref(i,j) << endl; + } + } + + +/* + else { + char **Seqs; + Seqs = (char **) malloc(sizeof(char*) * number); + + for(int i = 0; i < number; i++) { + Seqs[i] = (char *) malloc(sizeof(char) * (length + 1)); + for(int j = 1; j <= length; j++) { + Seqs[i][j-1] = Sequences->GetSequence(i)->GetPosition(j); + } + Seqs[i][length] = '\0'; + } + + + char *structure = NULL; + pair_info *pi; + + alipf_fold(Seqs, structure, &pi, number); + + for(int iter = 0; iter < length; iter++) { + if(pi[iter].i == 0) break; + consBppMat->ref(pi[iter].i, pi[iter].j) = pi[iter].p; + } + + for(int i = 0; i < number; i++) { + free (Seqs[i]); + } + free (Seqs); + +// free_alifold_arrays(void); + } +*/ + + return consBppMat; +} + +static int +countSCS(MultiSequence *Sequences, Trimat *consBppMat, int BandWidth) +{ + + int length = Sequences->GetSequence(0)->GetLength(); + int Word_Length = scsLength; + + int i, j, k, s; + int count; + int sum; + + sum = 0; + for(k = 1; k <= length; k++) { + count = 0; + + for(i = k, j = k; i >= 1 && j <= (k + BandWidth - 1) && j <= length; i--, j++) { + if(consBppMat->ref(i, j) >= BaseProbThreshold) { + count++; + } + else if(count >= Word_Length) { + for(s = 0; s <= count - Word_Length; s++) + sum++; + + count = 0; + } + else { + count = 0; + } + if(consBppMat->ref(i, j) >= BaseProbThreshold && count >= Word_Length && (i == 1 || j == length || j == (k + BandWidth - 1))) { + for(s = 0; s <= count - Word_Length; s++) + sum++; + + count = 0; + } + } + + count = 0; + for(i = k, j = k + 1; i >= 1 && j <= (k + BandWidth - 1) && j <= length; i--, j++) { + if(consBppMat->ref(i, j) >= BaseProbThreshold) { + count++; + } + else if(count >= Word_Length) { + for(s = 0; s <= count - Word_Length; s++) sum++; + + count = 0; + } + else { + count = 0; + } + + if(consBppMat->ref(i, j) >= BaseProbThreshold && count >= Word_Length && (i == 1 || j == length || j == (k + BandWidth - 1))) { + for(s = 0; s <= count - Word_Length; s++) sum++; + + count = 0; + } + } + } + + return 2 * sum; +} + +static std::vector* +makeProfileScs(std::vector *pscs, MultiSequence *Sequences, Trimat* consBppMat, int BandWidth) +{ + + int length = Sequences->GetSequence(0)->GetLength(); + int Word_Length = scsLength; + float Thr = BaseProbThreshold; + int i, j, k, s, t, m, n, l; + int count; + int sum; + + sum = 0; + for(k = 1; k <= length; k++) { + count = 0; + for(i = k, j = k; i >= 1 && j <= (k + BandWidth - 1) && j <= length; i--, j++) { + if(consBppMat->ref(i,j) >= Thr) { + count++; + } + else if(count >= Word_Length) { + for(s = 0; s <= count- Word_Length; s++) { + sum++; + pscs->at(sum).SetLength(Word_Length); + pscs->at(sum).SetPosition(i+1+s); + pscs->at(sum).SetRvposition(j-count+(count-Word_Length-s)); + pscs->at(sum).SetDistance((j-count+count-Word_Length-s) - (i+1+s+Word_Length)); + pscs->at(sum).SetNumSeq(Sequences->GetNumSequences()); + pscs->at(sum).SetNumSubstr(Sequences->GetNumSequences()); + pscs->at(sum).SetNumRvstr(Sequences->GetNumSequences()); + for(m = i + 1 + s, n = j - count + (count-Word_Length-s), l = j - 1 - s, t = 0; n < j-s; m++, n++, l--, t++) { + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + Sequence *seq = Sequences->GetSequence(num); +// cout << num << "; " << m << ":" << seq->GetPosition(m) << " " << n << ":" << seq->GetPosition(n) << endl; + pscs->at(sum).AddSubstr(num, seq->GetPosition(m)); + pscs->at(sum).AddRvstr(num, seq->GetPosition(n)); + } + // assert(pr[iindx[m]-l] > Thr); +// cout << "prob=" << consBppMat->ref(m,l) << endl; + pscs->at(sum).AddScore(consBppMat->ref(m,l)); + pscs->at(sum).AddBaseScore(consBppMat->ref(m, l)); + } + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + pscs->at(sum).AddSubstr(num, '\0'); + pscs->at(sum).AddRvstr(num, '\0'); + } + } + count = 0; + } + else { + count = 0; + } + if(consBppMat->ref(i,j) >= Thr && count >= Word_Length && (i == 1 || j == length || j == (k + BandWidth - 1))) { + for(s = 0; s <= count- Word_Length; s++) { + sum++; + pscs->at(sum).SetLength(Word_Length); + pscs->at(sum).SetPosition(i+s); + pscs->at(sum).SetRvposition(j-count+1+(count-Word_Length-s)); + pscs->at(sum).SetDistance((j-count+1+count-Word_Length-s) - (i+s+Word_Length)); + pscs->at(sum).SetNumSeq(Sequences->GetNumSequences()); + pscs->at(sum).SetNumSubstr(Sequences->GetNumSequences()); + pscs->at(sum).SetNumRvstr(Sequences->GetNumSequences()); + for(m = i + s, n = j - count + 1 + (count-Word_Length-s), l = j - s, t = 0; n <= j-s; m++, n++, l--, t++) { + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + Sequence *seq = Sequences->GetSequence(num); + pscs->at(sum).AddSubstr(num, seq->GetPosition(m)); + pscs->at(sum).AddRvstr(num, seq->GetPosition(n)); + } + + pscs->at(sum).AddScore(consBppMat->ref(m,l)); + pscs->at(sum).AddBaseScore(consBppMat->ref(m, l)); + } + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + pscs->at(sum).AddSubstr(num, '\0'); + pscs->at(sum).AddRvstr(num, '\0'); + } + } + count = 0; + } + } + count = 0; + for(i = k, j = k + 1; i >= 1 && j <= (k + BandWidth - 1) && j <= length; i--, j++) { + if(consBppMat->ref(i,j) >= Thr) { + count++; + } + else if(count >= Word_Length) { + for(s = 0; s <= count- Word_Length; s++) { + sum++; + pscs->at(sum).SetLength(Word_Length); + pscs->at(sum).SetPosition(i+1+s); + pscs->at(sum).SetRvposition( j-count+(count-Word_Length-s)); + pscs->at(sum).SetDistance((j-count+count-Word_Length-s) - (i+1+s+Word_Length)); + pscs->at(sum).SetNumSeq(Sequences->GetNumSequences()); + pscs->at(sum).SetNumSubstr(Sequences->GetNumSequences()); + pscs->at(sum).SetNumRvstr(Sequences->GetNumSequences()); + for(m = i + 1 + s, n = j - count + (count-Word_Length-s), l = j - 1 - s, t = 0; n < j-s; m++, n++, l--, t++) { + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + Sequence *seq = Sequences->GetSequence(num); + pscs->at(sum).AddSubstr(num, seq->GetPosition(m)); + pscs->at(sum).AddRvstr(num, seq->GetPosition(n)); + } + + pscs->at(sum).AddScore(consBppMat->ref(m,l)); + pscs->at(sum).AddBaseScore(consBppMat->ref(m, l)); + } + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + pscs->at(sum).AddSubstr(num, '\0'); + pscs->at(sum).AddRvstr(num, '\0'); + } + } + count = 0; + } + else { + count = 0; + } + if(consBppMat->ref(i,j) >= Thr && count >= Word_Length && (i == 1 || j == length || j == (k + BandWidth - 1))) { + for(s = 0; s <= count - Word_Length; s++) { + sum++; + pscs->at(sum).SetLength(Word_Length); + pscs->at(sum).SetPosition(i+s); + pscs->at(sum).SetRvposition(j-count+1+(count-Word_Length-s)); + pscs->at(sum).SetDistance((j-count+1+count-Word_Length-s) - (i+s+Word_Length)); +// pscs->at(sum).SetDistance((j-count+count-Word_Length-s) - (i+1+s+Word_Length)); + pscs->at(sum).SetNumSeq(Sequences->GetNumSequences()); + pscs->at(sum).SetNumSubstr(Sequences->GetNumSequences()); + pscs->at(sum).SetNumRvstr(Sequences->GetNumSequences()); + for(m = i + s, n = j - count + 1 + (count-Word_Length-s), l = j - s, t=0; n <= j-s; m++, n++, l--, t++) { + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + Sequence *seq = Sequences->GetSequence(num); + pscs->at(sum).AddSubstr(num, seq->GetPosition(m)); + pscs->at(sum).AddRvstr(num, seq->GetPosition(n)); + } + + pscs->at(sum).AddScore(consBppMat->ref(m,l)); + pscs->at(sum).AddBaseScore(consBppMat->ref(m, l)); + } + for(int num = 0; num < Sequences->GetNumSequences(); num++) { + pscs->at(sum).AddSubstr(num, '\0'); + pscs->at(sum).AddRvstr(num, '\0'); + } + } + count = 0; + } + } + } + + return pscs; +} + +static std::vector* +doubleScs(std::vector *pscs) +{ + int num = pscs->size()/2; + + for(int i = 1; i <= num; i++) { + int latter = num + i; + //cout << i << " " << latter << endl; + StemCandidate &tmpScs = pscs->at(i); + pscs->at(latter).SetLength(tmpScs.GetLength()); + pscs->at(latter).SetPosition(tmpScs.GetRvposition()); + pscs->at(latter).SetRvposition(tmpScs.GetPosition()); + pscs->at(latter).SetDistance(-tmpScs.GetDistance()); + pscs->at(latter).SetNumSeq(tmpScs.GetNumSeq()); + pscs->at(latter).SetNumSubstr(tmpScs.GetNumSeq()); + pscs->at(latter).SetNumRvstr(tmpScs.GetNumSeq()); + + pscs->at(latter).SetScore(tmpScs.GetScore()); + for(int num = 0; num < tmpScs.GetNumSeq(); num++) { + string tmpSubstr = tmpScs.GetSubstr(num); + string tmpRvstr = tmpScs.GetRvstr(num); + + for(int k = 0; k < tmpScs.GetLength(); k++) { + pscs->at(latter).AddSubstr(num, tmpSubstr[k]); + pscs->at(latter).AddRvstr(num, tmpRvstr[k]); + } + } + for(int k = 0; k < tmpScs.GetLength(); k++) { + pscs->at(latter).AddBaseScore(tmpScs.GetBaseScore(k)); + } + } + return pscs; +} + + +static void +printScs(std::vector *pscs) +{ + int num = pscs->size(); +// std::cout << "size = " << num << endl; + for(int i = 1; i < num; i++) { + StemCandidate &sc = pscs->at(i); + + std::cout << i << "\t" << sc.GetLength() << "\t" << sc.GetPosition() << "\t" << + sc.GetRvposition() << "\t" << sc.GetDistance() << "\t" << sc.GetNumSeq() << + "\t" << sc.GetScore() << "\t" << sc.GetContPos() << "\t" << sc.GetBeforePos() << + "\t" << sc.GetRvscnumber() << "\t" << sc.GetStacking() << "\t" << sc.GetStemStacking() << + "\t" << sc.GetBaseScore(0) << "\t" << sc.GetBaseScore(1) << endl; + cout << "substr:" << endl; + for(int k = 0; k < sc.GetNumSeq(); k++) { + cout << k << "\t" << sc.GetSubstr(k) << "\t" << sc.GetRvstr(k) << "\t" << endl; + } + + } + +} + +static std::vector* +findRelations(std::vector *pscs) +{ + int num = pscs->size(); + + for(int i = 1; i < num; i++) { + int pt = i-1; + StemCandidate &sc = pscs->at(i); + sc.SetContPos(-1); + while(sc.GetPosition() == pscs->at(pt).GetPosition()) { pt--; } + + while((sc.GetPosition() == pscs->at(pt).GetPosition() + 1) && (pt > 0)) { + if(sc.GetRvposition() == pscs->at(pt).GetRvposition() - 1) { + sc.SetContPos(pt); + break; + } + --pt; + } + while((sc.GetPosition() < pscs->at(pt).GetPosition() + pscs->at(pt).GetLength())&&(pt > 0)) { pt--; } + sc.SetBeforePos(pt); + } + + return pscs; +} + +static std::vector* +findCorresponding(std::vector* pscs) +{ + int num = pscs->size(); + + for(int i = 1; i < num; i++) { pscs->at(i).SetRvscnumber(0); } + + for(int i = 1; i < num; i++) { + if(pscs->at(i).GetDistance() > 0) { + for(int j = i + 1; j < num; j++) { + if ( (pscs->at(j).GetPosition() == pscs->at(i).GetRvposition()) + && (pscs->at(i).GetPosition() == pscs->at(j).GetRvposition()) ) { + pscs->at(i).SetRvscnumber(j); + pscs->at(j).SetRvscnumber(i); + break; + } + } + } + if(pscs->at(i).GetRvscnumber() == 0) { + std::cerr << "error in findCorresponding" << " i=" << i << endl; +// exit(1); + } + } + + return pscs; +} + +static std::vector* +calculateStackingEnergy(std::vector* pscs) +{ + int num = pscs->size(); + int wordLength = scsLength; + + for(int i = 1; i < num; i++) { + StemCandidate &scI = pscs->at(i); + int j = pscs->at(i).GetContPos(); + + if(j > 0) { + + StemCandidate &scJ = pscs->at(j); + float stacking = 0; + int profNum = scJ.GetNumSeq(); + for(int k = 0; k < profNum; k++) { + string substr = scJ.GetSubstr(k); + string rvstr = scJ.GetRvstr(k); + int index = 0; + switch(substr[wordLength - 1]) { + case 'A': if( rvstr[0]=='U' ) {index += 0;} + else{ index = -1000; } + break; + case 'C': if( rvstr[0]=='G' ) {index += 6;} + else{ index = -1000; } + break; + case 'G': if( rvstr[0]=='C'){index += 12;} + else if(rvstr[0]=='U'){index += 18;} + else{ index = -1000; } + break; + case 'U': if( rvstr[0]=='A'){index += 24;} + else if(rvstr[0]=='G'){index += 30;} + else{ index = - 1000; } + break; + } + substr = scI.GetSubstr(k); + rvstr = scI.GetRvstr(k); + switch(substr[wordLength - 1]){ + case 'A': if( rvstr[0]=='U'){index += 0;} + else{ index = -1000; } + break; + case 'C': if( rvstr[0]=='G'){index += 1;} + else{ index = -1000; } + break; + case 'G': if( rvstr[0]=='C'){index += 2;} + else if(rvstr[0]=='U'){index += 3;} + else{ index = -1000; } + break; + case 'U': if( rvstr[0]=='A'){index += 4;} + else if(rvstr[0]=='G'){index += 5;} + else{ index = -1000; } + break; + } + if(index > 0) { + stacking += Stacking_Energy[index]; + } + } + scI.SetStacking(stacking/(float)profNum); + } + else { + scI.SetStacking(1000); + } + } + + for(int i = 1; i < num; i++) { + StemCandidate &sc = pscs->at(i); + float stemStacking = 0; + int profNum = sc.GetNumSeq(); + for(int k = 0; k < profNum; k++) { + string substr = sc.GetSubstr(k); + string rvstr = sc.GetRvstr(k); + for(int j = 0; j < wordLength-1; j++) { + int index = 0; + + switch(substr[j]) { + case 'A': if( rvstr[wordLength-1-j]=='U'){index += 0;} + else{ index = -1000; } + break; + case 'C': if( rvstr[wordLength-1-j]=='G'){index += 6;} + else{ index = -1000; } + break; + case 'G': if( rvstr[wordLength-1-j]=='C'){index += 12;} + else if(rvstr[wordLength-1-j]=='U'){index += 18;} + else{ index = -1000; } + break; + case 'U': if( rvstr[wordLength-1-j]=='A'){index += 24;} + else if(rvstr[wordLength-1-j]=='G'){index += 30;} + else{ index = -1000; } + break; + } + switch(substr[j+1]){ + case 'A': if( rvstr[wordLength-1-(j+1)]=='U'){index += 0;} + else{ index = -1000; } + break; + case 'C': if( rvstr[wordLength-1-(j+1)]=='G'){index += 1;} + else{ index = -1000; } + break; + case 'G': if( rvstr[wordLength-1-(j+1)]=='C'){index += 2;} + else if(rvstr[wordLength-1-(j+1)]=='U'){index += 3;} + else{ index = -1000; } + break; + case 'U': if( rvstr[wordLength-1-(j+1)]=='A'){index += 4;} + else if(rvstr[wordLength-1-(j+1)]=='G'){index += 5;} + else{ index = -1000; } + break; + } + if(index > 0) { + stemStacking += Stacking_Energy[index]; + } + } + sc.SetStemStacking(stemStacking/(float)profNum); + } + } + return pscs; +} + diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/COPYING b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/COPYING new file mode 100644 index 0000000000..42607acf67 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/COPYING @@ -0,0 +1,15 @@ + Disclaimer and Copyright + +The programs, library and source code of the Vienna RNA Package are free +software. They are distributed in the hope that they will be useful +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +Permission is granted for research, educational, and commercial use +and modification so long as 1) the package and any derived works are not +redistributed for any fee, other than media costs, 2) proper credit is +given to the authors and the Institute for Theoretical Chemistry of the +University of Vienna. + +If you want to include this software in a commercial product, please contact +the authors. \ No newline at end of file diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_const.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_const.h new file mode 100644 index 0000000000..04892da4d8 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_const.h @@ -0,0 +1,23 @@ +/* + + energy constants, formerly defined in + energy_par.h + + customized for use with RNAedit by + S.Kopp, IMB-Jena, Germany, Mar 1996 + +*/ + +#ifndef _ENERGY_CONST_H +#define _ENERGY_CONST_H 1 + +#define GASCONST 1.98717 /* in [cal/K] */ +#define K0 273.15 +#define INF 1000000 +#define FORBIDDEN 9999 +#define BONUS 10000 +#define NBPAIRS 7 +#define TURN 3 +#define MAXLOOP 30 + +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_par.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_par.h new file mode 100644 index 0000000000..48b2737865 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_par.h @@ -0,0 +1,61 @@ +/* + prototypes for energy_par.c +*/ + +#include "energy_const.h" +namespace MXSCARNA { +extern double lxc37; /* parameter for logarithmic loop + energy extrapolation */ + +extern int stack37[NBPAIRS+1][NBPAIRS+1]; +extern int enthalpies[NBPAIRS+1][NBPAIRS+1]; /* stack enthalpies */ +extern int entropies[NBPAIRS+1][NBPAIRS+1]; /* not used anymore */ + +extern int hairpin37[31]; +extern int bulge37[31]; +extern int internal_loop37[31]; +extern int internal2_energy; +extern int old_mismatch_37[NBPAIRS+1][5][5]; +extern int mismatchI37[NBPAIRS+1][5][5]; /* interior loop mismatches */ +extern int mismatchH37[NBPAIRS+1][5][5]; /* same for hairpins */ +extern int mismatchM37[NBPAIRS+1][5][5]; /* same for multiloops */ +extern int mism_H[NBPAIRS+1][5][5]; /* mismatch enthalpies */ + +extern int dangle5_37[NBPAIRS+1][5]; /* 5' dangle exterior of pair */ +extern int dangle3_37[NBPAIRS+1][5]; /* 3' dangle */ +extern int dangle3_H[NBPAIRS+1][5]; /* corresponding enthalpies */ +extern int dangle5_H[NBPAIRS+1][5]; + +extern int int11_37[NBPAIRS+1][NBPAIRS+1][5][5]; /* 1x1 interior loops */ +extern int int11_H[NBPAIRS+1][NBPAIRS+1][5][5]; + +extern int int21_37[NBPAIRS+1][NBPAIRS+1][5][5][5]; /* 2x1 interior loops */ +extern int int21_H[NBPAIRS+1][NBPAIRS+1][5][5][5]; + +extern int int22_37[NBPAIRS+1][NBPAIRS+1][5][5][5][5]; /* 2x2 interior loops */ +extern int int22_H[NBPAIRS+1][NBPAIRS+1][5][5][5][5]; + +/* constants for linearly destabilizing contributions for multi-loops + F = ML_closing + ML_intern*(k-1) + ML_BASE*u */ +extern int ML_BASE37; +extern int ML_closing37; +extern int ML_intern37; + +/* Ninio-correction for asymmetric internal loops with branches n1 and n2 */ +/* ninio_energy = min{max_ninio, |n1-n2|*F_ninio[min{4.0, n1, n2}] } */ +extern int MAX_NINIO; /* maximum correction */ +extern int F_ninio37[5]; + +/* penalty for helices terminated by AU (actually not GC) */ +extern int TerminalAU; +/* penalty for forming bi-molecular duplex */ +extern int DuplexInit; +/* stabilizing contribution due to special hairpins of size 4 (tetraloops) */ +extern char Tetraloops[]; /* string containing the special tetraloops */ +extern int TETRA_ENERGY37[]; /* Bonus energy for special tetraloops */ +extern int TETRA_ENTH37; +extern char Triloops[]; /* string containing the special triloops */ +extern int Triloop_E37[]; /* Bonus energy for special Triloops */ + +extern double Tmeasure; /* temperature of param measurements */ +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.cpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.cpp new file mode 100644 index 0000000000..6834c6e5bb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.cpp @@ -0,0 +1,11600 @@ +#include "energy_param.hpp" + + + +namespace MXSCARNA { +const int energy_param::INF = 10000; +const int energy_param::NST = 0; +const int energy_param::DEF = -50; +const double energy_param::lxc37 = 107.856; +const int +energy_param:: +stack37[8][8] = +/* CG GC GU UG AU UA */ +{ { INF, INF, INF, INF, INF, INF, INF, INF}, + { INF, -240, -330, -210, -140, -210, -210, NST}, // CG + { INF, -330, -340, -250, -150, -220, -240, NST}, // GC + { INF, -210, -250, 130, -50, -140, -130, NST}, // GU + { INF, -140, -150, -50, 30, -60, -100, NST}, // UG + { INF, -210, -220, -140, -60, -110, -90, NST}, // AU + { INF, -210, -240, -130, -100, -90, -130, NST}, // UA + { INF, NST, NST, NST, NST, NST, NST, NST}}; + +/* enthalpies (0.01*kcal/mol at 37 C) for stacked pairs */ +/* different from mfold-2.3, which uses values from mfold-2.2 */ +const int +energy_param:: +enthalpies[8][8] = +/* CG GC GU UG AU UA */ +{ { INF, INF, INF, INF, INF, INF, INF, INF}, + { INF, -1060, -1340, -1210, -560, -1050, -1040, NST}, + { INF, -1340, -1490, -1260, -830, -1140, -1240, NST}, + { INF, -1210, -1260, -1460, -1350, -880, -1280, NST}, + { INF, -560, -830, -1350, -930, -320, -700, NST}, + { INF, -1050, -1140, -880, -320, -940, -680, NST}, + { INF, -1040, -1240, -1280, -700, -680, -770, NST}, + { INF, NST, NST, NST, NST, NST, NST, NST}}; + +/* old values are here just for comparison */ +const int energy_param::oldhairpin37[31] = { /* from ViennaRNA 1.3 */ + INF, INF, INF, 410, 490, 440, 470, 500, 510, 520, 531, + 542, 551, 560, 568, 575, 582, 589, 595, 601, 606, + 611, 616, 621, 626, 630, 634, 638, 642, 646, 650}; + +const int energy_param::hairpin37[31] = { + INF, INF, INF, 570, 560, 560, 540, 590, 560, 640, 650, + 660, 670, 678, 686, 694, 701, 707, 713, 719, 725, + 730, 735, 740, 744, 749, 753, 757, 761, 765, 769}; + +const int energy_param::oldbulge37[31] = { + INF, 390, 310, 350, 420, 480, 500, 516, 531, 543, 555, + 565, 574, 583, 591, 598, 605, 612, 618, 624, 630, + 635, 640, 645, 649, 654, 658, 662, 666, 670, 673}; + +const int energy_param::bulge37[31] = { + INF, 380, 280, 320, 360, 400, 440, 459, 470, 480, 490, + 500, 510, 519, 527, 534, 541, 548, 554, 560, 565, + 571, 576, 580, 585, 589, 594, 598, 602, 605, 609}; + +const int energy_param::oldinternal_loop37[31] = { + INF, INF, 410, 510, 490, 530, 570, 587, 601, 614, 625, + 635, 645, 653, 661, 669, 676, 682, 688, 694, 700, + 705, 710, 715, 720, 724, 728, 732, 736, 740, 744}; + +const int energy_param::internal_loop37[31] = { + INF, INF, 410, 510, 170, 180, 200, 220, 230, 240, 250, + 260, 270, 278, 286, 294, 301, 307, 313, 319, 325, + 330, 335, 340, 345, 349, 353, 357, 361, 365, 369}; + +/* terminal mismatches */ +/* mismatch free energies for interior loops at 37C */ +const int energy_param::mismatchI37[8][5][5] = +{ /* @@ */ + {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}, + { /* CG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 0, 0, -110, 0}, /* A@ AA AC AG AU */ + { 0, 0, 0, 0, 0}, /* C@ CA CC CG CU */ + { 0, -110, 0, 0, 0}, /* G@ GA GC GG GU */ + { 0, 0, 0, 0, -70}},/* U@ UA UC UG UU */ + { /* GC */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 0, 0, -110, 0}, /* A@ AA AC AG AU */ + { 0, 0, 0, 0, 0}, /* C@ CA CC CG CU */ + { 0, -110, 0, 0, 0}, /* G@ GA GC GG GU */ + { 0, 0, 0, 0, -70}},/* U@ UA UC UG UU */ + { /* GU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 70, 70, -40, 70}, /* A@ AA AC AG AU */ + { 0, 70, 70, 70, 70}, /* C@ CA CC CG CU */ + { 0, -40, 70, 70, 70}, /* G@ GA GC GG GU */ + { 0, 70, 70, 70, 0}},/* U@ UA UC UG UU */ + { /* UG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 70, 70, -40, 70}, /* A@ AA AC AG AU */ + { 0, 70, 70, 70, 70}, /* C@ CA CC CG CU */ + { 0, -40, 70, 70, 70}, /* G@ GA GC GG GU */ + { 0, 70, 70, 70, 0}},/* U@ UA UC UG UU */ + { /* AU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 70, 70, -40, 70}, /* A@ AA AC AG AU */ + { 0, 70, 70, 70, 70}, /* C@ CA CC CG CU */ + { 0, -40, 70, 70, 70}, /* G@ GA GC GG GU */ + { 0, 70, 70, 70, 0}},/* U@ UA UC UG UU */ + { /* UA */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 70, 70, -40, 70}, /* A@ AA AC AG AU */ + { 0, 70, 70, 70, 70}, /* C@ CA CC CG CU */ + { 0, -40, 70, 70, 70}, /* G@ GA GC GG GU */ + { 0, 70, 70, 70, 0}},/* U@ UA UC UG UU */ + { /* @@ */ + { 90, 90, 90, 90, 90},{ 90, 90, 90, 90,-20},{ 90, 90, 90, 90, 90}, + { 90,-20, 90, 90, 90},{ 90, 90, 90, 90, 20}} +}; + +/* mismatch free energies for hairpins at 37C */ +const int energy_param::mismatchH37[8][5][5] = +{ /* @@ */ + {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}, + { /* CG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { -90, -150, -150, -140, -180}, /* A@ AA AC AG AU */ + { -90, -100, -90, -290, -80}, /* C@ CA CC CG CU */ + { -90, -220, -200, -160, -110}, /* G@ GA GC GG GU */ + { -90, -170, -140, -180, -200}},/* U@ UA UC UG UU */ + { /* GC */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { -70, -110, -150, -130, -210}, /* A@ AA AC AG AU */ + { -70, -110, -70, -240, -50}, /* C@ CA CC CG CU */ + { -70, -240, -290, -140, -120}, /* G@ GA GC GG GU */ + { -70, -190, -100, -220, -150}},/* U@ UA UC UG UU */ + { /* GU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, 20, -50, -30, -30}, /* A@ AA AC AG AU */ + { 0, -10, -20, -150, -20}, /* C@ CA CC CG CU */ + { 0, -90, -110, -30, 0}, /* G@ GA GC GG GU */ + { 0, -30, -30, -40, -110}},/* U@ UA UC UG UU */ + { /* UG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, -50, -30, -60, -50}, /* A@ AA AC AG AU */ + { 0, -20, -10, -170, 0}, /* C@ CA CC CG CU */ + { 0, -80, -120, -30, -70}, /* G@ GA GC GG GU */ + { 0, -60, -10, -60, -80}},/* U@ UA UC UG UU */ + { /* AU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, -30, -50, -30, -30}, /* A@ AA AC AG AU */ + { 0, -10, -20, -150, -20}, /* C@ CA CC CG CU */ + { 0, -110, -120, -20, 20}, /* G@ GA GC GG GU */ + { 0, -30, -30, -60, -110}},/* U@ UA UC UG UU */ + { /* UA */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { 0, -50, -30, -60, -50}, /* A@ AA AC AG AU */ + { 0, -20, -10, -120, -0}, /* C@ CA CC CG CU */ + { 0, -140, -120, -70, -20}, /* G@ GA GC GG GU */ + { 0, -30, -10, -50, -80}},/* U@ UA UC UG UU */ + { /* @@ */ + { 0, 0, 0, 0, 0},{ 0, 0, 0, 0, 0},{ 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0},{ 0, 0, 0, 0, 0}} +}; + +/* mismatch energies in multiloops */ + +/* these are probably junk */ +/* mismatch enthalpies for temperature scaling */ +const int energy_param::mism_H[8][5][5] = +{ /* no pair */ + {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}, + { /* CG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF,-1030, -950,-1030,-1030}, /* A@ AA AC AG AU */ + { DEF, -520, -450, -520, -670}, /* C@ CA CC CG CU */ + { DEF, -940, -940, -940, -940}, /* G@ GA GC GG GU */ + { DEF, -810, -740, -810, -860}},/* U@ UA UC UG UU */ + { /* GC */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF, -520, -880, -560, -880}, /* A@ AA AC AG AU */ + { DEF, -720, -310, -310, -390}, /* C@ CA CC CG CU */ + { DEF, -710, -740, -620, -740}, /* G@ GA GC GG GU */ + { DEF, -500, -500, -500, -570}},/* U@ UA UC UG UU */ + { /* GU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF, -430, -600, -600, -600}, /* A@ AA AC AG AU */ + { DEF, -260, -240, -240, -240}, /* C@ CA CC CG CU */ + { DEF, -340, -690, -690, -690}, /* G@ GA GC GG GU */ + { DEF, -330, -330, -330, -330}},/* U@ UA UC UG UU */ + { /* UG */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF, -720, -790, -960, -810}, /* A@ AA AC AG AU */ + { DEF, -480, -480, -360, -480}, /* C@ CA CC CG CU */ + { DEF, -660, -810, -920, -810}, /* G@ GA GC GG GU */ + { DEF, -550, -440, -550, -360}},/* U@ UA UC UG UU */ + { /* AU */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF, -430, -600, -600, -600}, /* A@ AA AC AG AU */ + { DEF, -260, -240, -240, -240}, /* C@ CA CC CG CU */ + { DEF, -340, -690, -690, -690}, /* G@ GA GC GG GU */ + { DEF, -330, -330, -330, -330}},/* U@ UA UC UG UU */ + { /* UA */ + { 0, 0, 0, 0, 0}, /* @@ @A @C @G @U */ + { DEF, -400, -630, -890, -590}, /* A@ AA AC AG AU */ + { DEF, -430, -510, -200, -180}, /* C@ CA CC CG CU */ + { DEF, -380, -680, -890, -680}, /* G@ GA GC GG GU */ + { DEF, -280, -140, -280, -140}},/* U@ UA UC UG UU */ + { /* nonstandard pair */ + {DEF,DEF,DEF,DEF,DEF},{DEF,DEF,DEF,DEF,DEF},{DEF,DEF,DEF,DEF,DEF}, + {DEF,DEF,DEF,DEF,DEF},{DEF,DEF,DEF,DEF,DEF}} +}; + +/* 5' dangling ends (unpaird base stacks on first paired base) */ +const int energy_param::dangle5_37[8][5]= +{/* @ A C G U */ + { INF, INF, INF, INF, INF}, /* no pair */ + { INF, -50, -30, -20, -10}, /* CG (stacks on C) */ + { INF, -20, -30, -0, -0}, /* GC (stacks on G) */ + { INF, -30, -30, -40, -20}, /* GU */ + { INF, -30, -10, -20, -20}, /* UG */ + { INF, -30, -30, -40, -20}, /* AU */ + { INF, -30, -10, -20, -20}, /* UA */ + { 0, 0, 0, 0, 0} /* @ */ +}; + +/* 3' dangling ends (unpaired base stacks on second paired base */ +const int energy_param::dangle3_37[8][5]= +{/* @ A C G U */ + { INF, INF, INF, INF, INF}, /* no pair */ + { INF, -110, -40, -130, -60}, /* CG (stacks on G) */ + { INF, -170, -80, -170, -120}, /* GC */ + { INF, -70, -10, -70, -10}, /* GU */ + { INF, -80, -50, -80, -60}, /* UG */ + { INF, -70, -10, -70, -10}, /* AU */ + { INF, -80, -50, -80, -60}, /* UA */ + { 0, 0, 0, 0, 0} /* @ */ +}; + +/* enthalpies for temperature scaling */ +const int energy_param::dangle3_H[8][5] = +{/* @ A C G U */ + { INF, INF, INF, INF, INF}, /* no pair */ + { 0, -740, -280, -640, -360}, + { 0, -900, -410, -860, -750}, + { 0, -740, -240, -720, -490}, + { 0, -490, -90, -550, -230}, + { 0, -570, -70, -580, -220}, + { 0, -490, -90, -550, -230}, + { 0, 0, 0, 0, 0} +}; + +const int energy_param::dangle5_H[8][5] = +{/* @ A C G U */ + { INF, INF, INF, INF, INF}, /* no pair */ + { 0, -240, 330, 80, -140}, + { 0, -160, 70, -460, -40}, + { 0, 160, 220, 70, 310}, + { 0, -150, 510, 10, 100}, + { 0, 160, 220, 70, 310}, + { 0, -50, 690, -60, -60}, + { 0, 0, 0, 0, 0} +}; + + +/* constants for linearly destabilizing contributions for multi-loops + F = ML_closing + ML_intern*k + ML_BASE*u */ +/* old versions erroneously used ML_intern*(k-1) */ + +const int energy_param::ML_BASE37 = 0; +const int energy_param::ML_closing37 = 340; +const int energy_param::ML_intern37 = 40; + + +/* Ninio-correction for asymmetric internal loops with branches n1 and n2 */ +/* ninio_energy = min{max_ninio, |n1-n2|*F_ninio[min{4.0, n1, n2}] } */ +const int energy_param::MAX_NINIO = 300; /* maximum correction */ +const int energy_param::F_ninio37[5] = { 0, 40, 50, 20, 10 }; /* only F[2] used */ + +/* stabilizing contribution due to special hairpins of size 4 (tetraloops) */ + +const char energy_param::Tetraloops[1400] = /* place for up to 200 tetra loops */ + "GGGGAC " + "GGUGAC " + "CGAAAG " + "GGAGAC " + "CGCAAG " + "GGAAAC " + "CGGAAG " + "CUUCGG " + "CGUGAG " + "CGAAGG " + "CUACGG " + "GGCAAC " + "CGCGAG " + "UGAGAG " + "CGAGAG " + "AGAAAU " + "CGUAAG " + "CUAACG " + "UGAAAG " + "GGAAGC " + "GGGAAC " + "UGAAAA " + "AGCAAU " + "AGUAAU " + "CGGGAG " + "AGUGAU " + "GGCGAC " + "GGGAGC " + "GUGAAC " + "UGGAAA " +; + +const char energy_param::Tetrastrings[30][7] = { + "GGGGAC", + "GGUGAC", + "CGAAAG", + "GGAGAC", + "CGCAAG", + "GGAAAC", + "CGGAAG", + "CUUCGG", + "CGUGAG", + "CGAAGG", + "CUACGG", + "GGCAAC", + "CGCGAG", + "UGAGAG", + "CGAGAG", + "AGAAAU", + "CGUAAG", + "CUAACG", + "UGAAAG", + "GGAAGC", + "GGGAAC", + "UGAAAA", + "AGCAAU", + "AGUAAU", + "CGGGAG", + "AGUGAU", + "GGCGAC", + "GGGAGC", + "GUGAAC", + "UGGAAA" +}; + +const int energy_param::TETRA_ENERGY37[200] = { + -300, -300, -300, -300, -300, -300, -300, -300, -300, -250, -250, -250, + -250, -250, -200, -200, -200, -200, -200, -150, -150, -150, -150, -150, + -150, -150, -150, -150, -150, -150}; + +const int energy_param::TETRA_ENTH37 = -400; + + +/* penalty for AU (or GU) terminating helix) */ +/* mismatches already contain these */ +const int energy_param::TerminalAU = 50; + +/* penalty for forming a bi-molecular duplex */ +const int energy_param::DuplexInit = 410; + +//#include "intloops.h" + + +const int energy_param::int11_37[8][8][5][5] = +{ /* noPair */ {{{0}}}, + { /* noPair */ {{0}}, +/* CG..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 40, 40, 40}, +{ 110, 40, 40, 40, 40}, +{ 110, 40, 40, -140, 40}, +{ 110, 40, 40, 40, 40} +}, +/* CG..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 40, -40, 40, 40}, +{ 110, 30, 50, 40, 50}, +{ 110, -10, 40, -170, 40}, +{ 110, 40, 0, 40, -30} +}, +/* CG..GU */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* CG..UG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* CG..AU */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* CG..UA */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* CG..?? */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110} +} +}, +{ /* noPair */ {{0}}, +/* GC..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 40, 30, -10, 40}, +{ 110, -40, 50, 40, 0}, +{ 110, 40, 40, -170, 40}, +{ 110, 40, 50, 40, -30} +}, +/* GC..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 80, 40, 40, 40}, +{ 110, 40, 40, 40, 40}, +{ 110, 40, 40, -210, 40}, +{ 110, 40, 40, 40, -70} +}, +/* GC..GU */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* GC..UG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* GC..AU */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 100} +}, +/* GC..UA */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* GC..?? */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110} +} +}, +{ /* noPair */ {{0}}, +/* GU..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* GU..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* GU..GU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* GU..UG */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* GU..AU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* GU..UA */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* GU..?? */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +} +}, +{ /* noPair */ {{0}}, +/* UG..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* UG..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* UG..GU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UG..UG */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UG..AU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UG..UA */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UG..?? */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +} +}, +{ /* noPair */ {{0}}, +/* AU..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* AU..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 100} +}, +/* AU..GU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* AU..UG */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* AU..AU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 120} +}, +/* AU..UA */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 150} +}, +/* AU..?? */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +} +}, +{ /* noPair */ {{0}}, +/* UA..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* UA..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, -100, 110}, +{ 110, 110, 110, 110, 110} +}, +/* UA..GU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UA..UG */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 170} +}, +/* UA..AU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 150} +}, +/* UA..UA */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, -40, 170}, +{ 170, 170, 170, 170, 180} +}, +/* UA..?? */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +} +}, +{ /* noPair */ {{0}}, +/* ??..CG */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110} +}, +/* ??..GC */ +{{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110}, +{ 110, 110, 110, 110, 110} +}, +/* ??..GU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +}, +/* ??..UG */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +}, +/* ??..AU */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +}, +/* ??..UA */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +}, +/* ??..?? */ +{{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170}, +{ 170, 170, 170, 170, 170} +} +} +}; + +const int energy_param::int11_H[8][8][5][5] = + /* GC..GC */ +{ /* noPair */ {{{0}}}, +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GC.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* CG..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* CG.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* GU..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* GU.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* UG..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UG.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* AU..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* AU.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* UA..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* UA.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}, + /* @..GC */ +{ /* noPair */ {{0}}, +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @..CG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @..GU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @..UG */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @..AU */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @..UA */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}, + /* @.. @ */ +{ { 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0}}}}; + +const int energy_param::int21_37[8][8][5][5][5] = +{ /* noPair */ {{{{0}}}}, +{ /* noPair */ {{{0}}}, +{ +/* CG.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 240, 220, 160, 400},{ 550, 210, 170, 160, 400},{ 550, 100, 60, 40, 400},{ 550, 400, 400, 400, 400}}, +/* CG.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 230, 220, 400, 220},{ 550, 220, 250, 400, 220},{ 550, 400, 400, 400, 400},{ 550, 250, 190, 400, 220}}, +/* CG.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 170, 400, 80, 400},{ 550, 400, 400, 400, 400},{ 550, 80, 400, 220, 400},{ 550, 400, 400, 400, 400}}, +/* CG.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 400, 400, 400, 400},{ 550, 400, 220, 400, 130},{ 550, 400, 400, 400, 400},{ 550, 400, 170, 400, 120}} +}, +{ +/* CG.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 230, 220, 110, 400},{ 550, 210, 170, 160, 400},{ 550, 80, 60, 40, 400},{ 550, 400, 400, 400, 400}}, +/* CG.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 230, 220, 400, 220},{ 550, 220, 250, 400, 220},{ 550, 400, 400, 400, 400},{ 550, 250, 190, 400, 220}}, +/* CG.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 170, 400, 80, 400},{ 550, 400, 400, 400, 400},{ 550, 80, 400, 220, 400},{ 550, 400, 400, 400, 400}}, +/* CG.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 400, 400, 400, 400},{ 550, 400, 220, 400, 150},{ 550, 400, 400, 400, 400},{ 550, 400, 170, 400, 120}} +}, +{ +/* CG.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* CG.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* CG.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* CG.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* CG.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* CG.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* CG.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* CG.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* CG.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* CG.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* CG.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* CG.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* CG.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* CG.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* CG.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* CG.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* CG.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* CG.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* GC.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 220, 210, 400},{ 550, 210, 170, 160, 400},{ 550, 120, 60, 40, 400},{ 550, 400, 400, 400, 400}}, +/* GC.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 230, 220, 400, 220},{ 550, 220, 250, 400, 220},{ 550, 400, 400, 400, 400},{ 550, 250, 190, 400, 220}}, +/* GC.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 170, 400, 80, 400},{ 550, 400, 400, 400, 400},{ 550, 80, 400, 220, 400},{ 550, 400, 400, 400, 400}}, +/* GC.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 400, 400, 400, 400},{ 550, 400, 220, 400, 120},{ 550, 400, 400, 400, 400},{ 550, 400, 170, 400, 120}} +}, +{ +/* GC.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 240, 220, 160, 400},{ 550, 210, 170, 160, 400},{ 550, 100, 60, 40, 400},{ 550, 400, 400, 400, 400}}, +/* GC.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 230, 220, 400, 220},{ 550, 220, 250, 400, 220},{ 550, 400, 400, 400, 400},{ 550, 250, 190, 400, 220}}, +/* GC.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 170, 400, 80, 400},{ 550, 400, 400, 400, 400},{ 550, 80, 400, 220, 400},{ 550, 400, 400, 400, 400}}, +/* GC.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 400, 400, 400, 400},{ 550, 400, 220, 400, 130},{ 550, 400, 400, 400, 400},{ 550, 400, 170, 400, 120}} +}, +{ +/* GC.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GC.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GC.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GC.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GC.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GC.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GC.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GC.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GC.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GC.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GC.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GC.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GC.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GC.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GC.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GC.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GC.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GC.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* GU.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GU.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GU.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GU.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GU.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* GU.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* GU.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* GU.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* GU.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* GU.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* GU.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* GU.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* GU.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* GU.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* GU.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* GU.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* GU.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* GU.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* GU.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* GU.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* GU.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* GU.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* GU.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* GU.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* GU.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* GU.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* UG.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* UG.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* UG.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* UG.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* UG.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* UG.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* UG.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* UG.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* UG.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UG.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UG.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UG.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UG.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UG.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UG.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UG.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UG.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UG.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UG.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UG.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UG.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UG.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UG.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UG.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UG.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UG.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* AU.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* AU.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* AU.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* AU.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* AU.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* AU.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* AU.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* AU.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* AU.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* AU.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* AU.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* AU.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* AU.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* AU.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* AU.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* AU.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* AU.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* AU.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* AU.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* AU.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* AU.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* AU.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* AU.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* AU.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* AU.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* AU.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* UA.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* UA.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* UA.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* UA.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* UA.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 300, 240, 480},{ 550, 290, 250, 240, 480},{ 550, 180, 140, 120, 480},{ 550, 480, 480, 480, 480}}, +/* UA.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 310, 300, 480, 300},{ 550, 300, 330, 480, 300},{ 550, 480, 480, 480, 480},{ 550, 330, 270, 480, 300}}, +/* UA.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 250, 480, 160, 480},{ 550, 480, 480, 480, 480},{ 550, 160, 480, 300, 480},{ 550, 480, 480, 480, 480}}, +/* UA.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 480, 480, 480, 480},{ 550, 480, 300, 480, 210},{ 550, 480, 480, 480, 480},{ 550, 480, 250, 480, 200}} +}, +{ +/* UA.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UA.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UA.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UA.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UA.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UA.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UA.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UA.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UA.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UA.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UA.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UA.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UA.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 390, 370, 310, 550},{ 550, 360, 320, 310, 550},{ 550, 250, 210, 190, 550},{ 550, 550, 550, 550, 550}}, +/* UA.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 380, 370, 550, 370},{ 550, 370, 400, 550, 370},{ 550, 550, 550, 550, 550},{ 550, 400, 340, 550, 370}}, +/* UA.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 320, 550, 230, 550},{ 550, 550, 550, 550, 550},{ 550, 230, 550, 370, 550},{ 550, 550, 550, 550, 550}}, +/* UA.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 370, 550, 280},{ 550, 550, 550, 550, 550},{ 550, 550, 320, 550, 270}} +}, +{ +/* UA.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* UA.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* ??.@..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..GC */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..CG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..UG */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..GU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..UA */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..AU */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +}, +{ +/* ??.@..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.A..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.C..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.G..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}}, +/* ??.U..?? */ +{{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550},{ 550, 550, 550, 550, 550}} +} +} +}; + +const int energy_param::int21_H[8][8][5][5][5] = +{ /* noPair */ {{{{0}}}}, +{ /* noPair */ {{{0}}}, +{ +/* CG.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..CG */ +{{ -50,-1029, -949,-1029,-1029},{-1079,-2058,-1978,-2058,-2058},{ -569,-1548,-1468,-1548,-1548},{ -989,-1968,-1888,-1968,-1968},{ -859,-1838,-1758,-1838,-1838}}, +/* CG.C..CG */ +{{ -50, -519, -449, -519, -669},{ -999,-1468,-1398,-1468,-1618},{ -499, -968, -898, -968,-1118},{ -989,-1458,-1388,-1458,-1608},{ -789,-1258,-1188,-1258,-1408}}, +/* CG.G..CG */ +{{ -50, -939, -939, -939, -939},{-1079,-1968,-1968,-1968,-1968},{ -569,-1458,-1458,-1458,-1458},{ -989,-1878,-1878,-1878,-1878},{ -859,-1748,-1748,-1748,-1748}}, +/* CG.U..CG */ +{{ -50, -809, -739, -809, -859},{-1079,-1838,-1768,-1838,-1888},{ -719,-1478,-1408,-1478,-1528},{ -989,-1748,-1678,-1748,-1798},{ -909,-1668,-1598,-1668,-1718}} +}, +{ +/* CG.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..GC */ +{{ -50,-1029, -949,-1029,-1029},{ -569,-1548,-1468,-1548,-1548},{ -769,-1748,-1668,-1748,-1748},{ -759,-1738,-1658,-1738,-1738},{ -549,-1528,-1448,-1528,-1528}}, +/* CG.C..GC */ +{{ -50, -519, -449, -519, -669},{ -929,-1398,-1328,-1398,-1548},{ -359, -828, -758, -828, -978},{ -789,-1258,-1188,-1258,-1408},{ -549,-1018, -948,-1018,-1168}}, +/* CG.G..GC */ +{{ -50, -939, -939, -939, -939},{ -609,-1498,-1498,-1498,-1498},{ -359,-1248,-1248,-1248,-1248},{ -669,-1558,-1558,-1558,-1558},{ -549,-1438,-1438,-1438,-1438}}, +/* CG.U..GC */ +{{ -50, -809, -739, -809, -859},{ -929,-1688,-1618,-1688,-1738},{ -439,-1198,-1128,-1198,-1248},{ -789,-1548,-1478,-1548,-1598},{ -619,-1378,-1308,-1378,-1428}} +}, +{ +/* CG.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..GU */ +{{ -50,-1029, -949,-1029,-1029},{ -479,-1458,-1378,-1458,-1458},{ -309,-1288,-1208,-1288,-1288},{ -389,-1368,-1288,-1368,-1368},{ -379,-1358,-1278,-1358,-1358}}, +/* CG.C..GU */ +{{ -50, -519, -449, -519, -669},{ -649,-1118,-1048,-1118,-1268},{ -289, -758, -688, -758, -908},{ -739,-1208,-1138,-1208,-1358},{ -379, -848, -778, -848, -998}}, +/* CG.G..GU */ +{{ -50, -939, -939, -939, -939},{ -649,-1538,-1538,-1538,-1538},{ -289,-1178,-1178,-1178,-1178},{ -739,-1628,-1628,-1628,-1628},{ -379,-1268,-1268,-1268,-1268}}, +/* CG.U..GU */ +{{ -50, -809, -739, -809, -859},{ -649,-1408,-1338,-1408,-1458},{ -289,-1048, -978,-1048,-1098},{ -739,-1498,-1428,-1498,-1548},{ -379,-1138,-1068,-1138,-1188}} +}, +{ +/* CG.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..UG */ +{{ -50,-1029, -949,-1029,-1029},{ -769,-1748,-1668,-1748,-1748},{ -529,-1508,-1428,-1508,-1508},{ -709,-1688,-1608,-1688,-1688},{ -599,-1578,-1498,-1578,-1578}}, +/* CG.C..UG */ +{{ -50, -519, -449, -519, -669},{ -839,-1308,-1238,-1308,-1458},{ -529, -998, -928, -998,-1148},{ -859,-1328,-1258,-1328,-1478},{ -489, -958, -888, -958,-1108}}, +/* CG.G..UG */ +{{ -50, -939, -939, -939, -939},{-1009,-1898,-1898,-1898,-1898},{ -409,-1298,-1298,-1298,-1298},{ -969,-1858,-1858,-1858,-1858},{ -599,-1488,-1488,-1488,-1488}}, +/* CG.U..UG */ +{{ -50, -809, -739, -809, -859},{ -859,-1618,-1548,-1618,-1668},{ -529,-1288,-1218,-1288,-1338},{ -859,-1618,-1548,-1618,-1668},{ -409,-1168,-1098,-1168,-1218}} +}, +{ +/* CG.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..AU */ +{{ -50,-1029, -949,-1029,-1029},{ -479,-1458,-1378,-1458,-1458},{ -309,-1288,-1208,-1288,-1288},{ -389,-1368,-1288,-1368,-1368},{ -379,-1358,-1278,-1358,-1358}}, +/* CG.C..AU */ +{{ -50, -519, -449, -519, -669},{ -649,-1118,-1048,-1118,-1268},{ -289, -758, -688, -758, -908},{ -739,-1208,-1138,-1208,-1358},{ -379, -848, -778, -848, -998}}, +/* CG.G..AU */ +{{ -50, -939, -939, -939, -939},{ -649,-1538,-1538,-1538,-1538},{ -289,-1178,-1178,-1178,-1178},{ -739,-1628,-1628,-1628,-1628},{ -379,-1268,-1268,-1268,-1268}}, +/* CG.U..AU */ +{{ -50, -809, -739, -809, -859},{ -649,-1408,-1338,-1408,-1458},{ -289,-1048, -978,-1048,-1098},{ -739,-1498,-1428,-1498,-1548},{ -379,-1138,-1068,-1138,-1188}} +}, +{ +/* CG.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A..UA */ +{{ -50,-1029, -949,-1029,-1029},{ -449,-1428,-1348,-1428,-1428},{ -479,-1458,-1378,-1458,-1458},{ -429,-1408,-1328,-1408,-1408},{ -329,-1308,-1228,-1308,-1308}}, +/* CG.C..UA */ +{{ -50, -519, -449, -519, -669},{ -679,-1148,-1078,-1148,-1298},{ -559,-1028, -958,-1028,-1178},{ -729,-1198,-1128,-1198,-1348},{ -189, -658, -588, -658, -808}}, +/* CG.G..UA */ +{{ -50, -939, -939, -939, -939},{ -939,-1828,-1828,-1828,-1828},{ -249,-1138,-1138,-1138,-1138},{ -939,-1828,-1828,-1828,-1828},{ -329,-1218,-1218,-1218,-1218}}, +/* CG.U..UA */ +{{ -50, -809, -739, -809, -859},{ -639,-1398,-1328,-1398,-1448},{ -229, -988, -918, -988,-1038},{ -729,-1488,-1418,-1488,-1538},{ -190, -949, -879, -949, -999}} +}, +{ +/* CG.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* CG.A.. @ */ +{{ -100,-1079, -999,-1079,-1079},{ -100,-1079, -999,-1079,-1079},{ -100,-1079, -999,-1079,-1079},{ -100,-1079, -999,-1079,-1079},{ -100,-1079, -999,-1079,-1079}}, +/* CG.C.. @ */ +{{ -100, -569, -499, -569, -719},{ -100, -569, -499, -569, -719},{ -100, -569, -499, -569, -719},{ -100, -569, -499, -569, -719},{ -100, -569, -499, -569, -719}}, +/* CG.G.. @ */ +{{ -100, -989, -989, -989, -989},{ -100, -989, -989, -989, -989},{ -100, -989, -989, -989, -989},{ -100, -989, -989, -989, -989},{ -100, -989, -989, -989, -989}}, +/* CG.U.. @ */ +{{ -100, -859, -789, -859, -909},{ -100, -859, -789, -859, -909},{ -100, -859, -789, -859, -909},{ -100, -859, -789, -859, -909},{ -100, -859, -789, -859, -909}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* GC.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..CG */ +{{ -50, -519, -879, -559, -879},{-1079,-1548,-1908,-1588,-1908},{ -569,-1038,-1398,-1078,-1398},{ -989,-1458,-1818,-1498,-1818},{ -859,-1328,-1688,-1368,-1688}}, +/* GC.C..CG */ +{{ -50, -719, -309, -309, -389},{ -999,-1668,-1258,-1258,-1338},{ -499,-1168, -758, -758, -838},{ -989,-1658,-1248,-1248,-1328},{ -789,-1458,-1048,-1048,-1128}}, +/* GC.G..CG */ +{{ -50, -709, -739, -619, -739},{-1079,-1738,-1768,-1648,-1768},{ -569,-1228,-1258,-1138,-1258},{ -989,-1648,-1678,-1558,-1678},{ -859,-1518,-1548,-1428,-1548}}, +/* GC.U..CG */ +{{ -50, -499, -499, -499, -569},{-1079,-1528,-1528,-1528,-1598},{ -719,-1168,-1168,-1168,-1238},{ -989,-1438,-1438,-1438,-1508},{ -909,-1358,-1358,-1358,-1428}} +}, +{ +/* GC.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..GC */ +{{ -50, -519, -879, -559, -879},{ -569,-1038,-1398,-1078,-1398},{ -769,-1238,-1598,-1278,-1598},{ -759,-1228,-1588,-1268,-1588},{ -549,-1018,-1378,-1058,-1378}}, +/* GC.C..GC */ +{{ -50, -719, -309, -309, -389},{ -929,-1598,-1188,-1188,-1268},{ -359,-1028, -618, -618, -698},{ -789,-1458,-1048,-1048,-1128},{ -549,-1218, -808, -808, -888}}, +/* GC.G..GC */ +{{ -50, -709, -739, -619, -739},{ -609,-1268,-1298,-1178,-1298},{ -359,-1018,-1048, -928,-1048},{ -669,-1328,-1358,-1238,-1358},{ -549,-1208,-1238,-1118,-1238}}, +/* GC.U..GC */ +{{ -50, -499, -499, -499, -569},{ -929,-1378,-1378,-1378,-1448},{ -439, -888, -888, -888, -958},{ -789,-1238,-1238,-1238,-1308},{ -619,-1068,-1068,-1068,-1138}} +}, +{ +/* GC.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..GU */ +{{ -50, -519, -879, -559, -879},{ -479, -948,-1308, -988,-1308},{ -309, -778,-1138, -818,-1138},{ -389, -858,-1218, -898,-1218},{ -379, -848,-1208, -888,-1208}}, +/* GC.C..GU */ +{{ -50, -719, -309, -309, -389},{ -649,-1318, -908, -908, -988},{ -289, -958, -548, -548, -628},{ -739,-1408, -998, -998,-1078},{ -379,-1048, -638, -638, -718}}, +/* GC.G..GU */ +{{ -50, -709, -739, -619, -739},{ -649,-1308,-1338,-1218,-1338},{ -289, -948, -978, -858, -978},{ -739,-1398,-1428,-1308,-1428},{ -379,-1038,-1068, -948,-1068}}, +/* GC.U..GU */ +{{ -50, -499, -499, -499, -569},{ -649,-1098,-1098,-1098,-1168},{ -289, -738, -738, -738, -808},{ -739,-1188,-1188,-1188,-1258},{ -379, -828, -828, -828, -898}} +}, +{ +/* GC.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..UG */ +{{ -50, -519, -879, -559, -879},{ -769,-1238,-1598,-1278,-1598},{ -529, -998,-1358,-1038,-1358},{ -709,-1178,-1538,-1218,-1538},{ -599,-1068,-1428,-1108,-1428}}, +/* GC.C..UG */ +{{ -50, -719, -309, -309, -389},{ -839,-1508,-1098,-1098,-1178},{ -529,-1198, -788, -788, -868},{ -859,-1528,-1118,-1118,-1198},{ -489,-1158, -748, -748, -828}}, +/* GC.G..UG */ +{{ -50, -709, -739, -619, -739},{-1009,-1668,-1698,-1578,-1698},{ -409,-1068,-1098, -978,-1098},{ -969,-1628,-1658,-1538,-1658},{ -599,-1258,-1288,-1168,-1288}}, +/* GC.U..UG */ +{{ -50, -499, -499, -499, -569},{ -859,-1308,-1308,-1308,-1378},{ -529, -978, -978, -978,-1048},{ -859,-1308,-1308,-1308,-1378},{ -409, -858, -858, -858, -928}} +}, +{ +/* GC.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..AU */ +{{ -50, -519, -879, -559, -879},{ -479, -948,-1308, -988,-1308},{ -309, -778,-1138, -818,-1138},{ -389, -858,-1218, -898,-1218},{ -379, -848,-1208, -888,-1208}}, +/* GC.C..AU */ +{{ -50, -719, -309, -309, -389},{ -649,-1318, -908, -908, -988},{ -289, -958, -548, -548, -628},{ -739,-1408, -998, -998,-1078},{ -379,-1048, -638, -638, -718}}, +/* GC.G..AU */ +{{ -50, -709, -739, -619, -739},{ -649,-1308,-1338,-1218,-1338},{ -289, -948, -978, -858, -978},{ -739,-1398,-1428,-1308,-1428},{ -379,-1038,-1068, -948,-1068}}, +/* GC.U..AU */ +{{ -50, -499, -499, -499, -569},{ -649,-1098,-1098,-1098,-1168},{ -289, -738, -738, -738, -808},{ -739,-1188,-1188,-1188,-1258},{ -379, -828, -828, -828, -898}} +}, +{ +/* GC.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A..UA */ +{{ -50, -519, -879, -559, -879},{ -449, -918,-1278, -958,-1278},{ -479, -948,-1308, -988,-1308},{ -429, -898,-1258, -938,-1258},{ -329, -798,-1158, -838,-1158}}, +/* GC.C..UA */ +{{ -50, -719, -309, -309, -389},{ -679,-1348, -938, -938,-1018},{ -559,-1228, -818, -818, -898},{ -729,-1398, -988, -988,-1068},{ -189, -858, -448, -448, -528}}, +/* GC.G..UA */ +{{ -50, -709, -739, -619, -739},{ -939,-1598,-1628,-1508,-1628},{ -249, -908, -938, -818, -938},{ -939,-1598,-1628,-1508,-1628},{ -329, -988,-1018, -898,-1018}}, +/* GC.U..UA */ +{{ -50, -499, -499, -499, -569},{ -639,-1088,-1088,-1088,-1158},{ -229, -678, -678, -678, -748},{ -729,-1178,-1178,-1178,-1248},{ -190, -639, -639, -639, -709}} +}, +{ +/* GC.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GC.A.. @ */ +{{ -100, -569, -929, -609, -929},{ -100, -569, -929, -609, -929},{ -100, -569, -929, -609, -929},{ -100, -569, -929, -609, -929},{ -100, -569, -929, -609, -929}}, +/* GC.C.. @ */ +{{ -100, -769, -359, -359, -439},{ -100, -769, -359, -359, -439},{ -100, -769, -359, -359, -439},{ -100, -769, -359, -359, -439},{ -100, -769, -359, -359, -439}}, +/* GC.G.. @ */ +{{ -100, -759, -789, -669, -789},{ -100, -759, -789, -669, -789},{ -100, -759, -789, -669, -789},{ -100, -759, -789, -669, -789},{ -100, -759, -789, -669, -789}}, +/* GC.U.. @ */ +{{ -100, -549, -549, -549, -619},{ -100, -549, -549, -549, -619},{ -100, -549, -549, -549, -619},{ -100, -549, -549, -549, -619},{ -100, -549, -549, -549, -619}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* GU.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..CG */ +{{ -50, -429, -599, -599, -599},{-1079,-1458,-1628,-1628,-1628},{ -569, -948,-1118,-1118,-1118},{ -989,-1368,-1538,-1538,-1538},{ -859,-1238,-1408,-1408,-1408}}, +/* GU.C..CG */ +{{ -50, -259, -239, -239, -239},{ -999,-1208,-1188,-1188,-1188},{ -499, -708, -688, -688, -688},{ -989,-1198,-1178,-1178,-1178},{ -789, -998, -978, -978, -978}}, +/* GU.G..CG */ +{{ -50, -339, -689, -689, -689},{-1079,-1368,-1718,-1718,-1718},{ -569, -858,-1208,-1208,-1208},{ -989,-1278,-1628,-1628,-1628},{ -859,-1148,-1498,-1498,-1498}}, +/* GU.U..CG */ +{{ -50, -329, -329, -329, -329},{-1079,-1358,-1358,-1358,-1358},{ -719, -998, -998, -998, -998},{ -989,-1268,-1268,-1268,-1268},{ -909,-1188,-1188,-1188,-1188}} +}, +{ +/* GU.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..GC */ +{{ -50, -429, -599, -599, -599},{ -569, -948,-1118,-1118,-1118},{ -769,-1148,-1318,-1318,-1318},{ -759,-1138,-1308,-1308,-1308},{ -549, -928,-1098,-1098,-1098}}, +/* GU.C..GC */ +{{ -50, -259, -239, -239, -239},{ -929,-1138,-1118,-1118,-1118},{ -359, -568, -548, -548, -548},{ -789, -998, -978, -978, -978},{ -549, -758, -738, -738, -738}}, +/* GU.G..GC */ +{{ -50, -339, -689, -689, -689},{ -609, -898,-1248,-1248,-1248},{ -359, -648, -998, -998, -998},{ -669, -958,-1308,-1308,-1308},{ -549, -838,-1188,-1188,-1188}}, +/* GU.U..GC */ +{{ -50, -329, -329, -329, -329},{ -929,-1208,-1208,-1208,-1208},{ -439, -718, -718, -718, -718},{ -789,-1068,-1068,-1068,-1068},{ -619, -898, -898, -898, -898}} +}, +{ +/* GU.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..GU */ +{{ -50, -429, -599, -599, -599},{ -479, -858,-1028,-1028,-1028},{ -309, -688, -858, -858, -858},{ -389, -768, -938, -938, -938},{ -379, -758, -928, -928, -928}}, +/* GU.C..GU */ +{{ -50, -259, -239, -239, -239},{ -649, -858, -838, -838, -838},{ -289, -498, -478, -478, -478},{ -739, -948, -928, -928, -928},{ -379, -588, -568, -568, -568}}, +/* GU.G..GU */ +{{ -50, -339, -689, -689, -689},{ -649, -938,-1288,-1288,-1288},{ -289, -578, -928, -928, -928},{ -739,-1028,-1378,-1378,-1378},{ -379, -668,-1018,-1018,-1018}}, +/* GU.U..GU */ +{{ -50, -329, -329, -329, -329},{ -649, -928, -928, -928, -928},{ -289, -568, -568, -568, -568},{ -739,-1018,-1018,-1018,-1018},{ -379, -658, -658, -658, -658}} +}, +{ +/* GU.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..UG */ +{{ -50, -429, -599, -599, -599},{ -769,-1148,-1318,-1318,-1318},{ -529, -908,-1078,-1078,-1078},{ -709,-1088,-1258,-1258,-1258},{ -599, -978,-1148,-1148,-1148}}, +/* GU.C..UG */ +{{ -50, -259, -239, -239, -239},{ -839,-1048,-1028,-1028,-1028},{ -529, -738, -718, -718, -718},{ -859,-1068,-1048,-1048,-1048},{ -489, -698, -678, -678, -678}}, +/* GU.G..UG */ +{{ -50, -339, -689, -689, -689},{-1009,-1298,-1648,-1648,-1648},{ -409, -698,-1048,-1048,-1048},{ -969,-1258,-1608,-1608,-1608},{ -599, -888,-1238,-1238,-1238}}, +/* GU.U..UG */ +{{ -50, -329, -329, -329, -329},{ -859,-1138,-1138,-1138,-1138},{ -529, -808, -808, -808, -808},{ -859,-1138,-1138,-1138,-1138},{ -409, -688, -688, -688, -688}} +}, +{ +/* GU.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..AU */ +{{ -50, -429, -599, -599, -599},{ -479, -858,-1028,-1028,-1028},{ -309, -688, -858, -858, -858},{ -389, -768, -938, -938, -938},{ -379, -758, -928, -928, -928}}, +/* GU.C..AU */ +{{ -50, -259, -239, -239, -239},{ -649, -858, -838, -838, -838},{ -289, -498, -478, -478, -478},{ -739, -948, -928, -928, -928},{ -379, -588, -568, -568, -568}}, +/* GU.G..AU */ +{{ -50, -339, -689, -689, -689},{ -649, -938,-1288,-1288,-1288},{ -289, -578, -928, -928, -928},{ -739,-1028,-1378,-1378,-1378},{ -379, -668,-1018,-1018,-1018}}, +/* GU.U..AU */ +{{ -50, -329, -329, -329, -329},{ -649, -928, -928, -928, -928},{ -289, -568, -568, -568, -568},{ -739,-1018,-1018,-1018,-1018},{ -379, -658, -658, -658, -658}} +}, +{ +/* GU.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A..UA */ +{{ -50, -429, -599, -599, -599},{ -449, -828, -998, -998, -998},{ -479, -858,-1028,-1028,-1028},{ -429, -808, -978, -978, -978},{ -329, -708, -878, -878, -878}}, +/* GU.C..UA */ +{{ -50, -259, -239, -239, -239},{ -679, -888, -868, -868, -868},{ -559, -768, -748, -748, -748},{ -729, -938, -918, -918, -918},{ -189, -398, -378, -378, -378}}, +/* GU.G..UA */ +{{ -50, -339, -689, -689, -689},{ -939,-1228,-1578,-1578,-1578},{ -249, -538, -888, -888, -888},{ -939,-1228,-1578,-1578,-1578},{ -329, -618, -968, -968, -968}}, +/* GU.U..UA */ +{{ -50, -329, -329, -329, -329},{ -639, -918, -918, -918, -918},{ -229, -508, -508, -508, -508},{ -729,-1008,-1008,-1008,-1008},{ -190, -469, -469, -469, -469}} +}, +{ +/* GU.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* GU.A.. @ */ +{{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649}}, +/* GU.C.. @ */ +{{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289}}, +/* GU.G.. @ */ +{{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739}}, +/* GU.U.. @ */ +{{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* UG.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..CG */ +{{ -50, -719, -789, -959, -809},{-1079,-1748,-1818,-1988,-1838},{ -569,-1238,-1308,-1478,-1328},{ -989,-1658,-1728,-1898,-1748},{ -859,-1528,-1598,-1768,-1618}}, +/* UG.C..CG */ +{{ -50, -479, -479, -359, -479},{ -999,-1428,-1428,-1308,-1428},{ -499, -928, -928, -808, -928},{ -989,-1418,-1418,-1298,-1418},{ -789,-1218,-1218,-1098,-1218}}, +/* UG.G..CG */ +{{ -50, -659, -809, -919, -809},{-1079,-1688,-1838,-1948,-1838},{ -569,-1178,-1328,-1438,-1328},{ -989,-1598,-1748,-1858,-1748},{ -859,-1468,-1618,-1728,-1618}}, +/* UG.U..CG */ +{{ -50, -549, -439, -549, -359},{-1079,-1578,-1468,-1578,-1388},{ -719,-1218,-1108,-1218,-1028},{ -989,-1488,-1378,-1488,-1298},{ -909,-1408,-1298,-1408,-1218}} +}, +{ +/* UG.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..GC */ +{{ -50, -719, -789, -959, -809},{ -569,-1238,-1308,-1478,-1328},{ -769,-1438,-1508,-1678,-1528},{ -759,-1428,-1498,-1668,-1518},{ -549,-1218,-1288,-1458,-1308}}, +/* UG.C..GC */ +{{ -50, -479, -479, -359, -479},{ -929,-1358,-1358,-1238,-1358},{ -359, -788, -788, -668, -788},{ -789,-1218,-1218,-1098,-1218},{ -549, -978, -978, -858, -978}}, +/* UG.G..GC */ +{{ -50, -659, -809, -919, -809},{ -609,-1218,-1368,-1478,-1368},{ -359, -968,-1118,-1228,-1118},{ -669,-1278,-1428,-1538,-1428},{ -549,-1158,-1308,-1418,-1308}}, +/* UG.U..GC */ +{{ -50, -549, -439, -549, -359},{ -929,-1428,-1318,-1428,-1238},{ -439, -938, -828, -938, -748},{ -789,-1288,-1178,-1288,-1098},{ -619,-1118,-1008,-1118, -928}} +}, +{ +/* UG.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..GU */ +{{ -50, -719, -789, -959, -809},{ -479,-1148,-1218,-1388,-1238},{ -309, -978,-1048,-1218,-1068},{ -389,-1058,-1128,-1298,-1148},{ -379,-1048,-1118,-1288,-1138}}, +/* UG.C..GU */ +{{ -50, -479, -479, -359, -479},{ -649,-1078,-1078, -958,-1078},{ -289, -718, -718, -598, -718},{ -739,-1168,-1168,-1048,-1168},{ -379, -808, -808, -688, -808}}, +/* UG.G..GU */ +{{ -50, -659, -809, -919, -809},{ -649,-1258,-1408,-1518,-1408},{ -289, -898,-1048,-1158,-1048},{ -739,-1348,-1498,-1608,-1498},{ -379, -988,-1138,-1248,-1138}}, +/* UG.U..GU */ +{{ -50, -549, -439, -549, -359},{ -649,-1148,-1038,-1148, -958},{ -289, -788, -678, -788, -598},{ -739,-1238,-1128,-1238,-1048},{ -379, -878, -768, -878, -688}} +}, +{ +/* UG.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..UG */ +{{ -50, -719, -789, -959, -809},{ -769,-1438,-1508,-1678,-1528},{ -529,-1198,-1268,-1438,-1288},{ -709,-1378,-1448,-1618,-1468},{ -599,-1268,-1338,-1508,-1358}}, +/* UG.C..UG */ +{{ -50, -479, -479, -359, -479},{ -839,-1268,-1268,-1148,-1268},{ -529, -958, -958, -838, -958},{ -859,-1288,-1288,-1168,-1288},{ -489, -918, -918, -798, -918}}, +/* UG.G..UG */ +{{ -50, -659, -809, -919, -809},{-1009,-1618,-1768,-1878,-1768},{ -409,-1018,-1168,-1278,-1168},{ -969,-1578,-1728,-1838,-1728},{ -599,-1208,-1358,-1468,-1358}}, +/* UG.U..UG */ +{{ -50, -549, -439, -549, -359},{ -859,-1358,-1248,-1358,-1168},{ -529,-1028, -918,-1028, -838},{ -859,-1358,-1248,-1358,-1168},{ -409, -908, -798, -908, -718}} +}, +{ +/* UG.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..AU */ +{{ -50, -719, -789, -959, -809},{ -479,-1148,-1218,-1388,-1238},{ -309, -978,-1048,-1218,-1068},{ -389,-1058,-1128,-1298,-1148},{ -379,-1048,-1118,-1288,-1138}}, +/* UG.C..AU */ +{{ -50, -479, -479, -359, -479},{ -649,-1078,-1078, -958,-1078},{ -289, -718, -718, -598, -718},{ -739,-1168,-1168,-1048,-1168},{ -379, -808, -808, -688, -808}}, +/* UG.G..AU */ +{{ -50, -659, -809, -919, -809},{ -649,-1258,-1408,-1518,-1408},{ -289, -898,-1048,-1158,-1048},{ -739,-1348,-1498,-1608,-1498},{ -379, -988,-1138,-1248,-1138}}, +/* UG.U..AU */ +{{ -50, -549, -439, -549, -359},{ -649,-1148,-1038,-1148, -958},{ -289, -788, -678, -788, -598},{ -739,-1238,-1128,-1238,-1048},{ -379, -878, -768, -878, -688}} +}, +{ +/* UG.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A..UA */ +{{ -50, -719, -789, -959, -809},{ -449,-1118,-1188,-1358,-1208},{ -479,-1148,-1218,-1388,-1238},{ -429,-1098,-1168,-1338,-1188},{ -329, -998,-1068,-1238,-1088}}, +/* UG.C..UA */ +{{ -50, -479, -479, -359, -479},{ -679,-1108,-1108, -988,-1108},{ -559, -988, -988, -868, -988},{ -729,-1158,-1158,-1038,-1158},{ -189, -618, -618, -498, -618}}, +/* UG.G..UA */ +{{ -50, -659, -809, -919, -809},{ -939,-1548,-1698,-1808,-1698},{ -249, -858,-1008,-1118,-1008},{ -939,-1548,-1698,-1808,-1698},{ -329, -938,-1088,-1198,-1088}}, +/* UG.U..UA */ +{{ -50, -549, -439, -549, -359},{ -639,-1138,-1028,-1138, -948},{ -229, -728, -618, -728, -538},{ -729,-1228,-1118,-1228,-1038},{ -190, -689, -579, -689, -499}} +}, +{ +/* UG.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UG.A.. @ */ +{{ -100, -769, -839,-1009, -859},{ -100, -769, -839,-1009, -859},{ -100, -769, -839,-1009, -859},{ -100, -769, -839,-1009, -859},{ -100, -769, -839,-1009, -859}}, +/* UG.C.. @ */ +{{ -100, -529, -529, -409, -529},{ -100, -529, -529, -409, -529},{ -100, -529, -529, -409, -529},{ -100, -529, -529, -409, -529},{ -100, -529, -529, -409, -529}}, +/* UG.G.. @ */ +{{ -100, -709, -859, -969, -859},{ -100, -709, -859, -969, -859},{ -100, -709, -859, -969, -859},{ -100, -709, -859, -969, -859},{ -100, -709, -859, -969, -859}}, +/* UG.U.. @ */ +{{ -100, -599, -489, -599, -409},{ -100, -599, -489, -599, -409},{ -100, -599, -489, -599, -409},{ -100, -599, -489, -599, -409},{ -100, -599, -489, -599, -409}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* AU.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..CG */ +{{ -50, -429, -599, -599, -599},{-1079,-1458,-1628,-1628,-1628},{ -569, -948,-1118,-1118,-1118},{ -989,-1368,-1538,-1538,-1538},{ -859,-1238,-1408,-1408,-1408}}, +/* AU.C..CG */ +{{ -50, -259, -239, -239, -239},{ -999,-1208,-1188,-1188,-1188},{ -499, -708, -688, -688, -688},{ -989,-1198,-1178,-1178,-1178},{ -789, -998, -978, -978, -978}}, +/* AU.G..CG */ +{{ -50, -339, -689, -689, -689},{-1079,-1368,-1718,-1718,-1718},{ -569, -858,-1208,-1208,-1208},{ -989,-1278,-1628,-1628,-1628},{ -859,-1148,-1498,-1498,-1498}}, +/* AU.U..CG */ +{{ -50, -329, -329, -329, -329},{-1079,-1358,-1358,-1358,-1358},{ -719, -998, -998, -998, -998},{ -989,-1268,-1268,-1268,-1268},{ -909,-1188,-1188,-1188,-1188}} +}, +{ +/* AU.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..GC */ +{{ -50, -429, -599, -599, -599},{ -569, -948,-1118,-1118,-1118},{ -769,-1148,-1318,-1318,-1318},{ -759,-1138,-1308,-1308,-1308},{ -549, -928,-1098,-1098,-1098}}, +/* AU.C..GC */ +{{ -50, -259, -239, -239, -239},{ -929,-1138,-1118,-1118,-1118},{ -359, -568, -548, -548, -548},{ -789, -998, -978, -978, -978},{ -549, -758, -738, -738, -738}}, +/* AU.G..GC */ +{{ -50, -339, -689, -689, -689},{ -609, -898,-1248,-1248,-1248},{ -359, -648, -998, -998, -998},{ -669, -958,-1308,-1308,-1308},{ -549, -838,-1188,-1188,-1188}}, +/* AU.U..GC */ +{{ -50, -329, -329, -329, -329},{ -929,-1208,-1208,-1208,-1208},{ -439, -718, -718, -718, -718},{ -789,-1068,-1068,-1068,-1068},{ -619, -898, -898, -898, -898}} +}, +{ +/* AU.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..GU */ +{{ -50, -429, -599, -599, -599},{ -479, -858,-1028,-1028,-1028},{ -309, -688, -858, -858, -858},{ -389, -768, -938, -938, -938},{ -379, -758, -928, -928, -928}}, +/* AU.C..GU */ +{{ -50, -259, -239, -239, -239},{ -649, -858, -838, -838, -838},{ -289, -498, -478, -478, -478},{ -739, -948, -928, -928, -928},{ -379, -588, -568, -568, -568}}, +/* AU.G..GU */ +{{ -50, -339, -689, -689, -689},{ -649, -938,-1288,-1288,-1288},{ -289, -578, -928, -928, -928},{ -739,-1028,-1378,-1378,-1378},{ -379, -668,-1018,-1018,-1018}}, +/* AU.U..GU */ +{{ -50, -329, -329, -329, -329},{ -649, -928, -928, -928, -928},{ -289, -568, -568, -568, -568},{ -739,-1018,-1018,-1018,-1018},{ -379, -658, -658, -658, -658}} +}, +{ +/* AU.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..UG */ +{{ -50, -429, -599, -599, -599},{ -769,-1148,-1318,-1318,-1318},{ -529, -908,-1078,-1078,-1078},{ -709,-1088,-1258,-1258,-1258},{ -599, -978,-1148,-1148,-1148}}, +/* AU.C..UG */ +{{ -50, -259, -239, -239, -239},{ -839,-1048,-1028,-1028,-1028},{ -529, -738, -718, -718, -718},{ -859,-1068,-1048,-1048,-1048},{ -489, -698, -678, -678, -678}}, +/* AU.G..UG */ +{{ -50, -339, -689, -689, -689},{-1009,-1298,-1648,-1648,-1648},{ -409, -698,-1048,-1048,-1048},{ -969,-1258,-1608,-1608,-1608},{ -599, -888,-1238,-1238,-1238}}, +/* AU.U..UG */ +{{ -50, -329, -329, -329, -329},{ -859,-1138,-1138,-1138,-1138},{ -529, -808, -808, -808, -808},{ -859,-1138,-1138,-1138,-1138},{ -409, -688, -688, -688, -688}} +}, +{ +/* AU.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..AU */ +{{ -50, -429, -599, -599, -599},{ -479, -858,-1028,-1028,-1028},{ -309, -688, -858, -858, -858},{ -389, -768, -938, -938, -938},{ -379, -758, -928, -928, -928}}, +/* AU.C..AU */ +{{ -50, -259, -239, -239, -239},{ -649, -858, -838, -838, -838},{ -289, -498, -478, -478, -478},{ -739, -948, -928, -928, -928},{ -379, -588, -568, -568, -568}}, +/* AU.G..AU */ +{{ -50, -339, -689, -689, -689},{ -649, -938,-1288,-1288,-1288},{ -289, -578, -928, -928, -928},{ -739,-1028,-1378,-1378,-1378},{ -379, -668,-1018,-1018,-1018}}, +/* AU.U..AU */ +{{ -50, -329, -329, -329, -329},{ -649, -928, -928, -928, -928},{ -289, -568, -568, -568, -568},{ -739,-1018,-1018,-1018,-1018},{ -379, -658, -658, -658, -658}} +}, +{ +/* AU.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A..UA */ +{{ -50, -429, -599, -599, -599},{ -449, -828, -998, -998, -998},{ -479, -858,-1028,-1028,-1028},{ -429, -808, -978, -978, -978},{ -329, -708, -878, -878, -878}}, +/* AU.C..UA */ +{{ -50, -259, -239, -239, -239},{ -679, -888, -868, -868, -868},{ -559, -768, -748, -748, -748},{ -729, -938, -918, -918, -918},{ -189, -398, -378, -378, -378}}, +/* AU.G..UA */ +{{ -50, -339, -689, -689, -689},{ -939,-1228,-1578,-1578,-1578},{ -249, -538, -888, -888, -888},{ -939,-1228,-1578,-1578,-1578},{ -329, -618, -968, -968, -968}}, +/* AU.U..UA */ +{{ -50, -329, -329, -329, -329},{ -639, -918, -918, -918, -918},{ -229, -508, -508, -508, -508},{ -729,-1008,-1008,-1008,-1008},{ -190, -469, -469, -469, -469}} +}, +{ +/* AU.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* AU.A.. @ */ +{{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649},{ -100, -479, -649, -649, -649}}, +/* AU.C.. @ */ +{{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289},{ -100, -309, -289, -289, -289}}, +/* AU.G.. @ */ +{{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739},{ -100, -389, -739, -739, -739}}, +/* AU.U.. @ */ +{{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379},{ -100, -379, -379, -379, -379}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* UA.@..CG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..CG */ +{{ -50, -399, -629, -889, -589},{-1079,-1428,-1658,-1918,-1618},{ -569, -918,-1148,-1408,-1108},{ -989,-1338,-1568,-1828,-1528},{ -859,-1208,-1438,-1698,-1398}}, +/* UA.C..CG */ +{{ -50, -429, -509, -199, -179},{ -999,-1378,-1458,-1148,-1128},{ -499, -878, -958, -648, -628},{ -989,-1368,-1448,-1138,-1118},{ -789,-1168,-1248, -938, -918}}, +/* UA.G..CG */ +{{ -50, -379, -679, -889, -679},{-1079,-1408,-1708,-1918,-1708},{ -569, -898,-1198,-1408,-1198},{ -989,-1318,-1618,-1828,-1618},{ -859,-1188,-1488,-1698,-1488}}, +/* UA.U..CG */ +{{ -50, -279, -139, -279, -140},{-1079,-1308,-1168,-1308,-1169},{ -719, -948, -808, -948, -809},{ -989,-1218,-1078,-1218,-1079},{ -909,-1138, -998,-1138, -999}} +}, +{ +/* UA.@..GC */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..GC */ +{{ -50, -399, -629, -889, -589},{ -569, -918,-1148,-1408,-1108},{ -769,-1118,-1348,-1608,-1308},{ -759,-1108,-1338,-1598,-1298},{ -549, -898,-1128,-1388,-1088}}, +/* UA.C..GC */ +{{ -50, -429, -509, -199, -179},{ -929,-1308,-1388,-1078,-1058},{ -359, -738, -818, -508, -488},{ -789,-1168,-1248, -938, -918},{ -549, -928,-1008, -698, -678}}, +/* UA.G..GC */ +{{ -50, -379, -679, -889, -679},{ -609, -938,-1238,-1448,-1238},{ -359, -688, -988,-1198, -988},{ -669, -998,-1298,-1508,-1298},{ -549, -878,-1178,-1388,-1178}}, +/* UA.U..GC */ +{{ -50, -279, -139, -279, -140},{ -929,-1158,-1018,-1158,-1019},{ -439, -668, -528, -668, -529},{ -789,-1018, -878,-1018, -879},{ -619, -848, -708, -848, -709}} +}, +{ +/* UA.@..GU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..GU */ +{{ -50, -399, -629, -889, -589},{ -479, -828,-1058,-1318,-1018},{ -309, -658, -888,-1148, -848},{ -389, -738, -968,-1228, -928},{ -379, -728, -958,-1218, -918}}, +/* UA.C..GU */ +{{ -50, -429, -509, -199, -179},{ -649,-1028,-1108, -798, -778},{ -289, -668, -748, -438, -418},{ -739,-1118,-1198, -888, -868},{ -379, -758, -838, -528, -508}}, +/* UA.G..GU */ +{{ -50, -379, -679, -889, -679},{ -649, -978,-1278,-1488,-1278},{ -289, -618, -918,-1128, -918},{ -739,-1068,-1368,-1578,-1368},{ -379, -708,-1008,-1218,-1008}}, +/* UA.U..GU */ +{{ -50, -279, -139, -279, -140},{ -649, -878, -738, -878, -739},{ -289, -518, -378, -518, -379},{ -739, -968, -828, -968, -829},{ -379, -608, -468, -608, -469}} +}, +{ +/* UA.@..UG */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..UG */ +{{ -50, -399, -629, -889, -589},{ -769,-1118,-1348,-1608,-1308},{ -529, -878,-1108,-1368,-1068},{ -709,-1058,-1288,-1548,-1248},{ -599, -948,-1178,-1438,-1138}}, +/* UA.C..UG */ +{{ -50, -429, -509, -199, -179},{ -839,-1218,-1298, -988, -968},{ -529, -908, -988, -678, -658},{ -859,-1238,-1318,-1008, -988},{ -489, -868, -948, -638, -618}}, +/* UA.G..UG */ +{{ -50, -379, -679, -889, -679},{-1009,-1338,-1638,-1848,-1638},{ -409, -738,-1038,-1248,-1038},{ -969,-1298,-1598,-1808,-1598},{ -599, -928,-1228,-1438,-1228}}, +/* UA.U..UG */ +{{ -50, -279, -139, -279, -140},{ -859,-1088, -948,-1088, -949},{ -529, -758, -618, -758, -619},{ -859,-1088, -948,-1088, -949},{ -409, -638, -498, -638, -499}} +}, +{ +/* UA.@..AU */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..AU */ +{{ -50, -399, -629, -889, -589},{ -479, -828,-1058,-1318,-1018},{ -309, -658, -888,-1148, -848},{ -389, -738, -968,-1228, -928},{ -379, -728, -958,-1218, -918}}, +/* UA.C..AU */ +{{ -50, -429, -509, -199, -179},{ -649,-1028,-1108, -798, -778},{ -289, -668, -748, -438, -418},{ -739,-1118,-1198, -888, -868},{ -379, -758, -838, -528, -508}}, +/* UA.G..AU */ +{{ -50, -379, -679, -889, -679},{ -649, -978,-1278,-1488,-1278},{ -289, -618, -918,-1128, -918},{ -739,-1068,-1368,-1578,-1368},{ -379, -708,-1008,-1218,-1008}}, +/* UA.U..AU */ +{{ -50, -279, -139, -279, -140},{ -649, -878, -738, -878, -739},{ -289, -518, -378, -518, -379},{ -739, -968, -828, -968, -829},{ -379, -608, -468, -608, -469}} +}, +{ +/* UA.@..UA */ +{{ 0, 0, 0, 0, 0},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A..UA */ +{{ -50, -399, -629, -889, -589},{ -449, -798,-1028,-1288, -988},{ -479, -828,-1058,-1318,-1018},{ -429, -778,-1008,-1268, -968},{ -329, -678, -908,-1168, -868}}, +/* UA.C..UA */ +{{ -50, -429, -509, -199, -179},{ -679,-1058,-1138, -828, -808},{ -559, -938,-1018, -708, -688},{ -729,-1108,-1188, -878, -858},{ -189, -568, -648, -338, -318}}, +/* UA.G..UA */ +{{ -50, -379, -679, -889, -679},{ -939,-1268,-1568,-1778,-1568},{ -249, -578, -878,-1088, -878},{ -939,-1268,-1568,-1778,-1568},{ -329, -658, -958,-1168, -958}}, +/* UA.U..UA */ +{{ -50, -279, -139, -279, -140},{ -639, -868, -728, -868, -729},{ -229, -458, -318, -458, -319},{ -729, -958, -818, -958, -819},{ -190, -419, -279, -419, -280}} +}, +{ +/* UA.@.. @ */ +{{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50},{ -50, -50, -50, -50, -50}}, +/* UA.A.. @ */ +{{ -100, -449, -679, -939, -639},{ -100, -449, -679, -939, -639},{ -100, -449, -679, -939, -639},{ -100, -449, -679, -939, -639},{ -100, -449, -679, -939, -639}}, +/* UA.C.. @ */ +{{ -100, -479, -559, -249, -229},{ -100, -479, -559, -249, -229},{ -100, -479, -559, -249, -229},{ -100, -479, -559, -249, -229},{ -100, -479, -559, -249, -229}}, +/* UA.G.. @ */ +{{ -100, -429, -729, -939, -729},{ -100, -429, -729, -939, -729},{ -100, -429, -729, -939, -729},{ -100, -429, -729, -939, -729},{ -100, -429, -729, -939, -729}}, +/* UA.U.. @ */ +{{ -100, -329, -189, -329, -190},{ -100, -329, -189, -329, -190},{ -100, -329, -189, -329, -190},{ -100, -329, -189, -329, -190},{ -100, -329, -189, -329, -190}} +} +}, +{ /* noPair */ {{{0}}}, +{ +/* @.@..CG */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..CG */ +{{ -50, -50, -50, -50, -50},{-1079,-1079,-1079,-1079,-1079},{ -569, -569, -569, -569, -569},{ -989, -989, -989, -989, -989},{ -859, -859, -859, -859, -859}}, +/* @.C..CG */ +{{ -50, -50, -50, -50, -50},{ -999, -999, -999, -999, -999},{ -499, -499, -499, -499, -499},{ -989, -989, -989, -989, -989},{ -789, -789, -789, -789, -789}}, +/* @.G..CG */ +{{ -50, -50, -50, -50, -50},{-1079,-1079,-1079,-1079,-1079},{ -569, -569, -569, -569, -569},{ -989, -989, -989, -989, -989},{ -859, -859, -859, -859, -859}}, +/* @.U..CG */ +{{ -50, -50, -50, -50, -50},{-1079,-1079,-1079,-1079,-1079},{ -719, -719, -719, -719, -719},{ -989, -989, -989, -989, -989},{ -909, -909, -909, -909, -909}} +}, +{ +/* @.@..GC */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..GC */ +{{ -50, -50, -50, -50, -50},{ -569, -569, -569, -569, -569},{ -769, -769, -769, -769, -769},{ -759, -759, -759, -759, -759},{ -549, -549, -549, -549, -549}}, +/* @.C..GC */ +{{ -50, -50, -50, -50, -50},{ -929, -929, -929, -929, -929},{ -359, -359, -359, -359, -359},{ -789, -789, -789, -789, -789},{ -549, -549, -549, -549, -549}}, +/* @.G..GC */ +{{ -50, -50, -50, -50, -50},{ -609, -609, -609, -609, -609},{ -359, -359, -359, -359, -359},{ -669, -669, -669, -669, -669},{ -549, -549, -549, -549, -549}}, +/* @.U..GC */ +{{ -50, -50, -50, -50, -50},{ -929, -929, -929, -929, -929},{ -439, -439, -439, -439, -439},{ -789, -789, -789, -789, -789},{ -619, -619, -619, -619, -619}} +}, +{ +/* @.@..GU */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..GU */ +{{ -50, -50, -50, -50, -50},{ -479, -479, -479, -479, -479},{ -309, -309, -309, -309, -309},{ -389, -389, -389, -389, -389},{ -379, -379, -379, -379, -379}}, +/* @.C..GU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}}, +/* @.G..GU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}}, +/* @.U..GU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}} +}, +{ +/* @.@..UG */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..UG */ +{{ -50, -50, -50, -50, -50},{ -769, -769, -769, -769, -769},{ -529, -529, -529, -529, -529},{ -709, -709, -709, -709, -709},{ -599, -599, -599, -599, -599}}, +/* @.C..UG */ +{{ -50, -50, -50, -50, -50},{ -839, -839, -839, -839, -839},{ -529, -529, -529, -529, -529},{ -859, -859, -859, -859, -859},{ -489, -489, -489, -489, -489}}, +/* @.G..UG */ +{{ -50, -50, -50, -50, -50},{-1009,-1009,-1009,-1009,-1009},{ -409, -409, -409, -409, -409},{ -969, -969, -969, -969, -969},{ -599, -599, -599, -599, -599}}, +/* @.U..UG */ +{{ -50, -50, -50, -50, -50},{ -859, -859, -859, -859, -859},{ -529, -529, -529, -529, -529},{ -859, -859, -859, -859, -859},{ -409, -409, -409, -409, -409}} +}, +{ +/* @.@..AU */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..AU */ +{{ -50, -50, -50, -50, -50},{ -479, -479, -479, -479, -479},{ -309, -309, -309, -309, -309},{ -389, -389, -389, -389, -389},{ -379, -379, -379, -379, -379}}, +/* @.C..AU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}}, +/* @.G..AU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}}, +/* @.U..AU */ +{{ -50, -50, -50, -50, -50},{ -649, -649, -649, -649, -649},{ -289, -289, -289, -289, -289},{ -739, -739, -739, -739, -739},{ -379, -379, -379, -379, -379}} +}, +{ +/* @.@..UA */ +{{ -50, -50, -50, -50, -50},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A..UA */ +{{ -50, -50, -50, -50, -50},{ -449, -449, -449, -449, -449},{ -479, -479, -479, -479, -479},{ -429, -429, -429, -429, -429},{ -329, -329, -329, -329, -329}}, +/* @.C..UA */ +{{ -50, -50, -50, -50, -50},{ -679, -679, -679, -679, -679},{ -559, -559, -559, -559, -559},{ -729, -729, -729, -729, -729},{ -189, -189, -189, -189, -189}}, +/* @.G..UA */ +{{ -50, -50, -50, -50, -50},{ -939, -939, -939, -939, -939},{ -249, -249, -249, -249, -249},{ -939, -939, -939, -939, -939},{ -329, -329, -329, -329, -329}}, +/* @.U..UA */ +{{ -50, -50, -50, -50, -50},{ -639, -639, -639, -639, -639},{ -229, -229, -229, -229, -229},{ -729, -729, -729, -729, -729},{ -190, -190, -190, -190, -190}} +}, +{ +/* @.@.. @ */ +{{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.A.. @ */ +{{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.C.. @ */ +{{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.G.. @ */ +{{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}}, +/* @.U.. @ */ +{{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100},{ -100, -100, -100, -100, -100}} +} +} +}; + +const int energy_param::int22_37[8][8][5][5][5][5] = { +/* noPair */ {{{{{0}}}}}, +{ /* noPair */ {{{{0}}}}, +/* CG....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 160, 30, 200},{ 340, 120, 150, 20, 200},{ 340, 30, 60, -70, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 200, 60, 200},{ 340, 210, 180, 150, 200},{ 340, 200, 200, 200, 200},{ 340, 190, 170, 130, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 60, -70, 200},{ 340, 200, 200, 200, 200},{ 340, 100, 140, 0, 200},{ 340, -40, -110, -60, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 190, 170, 130, 200},{ 340, 110, 40, 90, 200},{ 340, 140, 80, 130, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 120, 210, 200, 190},{ 340, 110, 140, 200, 120},{ 340, 20, 150, 200, 130},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 180, 200, 170},{ 340, 140, 170, 200, 150},{ 340, 200, 200, 200, 200},{ 340, 120, 150, 200, 140}}, +{{ 340, 340, 340, 340, 340},{ 340, 20, 150, 200, 130},{ 340, 200, 200, 200, 200},{ 340, 90, 180, 200, 170},{ 340, -150, -20, 200, -40}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 120, 150, 200, 140},{ 340, 0, 130, 200, 110},{ 340, 30, 60, 200, 50}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 200, 100, 110},{ 340, 20, 200, 90, 0},{ 340, -70, 200, 0, 90},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 200, 140, 40},{ 340, 150, 200, 180, 130},{ 340, 200, 200, 200, 200},{ 340, 130, 200, 170, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, -70, 200, 0, 90},{ 340, 200, 200, 200, 200},{ 340, 0, 200, 80, 90},{ 340, -60, 200, -70, -260}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 130, 200, 170, 110},{ 340, 90, 200, 90, -110},{ 340, 130, 200, 120, 110}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 190, -40, 140},{ 340, 200, 120, -150, 30},{ 340, 200, 130, -60, 130},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, -110, 80},{ 340, 200, 150, -20, 60},{ 340, 200, 200, 200, 200},{ 340, 200, 140, -40, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 130, -60, 130},{ 340, 200, 200, 200, 200},{ 340, 200, 170, -70, 120},{ 340, 200, -40, -420, -50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 140, -40, 50},{ 340, 200, 110, -260, 110},{ 340, 200, 50, -50, -40}} +} +}, +/* CG....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 60, 0, 200},{ 340, 110, 150, -70, 200},{ 340, -30, 10, -160, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 110, -100, 200},{ 340, 170, 150, -60, 200},{ 340, 200, 200, 200, 200},{ 340, 70, 50, 20, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 40, 50, -70, 200},{ 340, 200, 200, 200, 200},{ 340, 100, 140, 0, 200},{ 340, 10, -70, -80, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 180, 150, 120, 200},{ 340, -50, -60, -60, 200},{ 340, 150, 0, 90, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 220, 200, 200},{ 340, 100, 130, 200, 120},{ 340, -70, 70, 200, 40},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 190, 200, 110},{ 340, 100, 130, 200, 120},{ 340, 200, 200, 200, 200},{ 340, 0, 30, 200, 170}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 70, 200, 100},{ 340, 200, 200, 200, 200},{ 340, 90, 180, 200, 170},{ 340, -190, -30, 200, -70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 110, 140, 200, 120},{ 340, -150, -20, 200, -30},{ 340, -20, -10, 200, 20}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, -20, 200, 110, 90},{ 340, -40, 200, 90, 0},{ 340, -170, 200, -90, 30},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 80, -10},{ 340, 110, 200, 150, 100},{ 340, 200, 200, 200, 200},{ 340, 20, 200, 50, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, -50, 200, -20, 60},{ 340, 200, 200, 200, 200},{ 340, 0, 200, 80, 90},{ 340, -90, 200, -100, -300}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 120, 200, 150, 100},{ 340, -130, 200, -60, -240},{ 340, 90, 200, 110, 60}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, -10, 140},{ 340, 200, 120, -160, 30},{ 340, 200, 40, -160, 50},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 110, -160, 30},{ 340, 200, 120, -60, 30},{ 340, 200, 200, 200, 200},{ 340, 200, 20, -160, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 50, -60, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 170, -70, 120},{ 340, 200, -70, -440, -100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 120, -50, 30},{ 340, 200, -10, -410, 10},{ 340, 200, 40, -100, 60}} +} +}, +/* CG....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 180, 210, 80, 200},{ 340, 80, 110, -20, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 220, 90, 200},{ 340, 230, 210, 170, 200},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 110, -20, 200},{ 340, 200, 200, 200, 200},{ 340, 130, 170, 30, 200},{ 340, 60, 0, 40, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200},{ 340, 160, 90, 140, 200},{ 340, 190, 130, 180, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 280, 200, 270},{ 340, 170, 200, 200, 180},{ 340, 70, 200, 200, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 210, 200, 190},{ 340, 160, 190, 200, 180},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 200, 180},{ 340, 200, 200, 200, 200},{ 340, 120, 210, 200, 200},{ 340, -50, 80, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180},{ 340, 50, 180, 200, 160},{ 340, 80, 110, 200, 100}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 180},{ 340, 80, 200, 150, 60},{ 340, -20, 200, 50, 140},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 200, 160, 70},{ 340, 170, 200, 210, 150},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150}}, +{{ 340, 340, 340, 340, 340},{ 340, -20, 200, 50, 140},{ 340, 200, 200, 200, 200},{ 340, 30, 200, 110, 110},{ 340, 40, 200, 40, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150},{ 340, 140, 200, 130, -60},{ 340, 180, 200, 170, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 220},{ 340, 200, 180, -90, 90},{ 340, 200, 180, -10, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 190, -80, 100},{ 340, 200, 180, 0, 90},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 180, -10, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 200, -40, 150},{ 340, 200, 70, -310, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90},{ 340, 200, 160, -210, 160},{ 340, 200, 100, 0, 10}} +} +}, +/* CG....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 160, 190, 60, 200},{ 340, 100, 130, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 260, 240, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 260, 240, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 130, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 140, 170, 40, 200},{ 340, 20, -40, 0, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200},{ 340, 150, 80, 130, 200},{ 340, 220, 150, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 280, 200, 270},{ 340, 150, 180, 200, 160},{ 340, 90, 220, 200, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 220, 200, 210},{ 340, 190, 220, 200, 210},{ 340, 200, 200, 200, 200},{ 340, 190, 220, 200, 210}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 220, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 130, 220, 200, 200},{ 340, -90, 40, 200, 30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180},{ 340, 40, 170, 200, 150},{ 340, 110, 140, 200, 120}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 180},{ 340, 60, 200, 130, 40},{ 340, 0, 200, 70, 160},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 80},{ 340, 200, 200, 240, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 240, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 40, 200, 110, 120},{ 340, 0, 200, 0, -200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150},{ 340, 130, 200, 120, -70},{ 340, 200, 200, 190, 180}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 220},{ 340, 200, 160, -110, 70},{ 340, 200, 200, 10, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 210, -70, 120},{ 340, 200, 210, 30, 120},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 10, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 200, -30, 150},{ 340, 200, 30, -350, 20}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90},{ 340, 200, 150, -220, 150},{ 340, 200, 120, 30, 30}} +} +}, +/* CG....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 180, 210, 80, 200},{ 340, 80, 110, -20, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 220, 90, 200},{ 340, 230, 210, 170, 200},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 110, -20, 200},{ 340, 200, 200, 200, 200},{ 340, 130, 170, 30, 200},{ 340, 60, 0, 40, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200},{ 340, 160, 90, 140, 200},{ 340, 190, 130, 180, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 280, 200, 270},{ 340, 170, 200, 200, 180},{ 340, 70, 200, 200, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 210, 200, 190},{ 340, 160, 190, 200, 180},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 200, 180},{ 340, 200, 200, 200, 200},{ 340, 120, 210, 200, 200},{ 340, -50, 80, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180},{ 340, 50, 180, 200, 160},{ 340, 80, 110, 200, 100}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 180},{ 340, 80, 200, 150, 60},{ 340, -20, 200, 50, 140},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 200, 160, 70},{ 340, 170, 200, 210, 150},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150}}, +{{ 340, 340, 340, 340, 340},{ 340, -20, 200, 50, 140},{ 340, 200, 200, 200, 200},{ 340, 30, 200, 110, 110},{ 340, 40, 200, 40, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150},{ 340, 140, 200, 130, -60},{ 340, 180, 200, 170, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 220},{ 340, 200, 180, -90, 90},{ 340, 200, 180, -10, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 190, -80, 100},{ 340, 200, 180, 0, 90},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 180, -10, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 200, -40, 150},{ 340, 200, 70, -310, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90},{ 340, 200, 160, -210, 160},{ 340, 200, 100, 0, 10}} +} +}, +/* CG....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 160, 190, 60, 200},{ 340, 100, 130, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 100, 200},{ 340, 260, 240, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 260, 240, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 130, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 140, 170, 40, 200},{ 340, 20, -40, 0, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 230, 210, 170, 200},{ 340, 150, 80, 130, 200},{ 340, 220, 150, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 280, 200, 270},{ 340, 150, 180, 200, 160},{ 340, 90, 220, 200, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 220, 200, 210},{ 340, 190, 220, 200, 210},{ 340, 200, 200, 200, 200},{ 340, 190, 220, 200, 210}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 220, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 130, 220, 200, 200},{ 340, -90, 40, 200, 30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 190, 200, 180},{ 340, 40, 170, 200, 150},{ 340, 110, 140, 200, 120}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 180},{ 340, 60, 200, 130, 40},{ 340, 0, 200, 70, 160},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 180, 80},{ 340, 200, 200, 240, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 240, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 40, 200, 110, 120},{ 340, 0, 200, 0, -200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 210, 150},{ 340, 130, 200, 120, -70},{ 340, 200, 200, 190, 180}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 220},{ 340, 200, 160, -110, 70},{ 340, 200, 200, 10, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 210, -70, 120},{ 340, 200, 210, 30, 120},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 10, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 200, -30, 150},{ 340, 200, 30, -350, 20}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 0, 90},{ 340, 200, 150, -220, 150},{ 340, 200, 120, 30, 30}} +} +}, +/* CG....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* GC....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 110, 40, 200},{ 340, 130, 100, 70, 200},{ 340, -20, 70, -50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 110, 50, 200},{ 340, 220, 190, 70, 200},{ 340, 200, 200, 200, 200},{ 340, 200, 110, 50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, -100, -70, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 80, -20, 200},{ 340, -10, -160, -60, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 110, 100, 200},{ 340, 90, -10, 60, 200},{ 340, 140, 30, 140, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 170, 200, 180},{ 340, 100, 100, 200, 110},{ 340, -40, 110, 200, 120},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 150, 200, 150},{ 340, 130, 130, 200, 140},{ 340, 200, 200, 200, 200},{ 340, 120, 120, 200, 120}}, +{{ 340, 340, 340, 340, 340},{ 340, -70, -60, 200, 120},{ 340, 200, 200, 200, 200},{ 340, 90, 150, 200, 150},{ 340, -160, -60, 200, -50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 120, 120, 200, 120},{ 340, 0, 100, 200, 100},{ 340, 30, 30, 200, 30}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, -30, 200, 100, -50},{ 340, -70, 200, 90, -150},{ 340, -170, 200, 0, -130},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 140, -60},{ 340, 70, 200, 180, -20},{ 340, 200, 200, 200, 200},{ 340, 40, 200, 170, -10}}, +{{ 340, 340, 340, 340, 340},{ 340, -160, 200, 0, -60},{ 340, 200, 200, 200, 200},{ 340, -90, 200, 80, -60},{ 340, -160, 200, -70, -410}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 40, 200, 170, -30},{ 340, 30, 200, 90, -240},{ 340, 50, 200, 120, 10}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 70, 10, 150},{ 340, 200, 0, -190, -20},{ 340, 200, 20, -90, 90},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 50, -70, 0},{ 340, 200, 30, -30, -10},{ 340, 200, 200, 200, 200},{ 340, 200, 20, -70, 40}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 20, -80, 90},{ 340, 200, 200, 200, 200},{ 340, 200, 50, -100, 110},{ 340, 200, -160, -440, -100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 170, -70, 20},{ 340, 200, 0, -300, 60},{ 340, 200, 10, -100, 60}} +} +}, +/* GC....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 120, 10, 200},{ 340, 120, 90, -10, 200},{ 340, -50, -80, -190, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 120, 90, -20, 200},{ 340, 180, 90, 90, 200},{ 340, 200, 200, 200, 200},{ 340, 80, 0, -10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, -20, -130, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 80, -20, 200},{ 340, -70, -200, -130, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 190, 100, 90, 200},{ 340, -30, -160, -90, 200},{ 340, 150, 20, 90, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 120, 180, 200, 190},{ 340, 100, 100, 200, 100},{ 340, -80, 20, 200, 30},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 90, 200, 100},{ 340, 100, 100, 200, 100},{ 340, 200, 200, 200, 200},{ 340, 0, 0, 200, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, -10, 90, 200, 90},{ 340, 200, 200, 200, 200},{ 340, 90, 150, 200, 150},{ 340, -190, -90, 200, -90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 100, 100, 200, 110},{ 340, -150, -50, 200, -50},{ 340, 20, 20, 200, 30}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, -50, 200, 110, -30},{ 340, -80, 200, 90, -150},{ 340, -260, 200, -90, -150},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, -80, 200, 80, -160},{ 340, 20, 200, 150, -50},{ 340, 200, 200, 200, 200},{ 340, -80, 200, 50, -150}}, +{{ 340, 340, 340, 340, 340},{ 340, -190, 200, -20, -90},{ 340, 200, 200, 200, 200},{ 340, -90, 200, 80, -60},{ 340, -190, 200, -100, -450}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 30, 200, 150, -50},{ 340, -150, 200, -60, -410},{ 340, 30, 200, 110, -50}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 80, -70, 150},{ 340, 200, 0, -190, 20},{ 340, 200, -80, -190, 30},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 0, -200, 20},{ 340, 200, 0, -90, 20},{ 340, 200, 200, 200, 200},{ 340, 200, -100, -190, -70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, -10, -130, 90},{ 340, 200, 200, 200, 200},{ 340, 200, 50, -100, 110},{ 340, 200, -190, -490, -90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 0, -90, 30},{ 340, 200, -150, -450, -50},{ 340, 200, -70, -90, -50}} +} +}, +/* GC....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 190, 160, 50, 200},{ 340, 90, 60, -50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, 60, 200},{ 340, 240, 150, 140, 200},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 60, -50, 200},{ 340, 200, 200, 200, 200},{ 340, 140, 110, 0, 200},{ 340, 70, -60, 10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200},{ 340, 170, 40, 110, 200},{ 340, 200, 70, 150, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 250, 200, 250},{ 340, 160, 160, 200, 170},{ 340, 60, 160, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 200, 180},{ 340, 160, 160, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 160, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 120, 180, 200, 180},{ 340, -50, 50, 200, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160},{ 340, 40, 140, 200, 150},{ 340, 80, 80, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, 40},{ 340, -10, 200, 150, -90},{ 340, -110, 200, 50, -10},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 160, -80},{ 340, 80, 200, 210, 10},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, -110, 200, 50, -10},{ 340, 200, 200, 200, 200},{ 340, -60, 200, 110, -30},{ 340, -50, 200, 40, -310}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10},{ 340, 50, 200, 130, -210},{ 340, 80, 200, 170, 10}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, 0, 210},{ 340, 200, 60, -130, 90},{ 340, 200, 70, -50, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 70, -120, 100},{ 340, 200, 60, -30, 80},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 70, -50, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 80, -70, 140},{ 340, 200, -50, -350, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80},{ 340, 200, 50, -250, 150},{ 340, 200, -20, -30, 0}} +} +}, +/* GC....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 170, 140, 30, 200},{ 340, 110, 80, -30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 270, 180, 170, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 180, 170, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 80, -30, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 120, 10, 200},{ 340, 30, -100, -30, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200},{ 340, 160, 30, 100, 200},{ 340, 230, 100, 170, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 250, 200, 250},{ 340, 140, 140, 200, 150},{ 340, 80, 180, 200, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 190, 200, 190},{ 340, 190, 190, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 190, 190, 200, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 180, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 120, 180, 200, 190},{ 340, -90, 10, 200, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160},{ 340, 30, 130, 200, 140},{ 340, 100, 100, 200, 110}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, 40},{ 340, -30, 200, 130, -110},{ 340, -90, 200, 70, 10},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, -60},{ 340, 110, 200, 240, 40},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 240, 40}}, +{{ 340, 340, 340, 340, 340},{ 340, -90, 200, 70, 10},{ 340, 200, 200, 200, 200},{ 340, -50, 200, 110, -30},{ 340, -90, 200, 0, -350}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10},{ 340, 40, 200, 120, -220},{ 340, 110, 200, 190, 30}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, 0, 210},{ 340, 200, 40, -150, 70},{ 340, 200, 90, -30, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 90, -100, 110},{ 340, 200, 90, 0, 110},{ 340, 200, 200, 200, 200},{ 340, 200, 90, 0, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 90, -30, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 80, -70, 150},{ 340, 200, -90, -390, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80},{ 340, 200, 40, -260, 140},{ 340, 200, 0, -10, 30}} +} +}, +/* GC....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 190, 160, 50, 200},{ 340, 90, 60, -50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, 60, 200},{ 340, 240, 150, 140, 200},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 60, -50, 200},{ 340, 200, 200, 200, 200},{ 340, 140, 110, 0, 200},{ 340, 70, -60, 10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200},{ 340, 170, 40, 110, 200},{ 340, 200, 70, 150, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 250, 200, 250},{ 340, 160, 160, 200, 170},{ 340, 60, 160, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 200, 180},{ 340, 160, 160, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 160, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 120, 180, 200, 180},{ 340, -50, 50, 200, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160},{ 340, 40, 140, 200, 150},{ 340, 80, 80, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, 40},{ 340, -10, 200, 150, -90},{ 340, -110, 200, 50, -10},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 160, -80},{ 340, 80, 200, 210, 10},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, -110, 200, 50, -10},{ 340, 200, 200, 200, 200},{ 340, -60, 200, 110, -30},{ 340, -50, 200, 40, -310}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10},{ 340, 50, 200, 130, -210},{ 340, 80, 200, 170, 10}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, 0, 210},{ 340, 200, 60, -130, 90},{ 340, 200, 70, -50, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 70, -120, 100},{ 340, 200, 60, -30, 80},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 70, -50, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 80, -70, 140},{ 340, 200, -50, -350, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80},{ 340, 200, 50, -250, 150},{ 340, 200, -20, -30, 0}} +} +}, +/* GC....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 170, 140, 30, 200},{ 340, 110, 80, -30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 180, 70, 200},{ 340, 270, 180, 170, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 180, 170, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 80, -30, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 120, 10, 200},{ 340, 30, -100, -30, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 150, 140, 200},{ 340, 160, 30, 100, 200},{ 340, 230, 100, 170, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 250, 200, 250},{ 340, 140, 140, 200, 150},{ 340, 80, 180, 200, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 190, 200, 190},{ 340, 190, 190, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 190, 190, 200, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 180, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 120, 180, 200, 190},{ 340, -90, 10, 200, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 160, 200, 160},{ 340, 30, 130, 200, 140},{ 340, 100, 100, 200, 110}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, 40},{ 340, -30, 200, 130, -110},{ 340, -90, 200, 70, 10},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 10, 200, 180, -60},{ 340, 110, 200, 240, 40},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 240, 40}}, +{{ 340, 340, 340, 340, 340},{ 340, -90, 200, 70, 10},{ 340, 200, 200, 200, 200},{ 340, -50, 200, 110, -30},{ 340, -90, 200, 0, -350}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 210, 10},{ 340, 40, 200, 120, -220},{ 340, 110, 200, 190, 30}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, 0, 210},{ 340, 200, 40, -150, 70},{ 340, 200, 90, -30, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 90, -100, 110},{ 340, 200, 90, 0, 110},{ 340, 200, 200, 200, 200},{ 340, 200, 90, 0, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 90, -30, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 80, -70, 150},{ 340, 200, -90, -390, 10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -30, 80},{ 340, 200, 40, -260, 140},{ 340, 200, 0, -10, 30}} +} +}, +/* GC....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* GU....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 190, 80, 200},{ 340, 190, 180, 70, 200},{ 340, 100, 90, -20, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 220, 110, 200},{ 340, 280, 210, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 190, 180, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 90, -20, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 160, 50, 200},{ 340, 30, -80, -10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 270, 190, 180, 200},{ 340, 180, 70, 140, 200},{ 340, 220, 100, 180, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 230, 200, 230},{ 340, 170, 160, 200, 160},{ 340, 80, 170, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 210, 200, 210},{ 340, 200, 190, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 170, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 150, 210, 200, 210},{ 340, -90, 0, 200, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 200, 180},{ 340, 60, 150, 200, 150},{ 340, 90, 90, 200, 90}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 200, 130, 160},{ 340, 70, 200, 120, 50},{ 340, -20, 200, 30, 140},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 200, 170, 90},{ 340, 200, 200, 210, 180},{ 340, 200, 200, 200, 200},{ 340, 180, 200, 200, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, -20, 200, 30, 140},{ 340, 200, 200, 200, 200},{ 340, 50, 200, 110, 130},{ 340, -10, 200, -40, -210}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 180, 200, 200, 160},{ 340, 140, 200, 110, -60},{ 340, 180, 200, 150, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 60, 190},{ 340, 200, 160, -50, 80},{ 340, 200, 170, 40, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 210, 0, 130},{ 340, 200, 190, 80, 110},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 70, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, 40, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 40, 170},{ 340, 200, 0, -310, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 70, 100},{ 340, 200, 150, -160, 160},{ 340, 200, 90, 60, 10}} +} +}, +/* GU....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 200, 90, 200},{ 340, 190, 170, 60, 200},{ 340, 10, 0, -110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 170, 60, 200},{ 340, 250, 170, 160, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 70, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 60, -50, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 160, 50, 200},{ 340, 0, -120, -50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 250, 180, 170, 200},{ 340, 40, -80, -10, 200},{ 340, 210, 100, 170, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 240, 200, 240},{ 340, 160, 160, 200, 160},{ 340, -10, 80, 200, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 150, 200, 150},{ 340, 160, 160, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 60, 60, 200, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 140, 200, 140},{ 340, 200, 200, 200, 200},{ 340, 150, 210, 200, 210},{ 340, -130, -30, 200, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 160, 200, 160},{ 340, -90, 10, 200, 10},{ 340, 90, 80, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 200, 140, 170},{ 340, 60, 200, 120, 40},{ 340, -110, 200, -60, 50},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 200, 110, 40},{ 340, 160, 200, 180, 140},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 80, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, -50, 200, 0, 110},{ 340, 200, 200, 200, 200},{ 340, 50, 200, 110, 130},{ 340, -50, 200, -70, -250}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 180, 150},{ 340, -10, 200, -30, -210},{ 340, 170, 200, 140, 150}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 70, 200},{ 340, 200, 160, -50, 80},{ 340, 200, 80, -50, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, -60, 70},{ 340, 200, 160, 50, 80},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -50, -20}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 140, 10, 150},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 40, 170},{ 340, 200, -30, -350, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 160, 50, 80},{ 340, 200, 10, -310, 10},{ 340, 200, 80, 50, 0}} +} +}, +/* GU....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 250, 240, 130, 200},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 250, 140, 200},{ 340, 310, 230, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 190, 80, 200},{ 340, 130, 20, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 230, 120, 190, 200},{ 340, 270, 150, 220, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 230, 220, 200, 220},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 230, 200, 230},{ 340, 220, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 180, 240, 200, 240},{ 340, 10, 100, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 110, 200, 200, 200},{ 340, 140, 140, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 130, 200, 180, 110},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 200, 190, 120},{ 340, 220, 200, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 140, 160},{ 340, 90, 200, 70, -110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 190, 200, 160, -10},{ 340, 220, 200, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 220, 10, 140},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 20, 150},{ 340, 200, 220, 100, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 100, -210, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 200, -110, 200},{ 340, 200, 140, 110, 60}} +} +}, +/* GU....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 230, 220, 110, 200},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 340, 260, 250, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 260, 250, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 200, 90, 200},{ 340, 100, -20, 50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 220, 110, 180, 200},{ 340, 290, 180, 250, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 210, 200, 200, 200},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 250, 200, 250},{ 340, 250, 250, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 250, 250, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 190, 240, 200, 240},{ 340, -30, 70, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 100, 190, 200, 190},{ 340, 170, 160, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 110, 200, 160, 90},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 130},{ 340, 250, 200, 270, 230},{ 340, 200, 200, 200, 200},{ 340, 250, 200, 270, 230}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 140, 170},{ 340, 50, 200, 30, -150}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 180, 200, 150, -20},{ 340, 250, 200, 220, 230}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 200, -10, 120},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 30, 170},{ 340, 200, 250, 130, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 130, 170}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 70, -250, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 190, -120, 190},{ 340, 200, 160, 130, 80}} +} +}, +/* GU....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 250, 240, 130, 200},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 250, 140, 200},{ 340, 310, 230, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 190, 80, 200},{ 340, 130, 20, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 230, 120, 190, 200},{ 340, 270, 150, 220, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 230, 220, 200, 220},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 230, 200, 230},{ 340, 220, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 180, 240, 200, 240},{ 340, 10, 100, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 110, 200, 200, 200},{ 340, 140, 140, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 130, 200, 180, 110},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 200, 190, 120},{ 340, 220, 200, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 140, 160},{ 340, 90, 200, 70, -110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 190, 200, 160, -10},{ 340, 220, 200, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 220, 10, 140},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 20, 150},{ 340, 200, 220, 100, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 100, -210, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 200, -110, 200},{ 340, 200, 140, 110, 60}} +} +}, +/* GU....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 230, 220, 110, 200},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 340, 260, 250, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 260, 250, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 200, 90, 200},{ 340, 100, -20, 50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 220, 110, 180, 200},{ 340, 290, 180, 250, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 210, 200, 200, 200},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 250, 200, 250},{ 340, 250, 250, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 250, 250, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 190, 240, 200, 240},{ 340, -30, 70, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 100, 190, 200, 190},{ 340, 170, 160, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 110, 200, 160, 90},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 130},{ 340, 250, 200, 270, 230},{ 340, 200, 200, 200, 200},{ 340, 250, 200, 270, 230}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 140, 170},{ 340, 50, 200, 30, -150}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 180, 200, 150, -20},{ 340, 250, 200, 220, 230}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 200, -10, 120},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 30, 170},{ 340, 200, 250, 130, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 130, 170}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 70, -250, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 190, -120, 190},{ 340, 200, 160, 130, 80}} +} +}, +/* GU....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* UG....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 100, 200},{ 340, 190, 190, 90, 200},{ 340, 100, 100, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 240, 130, 200},{ 340, 280, 220, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 210, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 100, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 70, 200},{ 340, 30, -70, 10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 270, 210, 200, 200},{ 340, 180, 80, 160, 200},{ 340, 220, 120, 190, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 260, 200, 230},{ 340, 150, 190, 200, 160},{ 340, 60, 200, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 240, 200, 210},{ 340, 180, 220, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 160, 210, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 200, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 130, 240, 200, 210},{ 340, -110, 30, 200, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 210, 200, 180},{ 340, 40, 180, 200, 150},{ 340, 70, 120, 200, 90}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 140, 150},{ 340, 90, 200, 130, 40},{ 340, 0, 200, 40, 130},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 200, 170, 80},{ 340, 220, 200, 220, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 200, 150}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 40, 130},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 110, 120},{ 340, 10, 200, -30, -220}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 200, 150},{ 340, 160, 200, 120, -70},{ 340, 190, 200, 150, 150}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, 20, 220},{ 340, 200, 190, -90, 110},{ 340, 200, 200, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, -40, 150},{ 340, 200, 220, 40, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 0, 190},{ 340, 200, 30, -350, 30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120},{ 340, 200, 180, -200, 180},{ 340, 200, 120, 20, 30}} +} +}, +/* UG....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 210, 110, 200},{ 340, 190, 190, 80, 200},{ 340, 10, 10, -90, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 180, 80, 200},{ 340, 250, 190, 180, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 90, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 70, -30, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 70, 200},{ 340, 0, -100, -30, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 250, 190, 190, 200},{ 340, 40, -60, 10, 200},{ 340, 210, 110, 190, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 270, 200, 240},{ 340, 140, 190, 200, 160},{ 340, -30, 110, 200, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 180, 200, 150},{ 340, 140, 190, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 40, 90, 200, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 170, 200, 140},{ 340, 200, 200, 200, 200},{ 340, 130, 240, 200, 210},{ 340, -150, 0, 200, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 150, 190, 200, 160},{ 340, -110, 40, 200, 10},{ 340, 70, 110, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 200, 150, 160},{ 340, 80, 200, 120, 30},{ 340, -90, 200, -50, 40},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 200, 120, 30},{ 340, 180, 200, 180, 130},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 80, 40}}, +{{ 340, 340, 340, 340, 340},{ 340, -30, 200, 10, 100},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 110, 120},{ 340, -30, 200, -70, -260}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 190, 200, 190, 140},{ 340, 10, 200, -30, -220},{ 340, 190, 200, 150, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 230},{ 340, 200, 190, -90, 100},{ 340, 200, 110, -90, 110},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 180, -100, 100},{ 340, 200, 190, 10, 100},{ 340, 200, 200, 200, 200},{ 340, 200, 90, -90, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, -30, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 0, 190},{ 340, 200, 0, -390, -10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 190, 10, 110},{ 340, 200, 40, -350, 30},{ 340, 200, 110, 10, 30}} +} +}, +/* UG....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 250, 250, 150, 200},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 260, 160, 200},{ 340, 310, 250, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 100, 200},{ 340, 130, 30, 110, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 230, 130, 210, 200},{ 340, 270, 170, 240, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 210, 250, 200, 220},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 220, 260, 200, 230},{ 340, 200, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 160, 270, 200, 240},{ 340, -10, 130, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 90, 230, 200, 200},{ 340, 120, 170, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 150, 200, 190, 100},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 200, 200, 110},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200},{ 340, 100, 200, 140, 150},{ 340, 110, 200, 70, -120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 210, 200, 170, -20},{ 340, 240, 200, 200, 190}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 250, -30, 170},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, -20, 180},{ 340, 200, 250, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 220},{ 340, 200, 130, -250, 130}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 230, -150, 230},{ 340, 200, 170, 70, 80}} +} +}, +/* UG....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 230, 230, 130, 200},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 340, 280, 270, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 280, 270, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 110, 200},{ 340, 100, 0, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 220, 120, 200, 200},{ 340, 290, 190, 270, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 190, 230, 200, 200},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 280, 200, 250},{ 340, 230, 280, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 230, 280, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 170, 270, 200, 240},{ 340, -50, 100, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 80, 220, 200, 190},{ 340, 150, 190, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 130, 200, 170, 80},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 120},{ 340, 270, 200, 270, 220},{ 340, 200, 200, 200, 200},{ 340, 270, 200, 270, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 150, 160},{ 340, 70, 200, 30, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 160, -30},{ 340, 270, 200, 230, 220}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 230, -50, 150},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 280, 0, 190},{ 340, 200, 280, 100, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 280, 100, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 230},{ 340, 200, 100, -290, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 220, -160, 220},{ 340, 200, 190, 90, 110}} +} +}, +/* UG....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 250, 250, 150, 200},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 260, 160, 200},{ 340, 310, 250, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 100, 200},{ 340, 130, 30, 110, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 230, 130, 210, 200},{ 340, 270, 170, 240, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 210, 250, 200, 220},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 220, 260, 200, 230},{ 340, 200, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 160, 270, 200, 240},{ 340, -10, 130, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 90, 230, 200, 200},{ 340, 120, 170, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 150, 200, 190, 100},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 200, 200, 110},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200},{ 340, 100, 200, 140, 150},{ 340, 110, 200, 70, -120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 210, 200, 170, -20},{ 340, 240, 200, 200, 190}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 250, -30, 170},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, -20, 180},{ 340, 200, 250, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 220},{ 340, 200, 130, -250, 130}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 230, -150, 230},{ 340, 200, 170, 70, 80}} +} +}, +/* UG....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 230, 230, 130, 200},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 340, 280, 270, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 280, 270, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 110, 200},{ 340, 100, 0, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 220, 120, 200, 200},{ 340, 290, 190, 270, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 190, 230, 200, 200},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 280, 200, 250},{ 340, 230, 280, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 230, 280, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 170, 270, 200, 240},{ 340, -50, 100, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 80, 220, 200, 190},{ 340, 150, 190, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 130, 200, 170, 80},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 120},{ 340, 270, 200, 270, 220},{ 340, 200, 200, 200, 200},{ 340, 270, 200, 270, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 150, 160},{ 340, 70, 200, 30, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 160, -30},{ 340, 270, 200, 230, 220}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 230, -50, 150},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 280, 0, 190},{ 340, 200, 280, 100, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 280, 100, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 230},{ 340, 200, 100, -290, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 220, -160, 220},{ 340, 200, 190, 90, 110}} +} +}, +/* UG....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* AU....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 190, 80, 200},{ 340, 190, 180, 70, 200},{ 340, 100, 90, -20, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 220, 110, 200},{ 340, 280, 210, 200, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 190, 180, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 90, -20, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 160, 50, 200},{ 340, 30, -80, -10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 270, 190, 180, 200},{ 340, 180, 70, 140, 200},{ 340, 220, 100, 180, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 230, 200, 230},{ 340, 170, 160, 200, 160},{ 340, 80, 170, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 210, 200, 210},{ 340, 200, 190, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 170, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 150, 210, 200, 210},{ 340, -90, 0, 200, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 200, 180},{ 340, 60, 150, 200, 150},{ 340, 90, 90, 200, 90}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 200, 130, 160},{ 340, 70, 200, 120, 50},{ 340, -20, 200, 30, 140},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 200, 170, 90},{ 340, 200, 200, 210, 180},{ 340, 200, 200, 200, 200},{ 340, 180, 200, 200, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, -20, 200, 30, 140},{ 340, 200, 200, 200, 200},{ 340, 50, 200, 110, 130},{ 340, -10, 200, -40, -210}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 180, 200, 200, 160},{ 340, 140, 200, 110, -60},{ 340, 180, 200, 150, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 60, 190},{ 340, 200, 160, -50, 80},{ 340, 200, 170, 40, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 210, 0, 130},{ 340, 200, 190, 80, 110},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 70, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, 40, 180},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 40, 170},{ 340, 200, 0, -310, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 180, 70, 100},{ 340, 200, 150, -160, 160},{ 340, 200, 90, 60, 10}} +} +}, +/* AU....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 200, 90, 200},{ 340, 190, 170, 60, 200},{ 340, 10, 0, -110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 170, 60, 200},{ 340, 250, 170, 160, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 70, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 60, -50, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 160, 50, 200},{ 340, 0, -120, -50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 250, 180, 170, 200},{ 340, 40, -80, -10, 200},{ 340, 210, 100, 170, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 240, 200, 240},{ 340, 160, 160, 200, 160},{ 340, -10, 80, 200, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 150, 200, 150},{ 340, 160, 160, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 60, 60, 200, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 140, 200, 140},{ 340, 200, 200, 200, 200},{ 340, 150, 210, 200, 210},{ 340, -130, -30, 200, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 160, 200, 160},{ 340, -90, 10, 200, 10},{ 340, 90, 80, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 90, 200, 140, 170},{ 340, 60, 200, 120, 40},{ 340, -110, 200, -60, 50},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 200, 110, 40},{ 340, 160, 200, 180, 140},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 80, 50}}, +{{ 340, 340, 340, 340, 340},{ 340, -50, 200, 0, 110},{ 340, 200, 200, 200, 200},{ 340, 50, 200, 110, 130},{ 340, -50, 200, -70, -250}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 170, 200, 180, 150},{ 340, -10, 200, -30, -210},{ 340, 170, 200, 140, 150}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 70, 200},{ 340, 200, 160, -50, 80},{ 340, 200, 80, -50, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 150, -60, 70},{ 340, 200, 160, 50, 80},{ 340, 200, 200, 200, 200},{ 340, 200, 60, -50, -20}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 140, 10, 150},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 40, 170},{ 340, 200, -30, -350, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 160, 50, 80},{ 340, 200, 10, -310, 10},{ 340, 200, 80, 50, 0}} +} +}, +/* AU....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 250, 240, 130, 200},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 250, 140, 200},{ 340, 310, 230, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 190, 80, 200},{ 340, 130, 20, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 230, 120, 190, 200},{ 340, 270, 150, 220, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 230, 220, 200, 220},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 230, 200, 230},{ 340, 220, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 180, 240, 200, 240},{ 340, 10, 100, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 110, 200, 200, 200},{ 340, 140, 140, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 130, 200, 180, 110},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 200, 190, 120},{ 340, 220, 200, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 140, 160},{ 340, 90, 200, 70, -110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 190, 200, 160, -10},{ 340, 220, 200, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 220, 10, 140},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 20, 150},{ 340, 200, 220, 100, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 100, -210, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 200, -110, 200},{ 340, 200, 140, 110, 60}} +} +}, +/* AU....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 230, 220, 110, 200},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 340, 260, 250, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 260, 250, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 200, 90, 200},{ 340, 100, -20, 50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 220, 110, 180, 200},{ 340, 290, 180, 250, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 210, 200, 200, 200},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 250, 200, 250},{ 340, 250, 250, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 250, 250, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 190, 240, 200, 240},{ 340, -30, 70, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 100, 190, 200, 190},{ 340, 170, 160, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 110, 200, 160, 90},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 130},{ 340, 250, 200, 270, 230},{ 340, 200, 200, 200, 200},{ 340, 250, 200, 270, 230}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 140, 170},{ 340, 50, 200, 30, -150}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 180, 200, 150, -20},{ 340, 250, 200, 220, 230}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 200, -10, 120},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 30, 170},{ 340, 200, 250, 130, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 130, 170}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 70, -250, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 190, -120, 190},{ 340, 200, 160, 130, 80}} +} +}, +/* AU....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 250, 240, 130, 200},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 250, 140, 200},{ 340, 310, 230, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 140, 30, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 190, 80, 200},{ 340, 130, 20, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 230, 120, 190, 200},{ 340, 270, 150, 220, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 230, 220, 200, 220},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 230, 200, 230},{ 340, 220, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 220, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 180, 240, 200, 240},{ 340, 10, 100, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 110, 200, 200, 200},{ 340, 140, 140, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 130, 200, 180, 110},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 200, 190, 120},{ 340, 220, 200, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 200, 80, 190},{ 340, 200, 200, 200, 200},{ 340, 80, 200, 140, 160},{ 340, 90, 200, 70, -110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 190, 200, 160, -10},{ 340, 220, 200, 200, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 220, 10, 140},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 230, 20, 150},{ 340, 200, 220, 100, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 220, 90, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 100, -210, 110}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 200, -110, 200},{ 340, 200, 140, 110, 60}} +} +}, +/* AU....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 230, 220, 110, 200},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 260, 150, 200},{ 340, 340, 260, 250, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 260, 250, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 160, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 200, 90, 200},{ 340, 100, -20, 50, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 230, 220, 200},{ 340, 220, 110, 180, 200},{ 340, 290, 180, 250, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 310, 200, 310},{ 340, 210, 200, 200, 200},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 250, 250, 200, 250},{ 340, 250, 250, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 250, 250, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 240, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 190, 240, 200, 240},{ 340, -30, 70, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 220, 200, 220},{ 340, 100, 190, 200, 190},{ 340, 170, 160, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 230},{ 340, 110, 200, 160, 90},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 200, 210, 130},{ 340, 250, 200, 270, 230},{ 340, 200, 200, 200, 200},{ 340, 250, 200, 270, 230}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 100, 210},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 140, 170},{ 340, 50, 200, 30, -150}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 220, 200, 240, 200},{ 340, 180, 200, 150, -20},{ 340, 250, 200, 220, 230}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 310, 130, 270},{ 340, 200, 200, -10, 120},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 30, 170},{ 340, 200, 250, 130, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 130, 170}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, 110, 240},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 70, 200},{ 340, 200, 70, -250, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 220, 100, 140},{ 340, 200, 190, -120, 190},{ 340, 200, 160, 130, 80}} +} +}, +/* AU....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* UA....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 100, 200},{ 340, 190, 190, 90, 200},{ 340, 100, 100, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 240, 240, 130, 200},{ 340, 280, 220, 220, 200},{ 340, 200, 200, 200, 200},{ 340, 270, 210, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 100, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 70, 200},{ 340, 30, -70, 10, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 270, 210, 200, 200},{ 340, 180, 80, 160, 200},{ 340, 220, 120, 190, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 260, 200, 230},{ 340, 150, 190, 200, 160},{ 340, 60, 200, 200, 170},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 190, 240, 200, 210},{ 340, 180, 220, 200, 190},{ 340, 200, 200, 200, 200},{ 340, 160, 210, 200, 180}}, +{{ 340, 340, 340, 340, 340},{ 340, 60, 200, 200, 170},{ 340, 200, 200, 200, 200},{ 340, 130, 240, 200, 210},{ 340, -110, 30, 200, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 160, 210, 200, 180},{ 340, 40, 180, 200, 150},{ 340, 70, 120, 200, 90}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 100, 200, 140, 150},{ 340, 90, 200, 130, 40},{ 340, 0, 200, 40, 130},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 200, 170, 80},{ 340, 220, 200, 220, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 200, 150}}, +{{ 340, 340, 340, 340, 340},{ 340, 0, 200, 40, 130},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 110, 120},{ 340, 10, 200, -30, -220}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 200, 200, 150},{ 340, 160, 200, 120, -70},{ 340, 190, 200, 150, 150}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, 20, 220},{ 340, 200, 190, -90, 110},{ 340, 200, 200, 0, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 240, -40, 150},{ 340, 200, 220, 40, 140},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 0, 200},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 0, 190},{ 340, 200, 30, -350, 30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 210, 30, 120},{ 340, 200, 180, -200, 180},{ 340, 200, 120, 20, 30}} +} +}, +/* UA....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 210, 210, 110, 200},{ 340, 190, 190, 80, 200},{ 340, 10, 10, -90, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 180, 180, 80, 200},{ 340, 250, 190, 180, 200},{ 340, 200, 200, 200, 200},{ 340, 150, 90, 90, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 70, -30, 200},{ 340, 200, 200, 200, 200},{ 340, 180, 180, 70, 200},{ 340, 0, -100, -30, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 250, 190, 190, 200},{ 340, 40, -60, 10, 200},{ 340, 210, 110, 190, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 270, 200, 240},{ 340, 140, 190, 200, 160},{ 340, -30, 110, 200, 80},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 140, 180, 200, 150},{ 340, 140, 190, 200, 160},{ 340, 200, 200, 200, 200},{ 340, 40, 90, 200, 60}}, +{{ 340, 340, 340, 340, 340},{ 340, 30, 170, 200, 140},{ 340, 200, 200, 200, 200},{ 340, 130, 240, 200, 210},{ 340, -150, 0, 200, -30}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 150, 190, 200, 160},{ 340, -110, 40, 200, 10},{ 340, 70, 110, 200, 80}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 200, 150, 160},{ 340, 80, 200, 120, 30},{ 340, -90, 200, -50, 40},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 80, 200, 120, 30},{ 340, 180, 200, 180, 130},{ 340, 200, 200, 200, 200},{ 340, 90, 200, 80, 40}}, +{{ 340, 340, 340, 340, 340},{ 340, -30, 200, 10, 100},{ 340, 200, 200, 200, 200},{ 340, 70, 200, 110, 120},{ 340, -30, 200, -70, -260}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 190, 200, 190, 140},{ 340, 10, 200, -30, -220},{ 340, 190, 200, 150, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 30, 230},{ 340, 200, 190, -90, 100},{ 340, 200, 110, -90, 110},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 180, -100, 100},{ 340, 200, 190, 10, 100},{ 340, 200, 200, 200, 200},{ 340, 200, 90, -90, 0}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 170, -30, 170},{ 340, 200, 200, 200, 200},{ 340, 200, 240, 0, 190},{ 340, 200, 0, -390, -10}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 190, 10, 110},{ 340, 200, 40, -350, 30},{ 340, 200, 110, 10, 30}} +} +}, +/* UA....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 250, 250, 150, 200},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 260, 160, 200},{ 340, 310, 250, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 100, 200},{ 340, 130, 30, 110, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 230, 130, 210, 200},{ 340, 270, 170, 240, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 210, 250, 200, 220},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 220, 260, 200, 230},{ 340, 200, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 160, 270, 200, 240},{ 340, -10, 130, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 90, 230, 200, 200},{ 340, 120, 170, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 150, 200, 190, 100},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 200, 200, 110},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200},{ 340, 100, 200, 140, 150},{ 340, 110, 200, 70, -120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 210, 200, 170, -20},{ 340, 240, 200, 200, 190}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 250, -30, 170},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, -20, 180},{ 340, 200, 250, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 220},{ 340, 200, 130, -250, 130}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 230, -150, 230},{ 340, 200, 170, 70, 80}} +} +}, +/* UA....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 230, 230, 130, 200},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 340, 280, 270, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 280, 270, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 110, 200},{ 340, 100, 0, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 220, 120, 200, 200},{ 340, 290, 190, 270, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 190, 230, 200, 200},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 280, 200, 250},{ 340, 230, 280, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 230, 280, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 170, 270, 200, 240},{ 340, -50, 100, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 80, 220, 200, 190},{ 340, 150, 190, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 130, 200, 170, 80},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 120},{ 340, 270, 200, 270, 220},{ 340, 200, 200, 200, 200},{ 340, 270, 200, 270, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 150, 160},{ 340, 70, 200, 30, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 160, -30},{ 340, 270, 200, 230, 220}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 230, -50, 150},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 280, 0, 190},{ 340, 200, 280, 100, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 280, 100, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 230},{ 340, 200, 100, -290, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 220, -160, 220},{ 340, 200, 190, 90, 110}} +} +}, +/* UA....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 250, 250, 150, 200},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 260, 260, 160, 200},{ 340, 310, 250, 240, 200},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 150, 150, 50, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 100, 200},{ 340, 130, 30, 110, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 230, 130, 210, 200},{ 340, 270, 170, 240, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 210, 250, 200, 220},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 220, 260, 200, 230},{ 340, 200, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 110, 250, 200, 220},{ 340, 200, 200, 200, 200},{ 340, 160, 270, 200, 240},{ 340, -10, 130, 200, 100}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 90, 230, 200, 200},{ 340, 120, 170, 200, 140}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 150, 200, 190, 100},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 160, 200, 200, 110},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 50, 200, 90, 180},{ 340, 200, 200, 200, 200},{ 340, 100, 200, 140, 150},{ 340, 110, 200, 70, -120}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 210, 200, 170, -20},{ 340, 240, 200, 200, 190}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 250, -30, 170},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 260, -20, 180},{ 340, 200, 250, 70, 160},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 250, 50, 250},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 220},{ 340, 200, 130, -250, 130}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 230, -150, 230},{ 340, 200, 170, 70, 80}} +} +}, +/* UA....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 230, 230, 130, 200},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 280, 280, 170, 200},{ 340, 340, 280, 270, 200},{ 340, 200, 200, 200, 200},{ 340, 340, 280, 270, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 170, 70, 200},{ 340, 200, 200, 200, 200},{ 340, 210, 210, 110, 200},{ 340, 100, 0, 70, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 310, 250, 240, 200},{ 340, 220, 120, 200, 200},{ 340, 290, 190, 270, 200}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 340, 200, 310},{ 340, 190, 230, 200, 200},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 230, 280, 200, 250},{ 340, 230, 280, 200, 250},{ 340, 200, 200, 200, 200},{ 340, 230, 280, 200, 250}}, +{{ 340, 340, 340, 340, 340},{ 340, 130, 270, 200, 240},{ 340, 200, 200, 200, 200},{ 340, 170, 270, 200, 240},{ 340, -50, 100, 200, 70}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 200, 220},{ 340, 80, 220, 200, 190},{ 340, 150, 190, 200, 160}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 220},{ 340, 130, 200, 170, 80},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 170, 200, 210, 120},{ 340, 270, 200, 270, 220},{ 340, 200, 200, 200, 200},{ 340, 270, 200, 270, 220}}, +{{ 340, 340, 340, 340, 340},{ 340, 70, 200, 110, 200},{ 340, 200, 200, 200, 200},{ 340, 110, 200, 150, 160},{ 340, 70, 200, 30, -160}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 240, 200, 240, 190},{ 340, 200, 200, 160, -30},{ 340, 270, 200, 230, 220}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 340, 100, 290},{ 340, 200, 230, -50, 150},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 280, 0, 190},{ 340, 200, 280, 100, 190},{ 340, 200, 200, 200, 200},{ 340, 200, 280, 100, 190}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 270, 70, 270},{ 340, 200, 200, 200, 200},{ 340, 200, 270, 30, 230},{ 340, 200, 100, -290, 90}}, +{{ 340, 340, 340, 340, 340},{ 340, 200, 200, 200, 200},{ 340, 200, 250, 70, 160},{ 340, 200, 220, -160, 220},{ 340, 200, 190, 90, 110}} +} +}, +/* UA....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +}, +{ /* noPair */ {{{{0}}}}, +/* ??....CG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....GC */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....GU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....UG */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....AU */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....UA */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +}, +/* ??....?? */ +{{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +}, +{ +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}}, +{{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340},{ 340, 340, 340, 340, 340}} +} +} +} +}; + +const int energy_param::int22_H[8][8][5][5][5][5] = +{ /* noPair */ {{{{{0}}}}}, +{ /* noPair */ {{{{0}}}}, +/* CG.@@..CG */ +{ { { { 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..CG */ +{ { 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* CG.@C..CG */ +{ { 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* CG.@G..CG */ +{ { 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* CG.@U..CG */ +{ { 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* CG.A@..CG */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..CG */ +{{ -50,-1029, -949,-1029,-1029}, +{-1079,-2058,-1978,-2058,-2058}, +{ -569,-1548,-1468,-1548,-1548}, +{ -989,-1968,-1888,-1968,-1968}, +{ -859,-1838,-1758,-1838,-1838}}, +/* CG.AC..CG */ +{{ -50,-1029, -949,-1029,-1029}, +{ -999,-1978,-1898,-1978,-1978}, +{ -499,-1478,-1398,-1478,-1478}, +{ -989,-1968,-1888,-1968,-1968}, +{ -789,-1768,-1688,-1768,-1768}}, +/* CG.AG..CG */ +{{ -50,-1029, -949,-1029,-1029}, +{-1079,-2058,-1978,-2058,-2058}, +{ -569,-1548,-1468,-1548,-1548}, +{ -989,-1968,-1888,-1968,-1968}, +{ -859,-1838,-1758,-1838,-1838}}, +/* CG.AU..CG */ +{{ -50,-1029, -949,-1029,-1029}, +{-1079,-2058,-1978,-2058,-2058}, +{ -719,-1698,-1618,-1698,-1698}, +{ -989,-1968,-1888,-1968,-1968}, +{ -909,-1888,-1808,-1888,-1888}}}, +/* CG.C@..CG */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..CG */ +{{ -50, -519, -449, -519, -669}, +{-1079,-1548,-1478,-1548,-1698}, +{ -569,-1038, -968,-1038,-1188}, +{ -989,-1458,-1388,-1458,-1608}, +{ -859,-1328,-1258,-1328,-1478}}, +/* CG.CC..CG */ +{{ -50, -519, -449, -519, -669}, +{ -999,-1468,-1398,-1468,-1618}, +{ -499, -968, -898, -968,-1118}, +{ -989,-1458,-1388,-1458,-1608}, +{ -789,-1258,-1188,-1258,-1408}}, +/* CG.CG..CG */ +{{ -50, -519, -449, -519, -669}, +{-1079,-1548,-1478,-1548,-1698}, +{ -569,-1038, -968,-1038,-1188}, +{ -989,-1458,-1388,-1458,-1608}, +{ -859,-1328,-1258,-1328,-1478}}, +/* CG.CU..CG */ +{{ -50, -519, -449, -519, -669}, +{-1079,-1548,-1478,-1548,-1698}, +{ -719,-1188,-1118,-1188,-1338}, +{ -989,-1458,-1388,-1458,-1608}, +{ -909,-1378,-1308,-1378,-1528}}}, +/* CG.G@..CG */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..CG */ +{{ -50, -939, -939, -939, -939}, +{-1079,-1968,-1968,-1968,-1968}, +{ -569,-1458,-1458,-1458,-1458}, +{ -989,-1878,-1878,-1878,-1878}, +{ -859,-1748,-1748,-1748,-1748}}, +/* CG.GC..CG */ +{{ -50, -939, -939, -939, -939}, +{ -999,-1888,-1888,-1888,-1888}, +{ -499,-1388,-1388,-1388,-1388}, +{ -989,-1878,-1878,-1878,-1878}, +{ -789,-1678,-1678,-1678,-1678}}, +/* CG.GG..CG */ +{{ -50, -939, -939, -939, -939}, +{-1079,-1968,-1968,-1968,-1968}, +{ -569,-1458,-1458,-1458,-1458}, +{ -989,-1878,-1878,-1878,-1878}, +{ -859,-1748,-1748,-1748,-1748}}, +/* CG.GU..CG */ +{{ -50, -939, -939, -939, -939}, +{-1079,-1968,-1968,-1968,-1968}, +{ -719,-1608,-1608,-1608,-1608}, +{ -989,-1878,-1878,-1878,-1878}, +{ -909,-1798,-1798,-1798,-1798}}}, +/* CG.U@..CG */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..CG */ +{{ -50, -809, -739, -809, -859}, +{-1079,-1838,-1768,-1838,-1888}, +{ -569,-1328,-1258,-1328,-1378}, +{ -989,-1748,-1678,-1748,-1798}, +{ -859,-1618,-1548,-1618,-1668}}, +/* CG.UC..CG */ +{{ -50, -809, -739, -809, -859}, +{ -999,-1758,-1688,-1758,-1808}, +{ -499,-1258,-1188,-1258,-1308}, +{ -989,-1748,-1678,-1748,-1798}, +{ -789,-1548,-1478,-1548,-1598}}, +/* CG.UG..CG */ +{{ -50, -809, -739, -809, -859}, +{-1079,-1838,-1768,-1838,-1888}, +{ -569,-1328,-1258,-1328,-1378}, +{ -989,-1748,-1678,-1748,-1798}, +{ -859,-1618,-1548,-1618,-1668}}, +/* CG.UU..CG */ +{{ -50, -809, -739, -809, -859}, +{-1079,-1838,-1768,-1838,-1888}, +{ -719,-1478,-1408,-1478,-1528}, +{ -989,-1748,-1678,-1748,-1798}, +{ -909,-1668,-1598,-1668,-1718}}}}, +/* CG.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* CG.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* CG.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* CG.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* CG.A@..GC */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..GC */ +{{ -50,-1029, -949,-1029,-1029}, +{ -569,-1548,-1468,-1548,-1548}, +{ -769,-1748,-1668,-1748,-1748}, +{ -759,-1738,-1658,-1738,-1738}, +{ -549,-1528,-1448,-1528,-1528}}, +/* CG.AC..GC */ +{{ -50,-1029, -949,-1029,-1029}, +{ -929,-1908,-1828,-1908,-1908}, +{ -359,-1338,-1258,-1338,-1338}, +{ -789,-1768,-1688,-1768,-1768}, +{ -549,-1528,-1448,-1528,-1528}}, +/* CG.AG..GC */ +{{ -50,-1029, -949,-1029,-1029}, +{ -609,-1588,-1508,-1588,-1588}, +{ -359,-1338,-1258,-1338,-1338}, +{ -669,-1648,-1568,-1648,-1648}, +{ -549,-1528,-1448,-1528,-1528}}, +/* CG.AU..GC */ +{{ -50,-1029, -949,-1029,-1029}, +{ -929,-1908,-1828,-1908,-1908}, +{ -439,-1418,-1338,-1418,-1418}, +{ -789,-1768,-1688,-1768,-1768}, +{ -619,-1598,-1518,-1598,-1598}}}, +/* CG.C@..GC */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..GC */ +{{ -50, -519, -449, -519, -669}, +{ -569,-1038, -968,-1038,-1188}, +{ -769,-1238,-1168,-1238,-1388}, +{ -759,-1228,-1158,-1228,-1378}, +{ -549,-1018, -948,-1018,-1168}}, +/* CG.CC..GC */ +{{ -50, -519, -449, -519, -669}, +{ -929,-1398,-1328,-1398,-1548}, +{ -359, -828, -758, -828, -978}, +{ -789,-1258,-1188,-1258,-1408}, +{ -549,-1018, -948,-1018,-1168}}, +/* CG.CG..GC */ +{{ -50, -519, -449, -519, -669}, +{ -609,-1078,-1008,-1078,-1228}, +{ -359, -828, -758, -828, -978}, +{ -669,-1138,-1068,-1138,-1288}, +{ -549,-1018, -948,-1018,-1168}}, +/* CG.CU..GC */ +{{ -50, -519, -449, -519, -669}, +{ -929,-1398,-1328,-1398,-1548}, +{ -439, -908, -838, -908,-1058}, +{ -789,-1258,-1188,-1258,-1408}, +{ -619,-1088,-1018,-1088,-1238}}}, +/* CG.G@..GC */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..GC */ +{{ -50, -939, -939, -939, -939}, +{ -569,-1458,-1458,-1458,-1458}, +{ -769,-1658,-1658,-1658,-1658}, +{ -759,-1648,-1648,-1648,-1648}, +{ -549,-1438,-1438,-1438,-1438}}, +/* CG.GC..GC */ +{{ -50, -939, -939, -939, -939}, +{ -929,-1818,-1818,-1818,-1818}, +{ -359,-1248,-1248,-1248,-1248}, +{ -789,-1678,-1678,-1678,-1678}, +{ -549,-1438,-1438,-1438,-1438}}, +/* CG.GG..GC */ +{{ -50, -939, -939, -939, -939}, +{ -609,-1498,-1498,-1498,-1498}, +{ -359,-1248,-1248,-1248,-1248}, +{ -669,-1558,-1558,-1558,-1558}, +{ -549,-1438,-1438,-1438,-1438}}, +/* CG.GU..GC */ +{{ -50, -939, -939, -939, -939}, +{ -929,-1818,-1818,-1818,-1818}, +{ -439,-1328,-1328,-1328,-1328}, +{ -789,-1678,-1678,-1678,-3080}, +{ -619,-1508,-1508,-1508,-1508}}}, +/* CG.U@..GC */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..GC */ +{{ -50, -809, -739, -809, -859}, +{ -569,-1328,-1258,-1328,-1378}, +{ -769,-1528,-1458,-1528,-1578}, +{ -759,-1518,-1448,-1518,-1568}, +{ -549,-1308,-1238,-1308,-1358}}, +/* CG.UC..GC */ +{{ -50, -809, -739, -809, -859}, +{ -929,-1688,-1618,-1688,-1738}, +{ -359,-1118,-1048,-1118,-1168}, +{ -789,-1548,-1478,-1548,-1598}, +{ -549,-1308,-1238,-1308,-1358}}, +/* CG.UG..GC */ +{{ -50, -809, -739, -809, -859}, +{ -609,-1368,-1298,-1368,-1418}, +{ -359,-1118,-1048,-1118,-1168}, +{ -669,-1428,-1358,-1428,-1478}, +{ -549,-1308,-1238,-1308,-1358}}, +/* CG.UU..GC */ +{{ -50, -809, -739, -809, -859}, +{ -929,-1688,-1618,-1688,-1738}, +{ -439,-1198,-1128,-1198,-1248}, +{ -789,-1548,-1478,-1548,-1598}, +{ -619,-1378,-1308,-1378,-1428}}}}, +/* CG.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* CG.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* CG.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* CG.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* CG.A@..GU */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..GU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -479,-1458,-1378,-1458,-1458}, +{ -309,-1288,-1208,-1288,-1288}, +{ -389,-1368,-1288,-1368,-1368}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AC..GU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AG..GU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AU..GU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}}, +/* CG.C@..GU */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..GU */ +{{ -50, -519, -449, -519, -669}, +{ -479, -948, -878, -948,-1098}, +{ -309, -778, -708, -778, -928}, +{ -389, -858, -788, -858,-1008}, +{ -379, -848, -778, -848, -998}}, +/* CG.CC..GU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}, +/* CG.CG..GU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}, +/* CG.CU..GU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}}, +/* CG.G@..GU */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..GU */ +{{ -50, -939, -939, -939, -939}, +{ -479,-1368,-1368,-1368,-1368}, +{ -309,-1198,-1198,-1198,-1198}, +{ -389,-1278,-1278,-1278,-1278}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GC..GU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GG..GU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GU..GU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}}, +/* CG.U@..GU */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..GU */ +{{ -50, -809, -739, -809, -859}, +{ -479,-1238,-1168,-1238,-1288}, +{ -309,-1068, -998,-1068,-1118}, +{ -389,-1148,-1078,-1148,-1198}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UC..GU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UG..GU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UU..GU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}}}, +/* CG.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* CG.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* CG.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* CG.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* CG.A@..UG */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..UG */ +{{ -50,-1029, -949,-1029,-1029}, +{ -769,-1748,-1668,-1748,-1748}, +{ -529,-1508,-1428,-1508,-1508}, +{ -709,-1688,-1608,-1688,-1688}, +{ -599,-1578,-1498,-1578,-1578}}, +/* CG.AC..UG */ +{{ -50,-1029, -949,-1029,-1029}, +{ -839,-1818,-1738,-1818,-1818}, +{ -529,-1508,-1428,-1508,-1508}, +{ -859,-1838,-1758,-1838,-1838}, +{ -489,-1468,-1388,-1468,-1468}}, +/* CG.AG..UG */ +{{ -50,-1029, -949,-1029,-1029}, +{-1009,-1988,-1908,-1988,-1988}, +{ -409,-1388,-1308,-1388,-1388}, +{ -969,-1948,-1868,-1948,-1948}, +{ -599,-1578,-1498,-1578,-1578}}, +/* CG.AU..UG */ +{{ -50,-1029, -949,-1029,-1029}, +{ -859,-1838,-1758,-1838,-1838}, +{ -529,-1508,-1428,-1508,-1508}, +{ -859,-1838,-1758,-1838,-1838}, +{ -409,-1388,-1308,-1388,-1388}}}, +/* CG.C@..UG */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..UG */ +{{ -50, -519, -449, -519, -669}, +{ -769,-1238,-1168,-1238,-1388}, +{ -529, -998, -928, -998,-1148}, +{ -709,-1178,-1108,-1178,-1328}, +{ -599,-1068, -998,-1068,-1218}}, +/* CG.CC..UG */ +{{ -50, -519, -449, -519, -669}, +{ -839,-1308,-1238,-1308,-1458}, +{ -529, -998, -928, -998,-1148}, +{ -859,-1328,-1258,-1328,-1478}, +{ -489, -958, -888, -958,-1108}}, +/* CG.CG..UG */ +{{ -50, -519, -449, -519, -669}, +{-1009,-1478,-1408,-1478,-1628}, +{ -409, -878, -808, -878,-1028}, +{ -969,-1438,-1368,-1438,-1588}, +{ -599,-1068, -998,-1068,-1218}}, +/* CG.CU..UG */ +{{ -50, -519, -449, -519, -669}, +{ -859,-1328,-1258,-1328,-1478}, +{ -529, -998, -928, -998,-1148}, +{ -859,-1328,-1258,-1328,-1478}, +{ -409, -878, -808, -878,-1028}}}, +/* CG.G@..UG */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..UG */ +{{ -50, -939, -939, -939, -939}, +{ -769,-1658,-1658,-1658,-1658}, +{ -529,-1418,-1418,-1418,-1418}, +{ -709,-1598,-1598,-1598,-1598}, +{ -599,-1488,-1488,-1488,-1488}}, +/* CG.GC..UG */ +{{ -50, -939, -939, -939, -939}, +{ -839,-1728,-1728,-1728,-1728}, +{ -529,-1418,-1418,-1418,-1418}, +{ -859,-1748,-1748,-1748,-1748}, +{ -489,-1378,-1378,-1378,-1378}}, +/* CG.GG..UG */ +{{ -50, -939, -939, -939, -939}, +{-1009,-1898,-1898,-1898,-1898}, +{ -409,-1298,-1298,-1298,-1298}, +{ -969,-1858,-1858,-1858,-1858}, +{ -599,-1488,-1488,-1488,-1488}}, +/* CG.GU..UG */ +{{ -50, -939, -939, -939, -939}, +{ -859,-1748,-1748,-1748,-1748}, +{ -529,-1418,-1418,-1418,-1418}, +{ -859,-1748,-1748,-1748,-1748}, +{ -409,-1298,-1298,-1298,-1298}}}, +/* CG.U@..UG */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..UG */ +{{ -50, -809, -739, -809, -859}, +{ -769,-1528,-1458,-1528,-1578}, +{ -529,-1288,-1218,-1288,-1338}, +{ -709,-1468,-1398,-1468,-1518}, +{ -599,-1358,-1288,-1358,-1408}}, +/* CG.UC..UG */ +{{ -50, -809, -739, -809, -859}, +{ -839,-1598,-1528,-1598,-1648}, +{ -529,-1288,-1218,-1288,-1338}, +{ -859,-1618,-1548,-1618,-1668}, +{ -489,-1248,-1178,-1248,-1298}}, +/* CG.UG..UG */ +{{ -50, -809, -739, -809, -859}, +{-1009,-1768,-1698,-1768,-1818}, +{ -409,-1168,-1098,-1168,-1218}, +{ -969,-1728,-1658,-1728,-1778}, +{ -599,-1358,-1288,-1358,-1408}}, +/* CG.UU..UG */ +{{ -50, -809, -739, -809, -859}, +{ -859,-1618,-1548,-1618,-1668}, +{ -529,-1288,-1218,-1288,-1338}, +{ -859,-1618,-1548,-1618,-1668}, +{ -409,-1168,-1098,-1168,-1218}}}}, +/* CG.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* CG.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* CG.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* CG.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* CG.A@..AU */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..AU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -479,-1458,-1378,-1458,-1458}, +{ -309,-1288,-1208,-1288,-1288}, +{ -389,-1368,-1288,-1368,-1368}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AC..AU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AG..AU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}, +/* CG.AU..AU */ +{{ -50,-1029, -949,-1029,-1029}, +{ -649,-1628,-1548,-1628,-1628}, +{ -289,-1268,-1188,-1268,-1268}, +{ -739,-1718,-1638,-1718,-1718}, +{ -379,-1358,-1278,-1358,-1358}}}, +/* CG.C@..AU */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..AU */ +{{ -50, -519, -449, -519, -669}, +{ -479, -948, -878, -948,-1098}, +{ -309, -778, -708, -778, -928}, +{ -389, -858, -788, -858,-1008}, +{ -379, -848, -778, -848, -998}}, +/* CG.CC..AU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}, +/* CG.CG..AU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}, +/* CG.CU..AU */ +{{ -50, -519, -449, -519, -669}, +{ -649,-1118,-1048,-1118,-1268}, +{ -289, -758, -688, -758, -908}, +{ -739,-1208,-1138,-1208,-1358}, +{ -379, -848, -778, -848, -998}}}, +/* CG.G@..AU */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..AU */ +{{ -50, -939, -939, -939, -939}, +{ -479,-1368,-1368,-1368,-1368}, +{ -309,-1198,-1198,-1198,-1198}, +{ -389,-1278,-1278,-1278,-1278}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GC..AU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GG..AU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}, +/* CG.GU..AU */ +{{ -50, -939, -939, -939, -939}, +{ -649,-1538,-1538,-1538,-1538}, +{ -289,-1178,-1178,-1178,-1178}, +{ -739,-1628,-1628,-1628,-1628}, +{ -379,-1268,-1268,-1268,-1268}}}, +/* CG.U@..AU */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..AU */ +{{ -50, -809, -739, -809, -859}, +{ -479,-1238,-1168,-1238,-1288}, +{ -309,-1068, -998,-1068,-1118}, +{ -389,-1148,-1078,-1148,-1198}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UC..AU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UG..AU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}, +/* CG.UU..AU */ +{{ -50, -809, -739, -809, -859}, +{ -649,-1408,-1338,-1408,-1458}, +{ -289,-1048, -978,-1048,-1098}, +{ -739,-1498,-1428,-1498,-1548}, +{ -379,-1138,-1068,-1138,-1188}}}}, +/* CG.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* CG.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* CG.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* CG.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* CG.A@..UA */ +{{{ -50,-1029, -949,-1029,-1029}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA..UA */ +{{ -50,-1029, -949,-1029,-1029}, +{ -449,-1428,-1348,-1428,-1428}, +{ -479,-1458,-1378,-1458,-1458}, +{ -429,-1408,-1328,-1408,-1408}, +{ -329,-1308,-1228,-1308,-1308}}, +/* CG.AC..UA */ +{{ -50,-1029, -949,-1029,-1029}, +{ -679,-1658,-1578,-1658,-1658}, +{ -559,-1538,-1458,-1538,-1538}, +{ -729,-1708,-1628,-1708,-1708}, +{ -189,-1168,-1088,-1168,-1168}}, +/* CG.AG..UA */ +{{ -50,-1029, -949,-1029,-1029}, +{ -939,-1918,-1838,-1918,-1918}, +{ -249,-1228,-1148,-1228,-1228}, +{ -939,-1918,-1838,-1918,-1918}, +{ -329,-1308,-1228,-1308,-1308}}, +/* CG.AU..UA */ +{{ -50,-1029, -949,-1029,-1029}, +{ -639,-1618,-1538,-1618,-1618}, +{ -229,-1208,-1128,-1208,-1208}, +{ -729,-1708,-1628,-1708,-1708}, +{ -190,-1169,-1089,-1169,-1169}}}, +/* CG.C@..UA */ +{{{ -50, -519, -449, -519, -669}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA..UA */ +{{ -50, -519, -449, -519, -669}, +{ -449, -918, -848, -918,-1068}, +{ -479, -948, -878, -948,-1098}, +{ -429, -898, -828, -898,-1048}, +{ -329, -798, -728, -798, -948}}, +/* CG.CC..UA */ +{{ -50, -519, -449, -519, -669}, +{ -679,-1148,-1078,-1148,-1298}, +{ -559,-1028, -958,-1028,-1178}, +{ -729,-1198,-1128,-1198,-1348}, +{ -189, -658, -588, -658, -808}}, +/* CG.CG..UA */ +{{ -50, -519, -449, -519, -669}, +{ -939,-1408,-1338,-1408,-1558}, +{ -249, -718, -648, -718, -868}, +{ -939,-1408,-1338,-1408,-1558}, +{ -329, -798, -728, -798, -948}}, +/* CG.CU..UA */ +{{ -50, -519, -449, -519, -669}, +{ -639,-1108,-1038,-1108,-1258}, +{ -229, -698, -628, -698, -848}, +{ -729,-1198,-1128,-1198,-1348}, +{ -190, -659, -589, -659, -809}}}, +/* CG.G@..UA */ +{{{ -50, -939, -939, -939, -939}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA..UA */ +{{ -50, -939, -939, -939, -939}, +{ -449,-1338,-1338,-1338,-1338}, +{ -479,-1368,-1368,-1368,-1368}, +{ -429,-1318,-1318,-1318,-1318}, +{ -329,-1218,-1218,-1218,-1218}}, +/* CG.GC..UA */ +{{ -50, -939, -939, -939, -939}, +{ -679,-1568,-1568,-1568,-1568}, +{ -559,-1448,-1448,-1448,-1448}, +{ -729,-1618,-1618,-1618,-1618}, +{ -189,-1078,-1078,-1078,-1078}}, +/* CG.GG..UA */ +{{ -50, -939, -939, -939, -939}, +{ -939,-1828,-1828,-1828,-1828}, +{ -249,-1138,-1138,-1138,-1138}, +{ -939,-1828,-1828,-1828,-1828}, +{ -329,-1218,-1218,-1218,-1218}}, +/* CG.GU..UA */ +{{ -50, -939, -939, -939, -939}, +{ -639,-1528,-1528,-1528,-1528}, +{ -229,-1118,-1118,-1118,-1118}, +{ -729,-1618,-1618,-1618,-1618}, +{ -190,-1079,-1079,-1079,-1079}}}, +/* CG.U@..UA */ +{{{ -50, -809, -739, -809, -859}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA..UA */ +{{ -50, -809, -739, -809, -859}, +{ -449,-1208,-1138,-1208,-1258}, +{ -479,-1238,-1168,-1238,-1288}, +{ -429,-1188,-1118,-1188,-1238}, +{ -329,-1088,-1018,-1088,-1138}}, +/* CG.UC..UA */ +{{ -50, -809, -739, -809, -859}, +{ -679,-1438,-1368,-1438,-1488}, +{ -559,-1318,-1248,-1318,-1368}, +{ -729,-1488,-1418,-1488,-1538}, +{ -189, -948, -878, -948, -998}}, +/* CG.UG..UA */ +{{ -50, -809, -739, -809, -859}, +{ -939,-1698,-1628,-1698,-1748}, +{ -249,-1008, -938,-1008,-1058}, +{ -939,-1698,-1628,-1698,-1748}, +{ -329,-1088,-1018,-1088,-1138}}, +/* CG.UU..UA */ +{{ -50, -809, -739, -809, -859}, +{ -639,-1398,-1328,-1398,-1448}, +{ -229, -988, -918, -988,-1038}, +{ -729,-1488,-1418,-1488,-1538}, +{ -190, -949, -879, -949, -999}}}}, +/* CG.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* CG.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* CG.A@.. @ */ +{{{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AA.. @ */ +{{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AC.. @ */ +{{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AG.. @ */ +{{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}, +/* CG.AU.. @ */ +{{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}, +{ -100,-1079, -999,-1079,-1079}}}, +/* CG.C@.. @ */ +{{{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CA.. @ */ +{{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CC.. @ */ +{{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CG.. @ */ +{{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}, +/* CG.CU.. @ */ +{{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}, +{ -100, -569, -499, -569, -719}}}, +/* CG.G@.. @ */ +{{{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GA.. @ */ +{{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GC.. @ */ +{{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GG.. @ */ +{{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}, +/* CG.GU.. @ */ +{{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}, +{ -100, -989, -989, -989, -989}}}, +/* CG.U@.. @ */ +{{{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UA.. @ */ +{{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UC.. @ */ +{{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UG.. @ */ +{{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}, +/* CG.UU.. @ */ +{{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}, +{ -100, -859, -789, -859, -909}}}}}, +{ /* noPair */ {{{{0}}}}, +/* GC.@@..CG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* GC.@C..CG */ +{{ 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* GC.@G..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* GC.@U..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* GC.A@..CG */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..CG */ +{{ -50, -519, -879, -559, -879}, +{-1079,-1548,-1908,-1588,-1908}, +{ -569,-1038,-1398,-1078,-1398}, +{ -989,-1458,-1818,-1498,-1818}, +{ -859,-1328,-1688,-1368,-1688}}, +/* GC.AC..CG */ +{{ -50, -519, -879, -559, -879}, +{ -999,-1468,-1828,-1508,-1828}, +{ -499, -968,-1328,-1008,-1328}, +{ -989,-1458,-1818,-1498,-1818}, +{ -789,-1258,-1618,-1298,-1618}}, +/* GC.AG..CG */ +{{ -50, -519, -879, -559, -879}, +{-1079,-1548,-1908,-1588,-1908}, +{ -569,-1038,-1398,-1078,-1398}, +{ -989,-1458,-1818,-1498,-1818}, +{ -859,-1328,-1688,-1368,-1688}}, +/* GC.AU..CG */ +{{ -50, -519, -879, -559, -879}, +{-1079,-1548,-1908,-1588,-1908}, +{ -719,-1188,-1548,-1228,-1548}, +{ -989,-1458,-1818,-1498,-1818}, +{ -909,-1378,-1738,-1418,-1738}}}, +/* GC.C@..CG */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..CG */ +{{ -50, -719, -309, -309, -389}, +{-1079,-1748,-1338,-1338,-1418}, +{ -569,-1238, -828, -828, -908}, +{ -989,-1658,-1248,-1248,-1328}, +{ -859,-1528,-1118,-1118,-1198}}, +/* GC.CC..CG */ +{{ -50, -719, -309, -309, -389}, +{ -999,-1668,-1258,-1258,-1338}, +{ -499,-1168, -758, -758, -838}, +{ -989,-1658,-1248,-1248,-1328}, +{ -789,-1458,-1048,-1048,-1128}}, +/* GC.CG..CG */ +{{ -50, -719, -309, -309, -389}, +{-1079,-1748,-1338,-1338,-1418}, +{ -569,-1238, -828, -828, -908}, +{ -989,-1658,-1248,-1248,-1328}, +{ -859,-1528,-1118,-1118,-1198}}, +/* GC.CU..CG */ +{{ -50, -719, -309, -309, -389}, +{-1079,-1748,-1338,-1338,-1418}, +{ -719,-1388, -978, -978,-1058}, +{ -989,-1658,-1248,-1248,-1328}, +{ -909,-1578,-1168,-1168,-1248}}}, +/* GC.G@..CG */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..CG */ +{{ -50, -709, -739, -619, -739}, +{-1079,-1738,-1768,-1648,-1768}, +{ -569,-1228,-1258,-1138,-1258}, +{ -989,-1648,-1678,-1558,-1678}, +{ -859,-1518,-1548,-1428,-1548}}, +/* GC.GC..CG */ +{{ -50, -709, -739, -619, -739}, +{ -999,-1658,-1688,-1568,-1688}, +{ -499,-1158,-1188,-1068,-1188}, +{ -989,-1648,-1678,-1558,-1678}, +{ -789,-1448,-1478,-1358,-1478}}, +/* GC.GG..CG */ +{{ -50, -709, -739, -619, -739}, +{-1079,-1738,-1768,-1648,-1768}, +{ -569,-1228,-1258,-1138,-1258}, +{ -989,-1648,-1678,-1558,-1678}, +{ -859,-1518,-1548,-1428,-1548}}, +/* GC.GU..CG */ +{{ -50, -709, -739, -619, -739}, +{-1079,-1738,-1768,-1648,-1768}, +{ -719,-1378,-1408,-1288,-1408}, +{ -989,-1648,-1678,-1558,-3080}, +{ -909,-1568,-1598,-1478,-1598}}}, +/* GC.U@..CG */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..CG */ +{{ -50, -499, -499, -499, -569}, +{-1079,-1528,-1528,-1528,-1598}, +{ -569,-1018,-1018,-1018,-1088}, +{ -989,-1438,-1438,-1438,-1508}, +{ -859,-1308,-1308,-1308,-1378}}, +/* GC.UC..CG */ +{{ -50, -499, -499, -499, -569}, +{ -999,-1448,-1448,-1448,-1518}, +{ -499, -948, -948, -948,-1018}, +{ -989,-1438,-1438,-1438,-1508}, +{ -789,-1238,-1238,-1238,-1308}}, +/* GC.UG..CG */ +{{ -50, -499, -499, -499, -569}, +{-1079,-1528,-1528,-1528,-1598}, +{ -569,-1018,-1018,-1018,-1088}, +{ -989,-1438,-1438,-1438,-1508}, +{ -859,-1308,-1308,-1308,-1378}}, +/* GC.UU..CG */ +{{ -50, -499, -499, -499, -569}, +{-1079,-1528,-1528,-1528,-1598}, +{ -719,-1168,-1168,-1168,-1238}, +{ -989,-1438,-1438,-1438,-1508}, +{ -909,-1358,-1358,-1358,-1428}}}}, +/* GC.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* GC.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* GC.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* GC.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* GC.A@..GC */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..GC */ +{{ -50, -519, -879, -559, -879}, +{ -569,-1038,-1398,-1078,-1398}, +{ -769,-1238,-1598,-1278,-1598}, +{ -759,-1228,-1588,-1268,-1588}, +{ -549,-1018,-1378,-1058,-1378}}, +/* GC.AC..GC */ +{{ -50, -519, -879, -559, -879}, +{ -929,-1398,-1758,-1438,-1758}, +{ -359, -828,-1188, -868,-1188}, +{ -789,-1258,-1618,-1298,-1618}, +{ -549,-1018,-1378,-1058,-1378}}, +/* GC.AG..GC */ +{{ -50, -519, -879, -559, -879}, +{ -609,-1078,-1438,-1118,-1438}, +{ -359, -828,-1188, -868,-1188}, +{ -669,-1138,-1498,-1178,-1498}, +{ -549,-1018,-1378,-1058,-1378}}, +/* GC.AU..GC */ +{{ -50, -519, -879, -559, -879}, +{ -929,-1398,-1758,-1438,-1758}, +{ -439, -908,-1268, -948,-1268}, +{ -789,-1258,-1618,-1298,-1618}, +{ -619,-1088,-1448,-1128,-1448}}}, +/* GC.C@..GC */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..GC */ +{{ -50, -719, -309, -309, -389}, +{ -569,-1238, -828, -828, -908}, +{ -769,-1438,-1028,-1028,-1108}, +{ -759,-1428,-1018,-1018,-1098}, +{ -549,-1218, -808, -808, -888}}, +/* GC.CC..GC */ +{{ -50, -719, -309, -309, -389}, +{ -929,-1598,-1188,-1188,-1268}, +{ -359,-1028, -618, -618, -698}, +{ -789,-1458,-1048,-1048,-1128}, +{ -549,-1218, -808, -808, -888}}, +/* GC.CG..GC */ +{{ -50, -719, -309, -309, -389}, +{ -609,-1278, -868, -868, -948}, +{ -359,-1028, -618, -618, -698}, +{ -669,-1338, -928, -928,-1008}, +{ -549,-1218, -808, -808, -888}}, +/* GC.CU..GC */ +{{ -50, -719, -309, -309, -389}, +{ -929,-1598,-1188,-1188,-1268}, +{ -439,-1108, -698, -698, -778}, +{ -789,-1458,-1048,-1048,-1128}, +{ -619,-1288, -878, -878, -958}}}, +/* GC.G@..GC */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..GC */ +{{ -50, -709, -739, -619, -739}, +{ -569,-1228,-1258,-1138,-1258}, +{ -769,-1428,-1458,-1338,-1458}, +{ -759,-1418,-1448,-1328,-1448}, +{ -549,-1208,-1238,-1118,-1238}}, +/* GC.GC..GC */ +{{ -50, -709, -739, -619, -739}, +{ -929,-1588,-1618,-1498,-1618}, +{ -359,-1018,-1048, -928,-1048}, +{ -789,-1448,-1478,-1358,-1478}, +{ -549,-1208,-1238,-1118,-1238}}, +/* GC.GG..GC */ +{{ -50, -709, -739, -619, -739}, +{ -609,-1268,-1298,-1178,-1298}, +{ -359,-1018,-1048, -928,-1048}, +{ -669,-1328,-1358,-1238,-1358}, +{ -549,-1208,-1238,-1118,-1238}}, +/* GC.GU..GC */ +{{ -50, -709, -739, -619, -739}, +{ -929,-1588,-1618,-1498,-1618}, +{ -439,-1098,-1128,-1008,-1128}, +{ -789,-1448,-1478,-1358,-3080}, +{ -619,-1278,-1308,-1188,-1308}}}, +/* GC.U@..GC */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..GC */ +{{ -50, -499, -499, -499, -569}, +{ -569,-1018,-1018,-1018,-1088}, +{ -769,-1218,-1218,-1218,-1288}, +{ -759,-1208,-1208,-1208,-1278}, +{ -549, -998, -998, -998,-1068}}, +/* GC.UC..GC */ +{{ -50, -499, -499, -499, -569}, +{ -929,-1378,-1378,-1378,-1448}, +{ -359, -808, -808, -808, -878}, +{ -789,-1238,-1238,-1238,-1308}, +{ -549, -998, -998, -998,-1068}}, +/* GC.UG..GC */ +{{ -50, -499, -499, -499, -569}, +{ -609,-1058,-1058,-1058,-1128}, +{ -359, -808, -808, -808, -878}, +{ -669,-1118,-1118,-1118,-1188}, +{ -549, -998, -998, -998,-1068}}, +/* GC.UU..GC */ +{{ -50, -499, -499, -499, -569}, +{ -929,-1378,-1378,-1378,-1448}, +{ -439, -888, -888, -888, -958}, +{ -789,-1238,-1238,-1238,-1308}, +{ -619,-1068,-1068,-1068,-1138}}}}, +/* GC.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* GC.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GC.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GC.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* GC.A@..GU */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..GU */ +{{ -50, -519, -879, -559, -879}, +{ -479, -948,-1308, -988,-1308}, +{ -309, -778,-1138, -818,-1138}, +{ -389, -858,-1218, -898,-1218}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AC..GU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AG..GU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AU..GU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}}, +/* GC.C@..GU */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..GU */ +{{ -50, -719, -309, -309, -389}, +{ -479,-1148, -738, -738, -818}, +{ -309, -978, -568, -568, -648}, +{ -389,-1058, -648, -648, -728}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CC..GU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CG..GU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CU..GU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}}, +/* GC.G@..GU */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..GU */ +{{ -50, -709, -739, -619, -739}, +{ -479,-1138,-1168,-1048,-1168}, +{ -309, -968, -998, -878, -998}, +{ -389,-1048,-1078, -958,-1078}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GC..GU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GG..GU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GU..GU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}}, +/* GC.U@..GU */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..GU */ +{{ -50, -499, -499, -499, -569}, +{ -479, -928, -928, -928, -998}, +{ -309, -758, -758, -758, -828}, +{ -389, -838, -838, -838, -908}, +{ -379, -828, -828, -828, -898}}, +/* GC.UC..GU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}, +/* GC.UG..GU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}, +/* GC.UU..GU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}}}, +/* GC.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* GC.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* GC.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* GC.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* GC.A@..UG */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..UG */ +{{ -50, -519, -879, -559, -879}, +{ -769,-1238,-1598,-1278,-1598}, +{ -529, -998,-1358,-1038,-1358}, +{ -709,-1178,-1538,-1218,-1538}, +{ -599,-1068,-1428,-1108,-1428}}, +/* GC.AC..UG */ +{{ -50, -519, -879, -559, -879}, +{ -839,-1308,-1668,-1348,-1668}, +{ -529, -998,-1358,-1038,-1358}, +{ -859,-1328,-1688,-1368,-1688}, +{ -489, -958,-1318, -998,-1318}}, +/* GC.AG..UG */ +{{ -50, -519, -879, -559, -879}, +{-1009,-1478,-1838,-1518,-1838}, +{ -409, -878,-1238, -918,-1238}, +{ -969,-1438,-1798,-1478,-1798}, +{ -599,-1068,-1428,-1108,-1428}}, +/* GC.AU..UG */ +{{ -50, -519, -879, -559, -879}, +{ -859,-1328,-1688,-1368,-1688}, +{ -529, -998,-1358,-1038,-1358}, +{ -859,-1328,-1688,-1368,-1688}, +{ -409, -878,-1238, -918,-1238}}}, +/* GC.C@..UG */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..UG */ +{{ -50, -719, -309, -309, -389}, +{ -769,-1438,-1028,-1028,-1108}, +{ -529,-1198, -788, -788, -868}, +{ -709,-1378, -968, -968,-1048}, +{ -599,-1268, -858, -858, -938}}, +/* GC.CC..UG */ +{{ -50, -719, -309, -309, -389}, +{ -839,-1508,-1098,-1098,-1178}, +{ -529,-1198, -788, -788, -868}, +{ -859,-1528,-1118,-1118,-1198}, +{ -489,-1158, -748, -748, -828}}, +/* GC.CG..UG */ +{{ -50, -719, -309, -309, -389}, +{-1009,-1678,-1268,-1268,-1348}, +{ -409,-1078, -668, -668, -748}, +{ -969,-1638,-1228,-1228,-1308}, +{ -599,-1268, -858, -858, -938}}, +/* GC.CU..UG */ +{{ -50, -719, -309, -309, -389}, +{ -859,-1528,-1118,-1118,-1198}, +{ -529,-1198, -788, -788, -868}, +{ -859,-1528,-1118,-1118,-1198}, +{ -409,-1078, -668, -668, -748}}}, +/* GC.G@..UG */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..UG */ +{{ -50, -709, -739, -619, -739}, +{ -769,-1428,-1458,-1338,-1458}, +{ -529,-1188,-1218,-1098,-1218}, +{ -709,-1368,-1398,-1278,-1398}, +{ -599,-1258,-1288,-1168,-1288}}, +/* GC.GC..UG */ +{{ -50, -709, -739, -619, -739}, +{ -839,-1498,-1528,-1408,-1528}, +{ -529,-1188,-1218,-1098,-1218}, +{ -859,-1518,-1548,-1428,-1548}, +{ -489,-1148,-1178,-1058,-1178}}, +/* GC.GG..UG */ +{{ -50, -709, -739, -619, -739}, +{-1009,-1668,-1698,-1578,-1698}, +{ -409,-1068,-1098, -978,-1098}, +{ -969,-1628,-1658,-1538,-1658}, +{ -599,-1258,-1288,-1168,-1288}}, +/* GC.GU..UG */ +{{ -50, -709, -739, -619, -739}, +{ -859,-1518,-1548,-1428,-1548}, +{ -529,-1188,-1218,-1098,-1218}, +{ -859,-1518,-1548,-1428,-1548}, +{ -409,-1068,-1098, -978,-1098}}}, +/* GC.U@..UG */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..UG */ +{{ -50, -499, -499, -499, -569}, +{ -769,-1218,-1218,-1218,-1288}, +{ -529, -978, -978, -978,-1048}, +{ -709,-1158,-1158,-1158,-1228}, +{ -599,-1048,-1048,-1048,-1118}}, +/* GC.UC..UG */ +{{ -50, -499, -499, -499, -569}, +{ -839,-1288,-1288,-1288,-1358}, +{ -529, -978, -978, -978,-1048}, +{ -859,-1308,-1308,-1308,-1378}, +{ -489, -938, -938, -938,-1008}}, +/* GC.UG..UG */ +{{ -50, -499, -499, -499, -569}, +{-1009,-1458,-1458,-1458,-1528}, +{ -409, -858, -858, -858, -928}, +{ -969,-1418,-1418,-1418,-1488}, +{ -599,-1048,-1048,-1048,-1118}}, +/* GC.UU..UG */ +{{ -50, -499, -499, -499, -569}, +{ -859,-1308,-1308,-1308,-1378}, +{ -529, -978, -978, -978,-1048}, +{ -859,-1308,-1308,-1308,-1378}, +{ -409, -858, -858, -858, -928}}}}, +/* GC.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* GC.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GC.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GC.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* GC.A@..AU */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..AU */ +{{ -50, -519, -879, -559, -879}, +{ -479, -948,-1308, -988,-1308}, +{ -309, -778,-1138, -818,-1138}, +{ -389, -858,-1218, -898,-1218}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AC..AU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AG..AU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}, +/* GC.AU..AU */ +{{ -50, -519, -879, -559, -879}, +{ -649,-1118,-1478,-1158,-1478}, +{ -289, -758,-1118, -798,-1118}, +{ -739,-1208,-1568,-1248,-1568}, +{ -379, -848,-1208, -888,-1208}}}, +/* GC.C@..AU */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..AU */ +{{ -50, -719, -309, -309, -389}, +{ -479,-1148, -738, -738, -818}, +{ -309, -978, -568, -568, -648}, +{ -389,-1058, -648, -648, -728}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CC..AU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CG..AU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}, +/* GC.CU..AU */ +{{ -50, -719, -309, -309, -389}, +{ -649,-1318, -908, -908, -988}, +{ -289, -958, -548, -548, -628}, +{ -739,-1408, -998, -998,-1078}, +{ -379,-1048, -638, -638, -718}}}, +/* GC.G@..AU */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..AU */ +{{ -50, -709, -739, -619, -739}, +{ -479,-1138,-1168,-1048,-1168}, +{ -309, -968, -998, -878, -998}, +{ -389,-1048,-1078, -958,-1078}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GC..AU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GG..AU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}, +/* GC.GU..AU */ +{{ -50, -709, -739, -619, -739}, +{ -649,-1308,-1338,-1218,-1338}, +{ -289, -948, -978, -858, -978}, +{ -739,-1398,-1428,-1308,-1428}, +{ -379,-1038,-1068, -948,-1068}}}, +/* GC.U@..AU */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..AU */ +{{ -50, -499, -499, -499, -569}, +{ -479, -928, -928, -928, -998}, +{ -309, -758, -758, -758, -828}, +{ -389, -838, -838, -838, -908}, +{ -379, -828, -828, -828, -898}}, +/* GC.UC..AU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}, +/* GC.UG..AU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}, +/* GC.UU..AU */ +{{ -50, -499, -499, -499, -569}, +{ -649,-1098,-1098,-1098,-1168}, +{ -289, -738, -738, -738, -808}, +{ -739,-1188,-1188,-1188,-1258}, +{ -379, -828, -828, -828, -898}}}}, +/* GC.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* GC.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* GC.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* GC.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* GC.A@..UA */ +{{{ -50, -519, -879, -559, -879}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA..UA */ +{{ -50, -519, -879, -559, -879}, +{ -449, -918,-1278, -958,-1278}, +{ -479, -948,-1308, -988,-1308}, +{ -429, -898,-1258, -938,-1258}, +{ -329, -798,-1158, -838,-1158}}, +/* GC.AC..UA */ +{{ -50, -519, -879, -559, -879}, +{ -679,-1148,-1508,-1188,-1508}, +{ -559,-1028,-1388,-1068,-1388}, +{ -729,-1198,-1558,-1238,-1558}, +{ -189, -658,-1018, -698,-1018}}, +/* GC.AG..UA */ +{{ -50, -519, -879, -559, -879}, +{ -939,-1408,-1768,-1448,-1768}, +{ -249, -718,-1078, -758,-1078}, +{ -939,-1408,-1768,-1448,-1768}, +{ -329, -798,-1158, -838,-1158}}, +/* GC.AU..UA */ +{{ -50, -519, -879, -559, -879}, +{ -639,-1108,-1468,-1148,-1468}, +{ -229, -698,-1058, -738,-1058}, +{ -729,-1198,-1558,-1238,-1558}, +{ -190, -659,-1019, -699,-1019}}}, +/* GC.C@..UA */ +{{{ -50, -719, -309, -309, -389}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA..UA */ +{{ -50, -719, -309, -309, -389}, +{ -449,-1118, -708, -708, -788}, +{ -479,-1148, -738, -738, -818}, +{ -429,-1098, -688, -688, -768}, +{ -329, -998, -588, -588, -668}}, +/* GC.CC..UA */ +{{ -50, -719, -309, -309, -389}, +{ -679,-1348, -938, -938,-1018}, +{ -559,-1228, -818, -818, -898}, +{ -729,-1398, -988, -988,-1068}, +{ -189, -858, -448, -448, -528}}, +/* GC.CG..UA */ +{{ -50, -719, -309, -309, -389}, +{ -939,-1608,-1198,-1198,-1278}, +{ -249, -918, -508, -508, -588}, +{ -939,-1608,-1198,-1198,-1278}, +{ -329, -998, -588, -588, -668}}, +/* GC.CU..UA */ +{{ -50, -719, -309, -309, -389}, +{ -639,-1308, -898, -898, -978}, +{ -229, -898, -488, -488, -568}, +{ -729,-1398, -988, -988,-1068}, +{ -190, -859, -449, -449, -529}}}, +/* GC.G@..UA */ +{{{ -50, -709, -739, -619, -739}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA..UA */ +{{ -50, -709, -739, -619, -739}, +{ -449,-1108,-1138,-1018,-1138}, +{ -479,-1138,-1168,-1048,-1168}, +{ -429,-1088,-1118, -998,-1118}, +{ -329, -988,-1018, -898,-1018}}, +/* GC.GC..UA */ +{{ -50, -709, -739, -619, -739}, +{ -679,-1338,-1368,-1248,-1368}, +{ -559,-1218,-1248,-1128,-1248}, +{ -729,-1388,-1418,-1298,-1418}, +{ -189, -848, -878, -758, -878}}, +/* GC.GG..UA */ +{{ -50, -709, -739, -619, -739}, +{ -939,-1598,-1628,-1508,-1628}, +{ -249, -908, -938, -818, -938}, +{ -939,-1598,-1628,-1508,-1628}, +{ -329, -988,-1018, -898,-1018}}, +/* GC.GU..UA */ +{{ -50, -709, -739, -619, -739}, +{ -639,-1298,-1328,-1208,-1328}, +{ -229, -888, -918, -798, -918}, +{ -729,-1388,-1418,-1298,-1418}, +{ -190, -849, -879, -759, -879}}}, +/* GC.U@..UA */ +{{{ -50, -499, -499, -499, -569}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA..UA */ +{{ -50, -499, -499, -499, -569}, +{ -449, -898, -898, -898, -968}, +{ -479, -928, -928, -928, -998}, +{ -429, -878, -878, -878, -948}, +{ -329, -778, -778, -778, -848}}, +/* GC.UC..UA */ +{{ -50, -499, -499, -499, -569}, +{ -679,-1128,-1128,-1128,-1198}, +{ -559,-1008,-1008,-1008,-1078}, +{ -729,-1178,-1178,-1178,-1248}, +{ -189, -638, -638, -638, -708}}, +/* GC.UG..UA */ +{{ -50, -499, -499, -499, -569}, +{ -939,-1388,-1388,-1388,-1458}, +{ -249, -698, -698, -698, -768}, +{ -939,-1388,-1388,-1388,-1458}, +{ -329, -778, -778, -778, -848}}, +/* GC.UU..UA */ +{{ -50, -499, -499, -499, -569}, +{ -639,-1088,-1088,-1088,-1158}, +{ -229, -678, -678, -678, -748}, +{ -729,-1178,-1178,-1178,-1248}, +{ -190, -639, -639, -639, -709}}}}, +/* GC.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GC.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* GC.A@.. @ */ +{{{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AA.. @ */ +{{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AC.. @ */ +{{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AG.. @ */ +{{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}, +/* GC.AU.. @ */ +{{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}, +{ -100, -569, -929, -609, -929}}}, +/* GC.C@.. @ */ +{{{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CA.. @ */ +{{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CC.. @ */ +{{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CG.. @ */ +{{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}, +/* GC.CU.. @ */ +{{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}, +{ -100, -769, -359, -359, -439}}}, +/* GC.G@.. @ */ +{{{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GA.. @ */ +{{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GC.. @ */ +{{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GG.. @ */ +{{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}, +/* GC.GU.. @ */ +{{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}, +{ -100, -759, -789, -669, -789}}}, +/* GC.U@.. @ */ +{{{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UA.. @ */ +{{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UC.. @ */ +{{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UG.. @ */ +{{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}, +/* GC.UU.. @ */ +{{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}, +{ -100, -549, -549, -549, -619}}}}}, +{ /* noPair */ {{{{0}}}}, +/* GU.@@..CG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* GU.@C..CG */ +{{ 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* GU.@G..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* GU.@U..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* GU.A@..CG */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -569, -948,-1118,-1118,-1118}, +{ -989,-1368,-1538,-1538,-1538}, +{ -859,-1238,-1408,-1408,-1408}}, +/* GU.AC..CG */ +{{ -50, -429, -599, -599, -599}, +{ -999,-1378,-1548,-1548,-1548}, +{ -499, -878,-1048,-1048,-1048}, +{ -989,-1368,-1538,-1538,-1538}, +{ -789,-1168,-1338,-1338,-1338}}, +/* GU.AG..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -569, -948,-1118,-1118,-1118}, +{ -989,-1368,-1538,-1538,-1538}, +{ -859,-1238,-1408,-1408,-1408}}, +/* GU.AU..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -719,-1098,-1268,-1268,-1268}, +{ -989,-1368,-1538,-1538,-1538}, +{ -909,-1288,-1458,-1458,-1458}}}, +/* GU.C@..CG */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -569, -778, -758, -758, -758}, +{ -989,-1198,-1178,-1178,-1178}, +{ -859,-1068,-1048,-1048,-1048}}, +/* GU.CC..CG */ +{{ -50, -259, -239, -239, -239}, +{ -999,-1208,-1188,-1188,-1188}, +{ -499, -708, -688, -688, -688}, +{ -989,-1198,-1178,-1178,-1178}, +{ -789, -998, -978, -978, -978}}, +/* GU.CG..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -569, -778, -758, -758, -758}, +{ -989,-1198,-1178,-1178,-1178}, +{ -859,-1068,-1048,-1048,-1048}}, +/* GU.CU..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -719, -928, -908, -908, -908}, +{ -989,-1198,-1178,-1178,-1178}, +{ -909,-1118,-1098,-1098,-1098}}}, +/* GU.G@..CG */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -569, -858,-1208,-1208,-1208}, +{ -989,-1278,-1628,-1628,-1628}, +{ -859,-1148,-1498,-1498,-1498}}, +/* GU.GC..CG */ +{{ -50, -339, -689, -689, -689}, +{ -999,-1288,-1638,-1638,-1638}, +{ -499, -788,-1138,-1138,-1138}, +{ -989,-1278,-1628,-1628,-1628}, +{ -789,-1078,-1428,-1428,-1428}}, +/* GU.GG..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -569, -858,-1208,-1208,-1208}, +{ -989,-1278,-1628,-1628,-1628}, +{ -859,-1148,-1498,-1498,-1498}}, +/* GU.GU..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -719,-1008,-1358,-1358,-1358}, +{ -989,-1278,-1628,-1628,-1628}, +{ -909,-1198,-1548,-1548,-1548}}}, +/* GU.U@..CG */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -569, -848, -848, -848, -848}, +{ -989,-1268,-1268,-1268,-1268}, +{ -859,-1138,-1138,-1138,-1138}}, +/* GU.UC..CG */ +{{ -50, -329, -329, -329, -329}, +{ -999,-1278,-1278,-1278,-1278}, +{ -499, -778, -778, -778, -778}, +{ -989,-1268,-1268,-1268,-1268}, +{ -789,-1068,-1068,-1068,-1068}}, +/* GU.UG..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -569, -848, -848, -848, -848}, +{ -989,-1268,-1268,-1268,-1268}, +{ -859,-1138,-1138,-1138,-1138}}, +/* GU.UU..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -719, -998, -998, -998, -998}, +{ -989,-1268,-1268,-1268,-1268}, +{ -909,-1188,-1188,-1188,-1188}}}}, +/* GU.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* GU.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* GU.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* GU.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* GU.A@..GC */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..GC */ +{{ -50, -429, -599, -599, -599}, +{ -569, -948,-1118,-1118,-1118}, +{ -769,-1148,-1318,-1318,-1318}, +{ -759,-1138,-1308,-1308,-1308}, +{ -549, -928,-1098,-1098,-1098}}, +/* GU.AC..GC */ +{{ -50, -429, -599, -599, -599}, +{ -929,-1308,-1478,-1478,-1478}, +{ -359, -738, -908, -908, -908}, +{ -789,-1168,-1338,-1338,-1338}, +{ -549, -928,-1098,-1098,-1098}}, +/* GU.AG..GC */ +{{ -50, -429, -599, -599, -599}, +{ -609, -988,-1158,-1158,-1158}, +{ -359, -738, -908, -908, -908}, +{ -669,-1048,-1218,-1218,-1218}, +{ -549, -928,-1098,-1098,-1098}}, +/* GU.AU..GC */ +{{ -50, -429, -599, -599, -599}, +{ -929,-1308,-1478,-1478,-1478}, +{ -439, -818, -988, -988, -988}, +{ -789,-1168,-1338,-1338,-1338}, +{ -619, -998,-1168,-1168,-1168}}}, +/* GU.C@..GC */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..GC */ +{{ -50, -259, -239, -239, -239}, +{ -569, -778, -758, -758, -758}, +{ -769, -978, -958, -958, -958}, +{ -759, -968, -948, -948, -948}, +{ -549, -758, -738, -738, -738}}, +/* GU.CC..GC */ +{{ -50, -259, -239, -239, -239}, +{ -929,-1138,-1118,-1118,-1118}, +{ -359, -568, -548, -548, -548}, +{ -789, -998, -978, -978, -978}, +{ -549, -758, -738, -738, -738}}, +/* GU.CG..GC */ +{{ -50, -259, -239, -239, -239}, +{ -609, -818, -798, -798, -798}, +{ -359, -568, -548, -548, -548}, +{ -669, -878, -858, -858, -858}, +{ -549, -758, -738, -738, -738}}, +/* GU.CU..GC */ +{{ -50, -259, -239, -239, -239}, +{ -929,-1138,-1118,-1118,-1118}, +{ -439, -648, -628, -628, -628}, +{ -789, -998, -978, -978, -978}, +{ -619, -828, -808, -808, -808}}}, +/* GU.G@..GC */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..GC */ +{{ -50, -339, -689, -689, -689}, +{ -569, -858,-1208,-1208,-1208}, +{ -769,-1058,-1408,-1408,-1408}, +{ -759,-1048,-1398,-1398,-1398}, +{ -549, -838,-1188,-1188,-1188}}, +/* GU.GC..GC */ +{{ -50, -339, -689, -689, -689}, +{ -929,-1218,-1568,-1568,-1568}, +{ -359, -648, -998, -998, -998}, +{ -789,-1078,-1428,-1428,-1428}, +{ -549, -838,-1188,-1188,-1188}}, +/* GU.GG..GC */ +{{ -50, -339, -689, -689, -689}, +{ -609, -898,-1248,-1248,-1248}, +{ -359, -648, -998, -998, -998}, +{ -669, -958,-1308,-1308,-1308}, +{ -549, -838,-1188,-1188,-1188}}, +/* GU.GU..GC */ +{{ -50, -339, -689, -689, -689}, +{ -929,-1218,-1568,-1568,-1568}, +{ -439, -728,-1078,-1078,-1078}, +{ -789,-1078,-1428,-1428,-1428}, +{ -619, -908,-1258,-1258,-1258}}}, +/* GU.U@..GC */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..GC */ +{{ -50, -329, -329, -329, -329}, +{ -569, -848, -848, -848, -848}, +{ -769,-1048,-1048,-1048,-1048}, +{ -759,-1038,-1038,-1038,-1038}, +{ -549, -828, -828, -828, -828}}, +/* GU.UC..GC */ +{{ -50, -329, -329, -329, -329}, +{ -929,-1208,-1208,-1208,-1208}, +{ -359, -638, -638, -638, -638}, +{ -789,-1068,-1068,-1068,-1068}, +{ -549, -828, -828, -828, -828}}, +/* GU.UG..GC */ +{{ -50, -329, -329, -329, -329}, +{ -609, -888, -888, -888, -888}, +{ -359, -638, -638, -638, -638}, +{ -669, -948, -948, -948, -948}, +{ -549, -828, -828, -828, -828}}, +/* GU.UU..GC */ +{{ -50, -329, -329, -329, -329}, +{ -929,-1208,-1208,-1208,-1208}, +{ -439, -718, -718, -718, -718}, +{ -789,-1068,-1068,-1068,-1068}, +{ -619, -898, -898, -898, -898}}}}, +/* GU.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* GU.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GU.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GU.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* GU.A@..GU */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..GU */ +{{ -50, -429, -599, -599, -599}, +{ -479, -858,-1028,-1028,-1028}, +{ -309, -688, -858, -858, -858}, +{ -389, -768, -938, -938, -938}, +{ -379, -758, -928, -928, -928}}, +/* GU.AC..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* GU.AG..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* GU.AU..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}}, +/* GU.C@..GU */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..GU */ +{{ -50, -259, -239, -239, -239}, +{ -479, -688, -668, -668, -668}, +{ -309, -518, -498, -498, -498}, +{ -389, -598, -578, -578, -578}, +{ -379, -588, -568, -568, -568}}, +/* GU.CC..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* GU.CG..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* GU.CU..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}}, +/* GU.G@..GU */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..GU */ +{{ -50, -339, -689, -689, -689}, +{ -479, -768,-1118,-1118,-1118}, +{ -309, -598, -948, -948, -948}, +{ -389, -678,-1028,-1028,-1028}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GC..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GG..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GU..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}}, +/* GU.U@..GU */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..GU */ +{{ -50, -329, -329, -329, -329}, +{ -479, -758, -758, -758, -758}, +{ -309, -588, -588, -588, -588}, +{ -389, -668, -668, -668, -668}, +{ -379, -658, -658, -658, -658}}, +/* GU.UC..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* GU.UG..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* GU.UU..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}}}, +/* GU.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* GU.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* GU.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* GU.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* GU.A@..UG */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..UG */ +{{ -50, -429, -599, -599, -599}, +{ -769,-1148,-1318,-1318,-1318}, +{ -529, -908,-1078,-1078,-1078}, +{ -709,-1088,-1258,-1258,-1258}, +{ -599, -978,-1148,-1148,-1148}}, +/* GU.AC..UG */ +{{ -50, -429, -599, -599, -599}, +{ -839,-1218,-1388,-1388,-1388}, +{ -529, -908,-1078,-1078,-1078}, +{ -859,-1238,-1408,-1408,-1408}, +{ -489, -868,-1038,-1038,-1038}}, +/* GU.AG..UG */ +{{ -50, -429, -599, -599, -599}, +{-1009,-1388,-1558,-1558,-1558}, +{ -409, -788, -958, -958, -958}, +{ -969,-1348,-1518,-1518,-1518}, +{ -599, -978,-1148,-1148,-1148}}, +/* GU.AU..UG */ +{{ -50, -429, -599, -599, -599}, +{ -859,-1238,-1408,-1408,-1408}, +{ -529, -908,-1078,-1078,-1078}, +{ -859,-1238,-1408,-1408,-1408}, +{ -409, -788, -958, -958, -958}}}, +/* GU.C@..UG */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..UG */ +{{ -50, -259, -239, -239, -239}, +{ -769, -978, -958, -958, -958}, +{ -529, -738, -718, -718, -718}, +{ -709, -918, -898, -898, -898}, +{ -599, -808, -788, -788, -788}}, +/* GU.CC..UG */ +{{ -50, -259, -239, -239, -239}, +{ -839,-1048,-1028,-1028,-1028}, +{ -529, -738, -718, -718, -718}, +{ -859,-1068,-1048,-1048,-1048}, +{ -489, -698, -678, -678, -678}}, +/* GU.CG..UG */ +{{ -50, -259, -239, -239, -239}, +{-1009,-1218,-1198,-1198,-1198}, +{ -409, -618, -598, -598, -598}, +{ -969,-1178,-1158,-1158,-1158}, +{ -599, -808, -788, -788, -788}}, +/* GU.CU..UG */ +{{ -50, -259, -239, -239, -239}, +{ -859,-1068,-1048,-1048,-1048}, +{ -529, -738, -718, -718, -718}, +{ -859,-1068,-1048,-1048,-1048}, +{ -409, -618, -598, -598, -598}}}, +/* GU.G@..UG */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..UG */ +{{ -50, -339, -689, -689, -689}, +{ -769,-1058,-1408,-1408,-1408}, +{ -529, -818,-1168,-1168,-1168}, +{ -709, -998,-1348,-1348,-1348}, +{ -599, -888,-1238,-1238,-1238}}, +/* GU.GC..UG */ +{{ -50, -339, -689, -689, -689}, +{ -839,-1128,-1478,-1478,-1478}, +{ -529, -818,-1168,-1168,-1168}, +{ -859,-1148,-1498,-1498,-1498}, +{ -489, -778,-1128,-1128,-1128}}, +/* GU.GG..UG */ +{{ -50, -339, -689, -689, -689}, +{-1009,-1298,-1648,-1648,-1648}, +{ -409, -698,-1048,-1048,-1048}, +{ -969,-1258,-1608,-1608,-1608}, +{ -599, -888,-1238,-1238,-1238}}, +/* GU.GU..UG */ +{{ -50, -339, -689, -689, -689}, +{ -859,-1148,-1498,-1498,-1498}, +{ -529, -818,-1168,-1168,-1168}, +{ -859,-1148,-1498,-1498,-1498}, +{ -409, -698,-1048,-1048,-1048}}}, +/* GU.U@..UG */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..UG */ +{{ -50, -329, -329, -329, -329}, +{ -769,-1048,-1048,-1048,-1048}, +{ -529, -808, -808, -808, -808}, +{ -709, -988, -988, -988, -988}, +{ -599, -878, -878, -878, -878}}, +/* GU.UC..UG */ +{{ -50, -329, -329, -329, -329}, +{ -839,-1118,-1118,-1118,-1118}, +{ -529, -808, -808, -808, -808}, +{ -859,-1138,-1138,-1138,-1138}, +{ -489, -768, -768, -768, -768}}, +/* GU.UG..UG */ +{{ -50, -329, -329, -329, -329}, +{-1009,-1288,-1288,-1288,-1288}, +{ -409, -688, -688, -688, -688}, +{ -969,-1248,-1248,-1248,-1248}, +{ -599, -878, -878, -878, -878}}, +/* GU.UU..UG */ +{{ -50, -329, -329, -329, -329}, +{ -859,-1138,-1138,-1138,-1138}, +{ -529, -808, -808, -808, -808}, +{ -859,-1138,-1138,-1138,-1138}, +{ -409, -688, -688, -688, -688}}}}, +/* GU.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* GU.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GU.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* GU.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* GU.A@..AU */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..AU */ +{{ -50, -429, -599, -599, -599}, +{ -479, -858,-1028,-1028,-1028}, +{ -309, -688, -858, -858, -858}, +{ -389, -768, -938, -938, -938}, +{ -379, -758, -928, -928, -928}}, +/* GU.AC..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* GU.AG..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* GU.AU..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}}, +/* GU.C@..AU */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..AU */ +{{ -50, -259, -239, -239, -239}, +{ -479, -688, -668, -668, -668}, +{ -309, -518, -498, -498, -498}, +{ -389, -598, -578, -578, -578}, +{ -379, -588, -568, -568, -568}}, +/* GU.CC..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* GU.CG..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* GU.CU..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}}, +/* GU.G@..AU */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..AU */ +{{ -50, -339, -689, -689, -689}, +{ -479, -768,-1118,-1118,-1118}, +{ -309, -598, -948, -948, -948}, +{ -389, -678,-1028,-1028,-1028}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GC..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GG..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* GU.GU..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}}, +/* GU.U@..AU */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..AU */ +{{ -50, -329, -329, -329, -329}, +{ -479, -758, -758, -758, -758}, +{ -309, -588, -588, -588, -588}, +{ -389, -668, -668, -668, -668}, +{ -379, -658, -658, -658, -658}}, +/* GU.UC..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* GU.UG..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* GU.UU..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}}}, +/* GU.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* GU.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* GU.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* GU.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* GU.A@..UA */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA..UA */ +{{ -50, -429, -599, -599, -599}, +{ -449, -828, -998, -998, -998}, +{ -479, -858,-1028,-1028,-1028}, +{ -429, -808, -978, -978, -978}, +{ -329, -708, -878, -878, -878}}, +/* GU.AC..UA */ +{{ -50, -429, -599, -599, -599}, +{ -679,-1058,-1228,-1228,-1228}, +{ -559, -938,-1108,-1108,-1108}, +{ -729,-1108,-1278,-1278,-1278}, +{ -189, -568, -738, -738, -738}}, +/* GU.AG..UA */ +{{ -50, -429, -599, -599, -599}, +{ -939,-1318,-1488,-1488,-1488}, +{ -249, -628, -798, -798, -798}, +{ -939,-1318,-1488,-1488,-1488}, +{ -329, -708, -878, -878, -878}}, +/* GU.AU..UA */ +{{ -50, -429, -599, -599, -599}, +{ -639,-1018,-1188,-1188,-1188}, +{ -229, -608, -778, -778, -778}, +{ -729,-1108,-1278,-1278,-1278}, +{ -190, -569, -739, -739, -739}}}, +/* GU.C@..UA */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA..UA */ +{{ -50, -259, -239, -239, -239}, +{ -449, -658, -638, -638, -638}, +{ -479, -688, -668, -668, -668}, +{ -429, -638, -618, -618, -618}, +{ -329, -538, -518, -518, -518}}, +/* GU.CC..UA */ +{{ -50, -259, -239, -239, -239}, +{ -679, -888, -868, -868, -868}, +{ -559, -768, -748, -748, -748}, +{ -729, -938, -918, -918, -918}, +{ -189, -398, -378, -378, -378}}, +/* GU.CG..UA */ +{{ -50, -259, -239, -239, -239}, +{ -939,-1148,-1128,-1128,-1128}, +{ -249, -458, -438, -438, -438}, +{ -939,-1148,-1128,-1128,-1128}, +{ -329, -538, -518, -518, -518}}, +/* GU.CU..UA */ +{{ -50, -259, -239, -239, -239}, +{ -639, -848, -828, -828, -828}, +{ -229, -438, -418, -418, -418}, +{ -729, -938, -918, -918, -918}, +{ -190, -399, -379, -379, -379}}}, +/* GU.G@..UA */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA..UA */ +{{ -50, -339, -689, -689, -689}, +{ -449, -738,-1088,-1088,-1088}, +{ -479, -768,-1118,-1118,-1118}, +{ -429, -718,-1068,-1068,-1068}, +{ -329, -618, -968, -968, -968}}, +/* GU.GC..UA */ +{{ -50, -339, -689, -689, -689}, +{ -679, -968,-1318,-1318,-1318}, +{ -559, -848,-1198,-1198,-1198}, +{ -729,-1018,-1368,-1368,-1368}, +{ -189, -478, -828, -828, -828}}, +/* GU.GG..UA */ +{{ -50, -339, -689, -689, -689}, +{ -939,-1228,-1578,-1578,-1578}, +{ -249, -538, -888, -888, -888}, +{ -939,-1228,-1578,-1578,-1578}, +{ -329, -618, -968, -968, -968}}, +/* GU.GU..UA */ +{{ -50, -339, -689, -689, -689}, +{ -639, -928,-1278,-1278,-1278}, +{ -229, -518, -868, -868, -868}, +{ -729,-1018,-1368,-1368,-1368}, +{ -190, -479, -829, -829, -829}}}, +/* GU.U@..UA */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA..UA */ +{{ -50, -329, -329, -329, -329}, +{ -449, -728, -728, -728, -728}, +{ -479, -758, -758, -758, -758}, +{ -429, -708, -708, -708, -708}, +{ -329, -608, -608, -608, -608}}, +/* GU.UC..UA */ +{{ -50, -329, -329, -329, -329}, +{ -679, -958, -958, -958, -958}, +{ -559, -838, -838, -838, -838}, +{ -729,-1008,-1008,-1008,-1008}, +{ -189, -468, -468, -468, -468}}, +/* GU.UG..UA */ +{{ -50, -329, -329, -329, -329}, +{ -939,-1218,-1218,-1218,-1218}, +{ -249, -528, -528, -528, -528}, +{ -939,-1218,-1218,-1218,-1218}, +{ -329, -608, -608, -608, -608}}, +/* GU.UU..UA */ +{{ -50, -329, -329, -329, -329}, +{ -639, -918, -918, -918, -918}, +{ -229, -508, -508, -508, -508}, +{ -729,-1008,-1008,-1008,-1008}, +{ -190, -469, -469, -469, -469}}}}, +/* GU.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* GU.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* GU.A@.. @ */ +{{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AA.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AC.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AG.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* GU.AU.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}}, +/* GU.C@.. @ */ +{{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CA.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CC.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CG.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* GU.CU.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}}, +/* GU.G@.. @ */ +{{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GA.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GC.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GG.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* GU.GU.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}}, +/* GU.U@.. @ */ +{{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UA.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UC.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UG.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* GU.UU.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}}}}, +{ /* noPair */ {{{{0}}}}, +/* UG.@@..CG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* UG.@C..CG */ +{{ 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* UG.@G..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* UG.@U..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* UG.A@..CG */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..CG */ +{{ -50, -719, -789, -959, -809}, +{-1079,-1748,-1818,-1988,-1838}, +{ -569,-1238,-1308,-1478,-1328}, +{ -989,-1658,-1728,-1898,-1748}, +{ -859,-1528,-1598,-1768,-1618}}, +/* UG.AC..CG */ +{{ -50, -719, -789, -959, -809}, +{ -999,-1668,-1738,-1908,-1758}, +{ -499,-1168,-1238,-1408,-1258}, +{ -989,-1658,-1728,-1898,-1748}, +{ -789,-1458,-1528,-1698,-1548}}, +/* UG.AG..CG */ +{{ -50, -719, -789, -959, -809}, +{-1079,-1748,-1818,-1988,-1838}, +{ -569,-1238,-1308,-1478,-1328}, +{ -989,-1658,-1728,-1898,-1748}, +{ -859,-1528,-1598,-1768,-1618}}, +/* UG.AU..CG */ +{{ -50, -719, -789, -959, -809}, +{-1079,-1748,-1818,-1988,-1838}, +{ -719,-1388,-1458,-1628,-1478}, +{ -989,-1658,-1728,-1898,-1748}, +{ -909,-1578,-1648,-1818,-1668}}}, +/* UG.C@..CG */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..CG */ +{{ -50, -479, -479, -359, -479}, +{-1079,-1508,-1508,-1388,-1508}, +{ -569, -998, -998, -878, -998}, +{ -989,-1418,-1418,-1298,-1418}, +{ -859,-1288,-1288,-1168,-1288}}, +/* UG.CC..CG */ +{{ -50, -479, -479, -359, -479}, +{ -999,-1428,-1428,-1308,-1428}, +{ -499, -928, -928, -808, -928}, +{ -989,-1418,-1418,-1298,-1418}, +{ -789,-1218,-1218,-1098,-1218}}, +/* UG.CG..CG */ +{{ -50, -479, -479, -359, -479}, +{-1079,-1508,-1508,-1388,-1508}, +{ -569, -998, -998, -878, -998}, +{ -989,-1418,-1418,-1298,-1418}, +{ -859,-1288,-1288,-1168,-1288}}, +/* UG.CU..CG */ +{{ -50, -479, -479, -359, -479}, +{-1079,-1508,-1508,-1388,-1508}, +{ -719,-1148,-1148,-1028,-1148}, +{ -989,-1418,-1418,-1298,-1418}, +{ -909,-1338,-1338,-1218,-1338}}}, +/* UG.G@..CG */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..CG */ +{{ -50, -659, -809, -919, -809}, +{-1079,-1688,-1838,-1948,-1838}, +{ -569,-1178,-1328,-1438,-1328}, +{ -989,-1598,-1748,-1858,-1748}, +{ -859,-1468,-1618,-1728,-1618}}, +/* UG.GC..CG */ +{{ -50, -659, -809, -919, -809}, +{ -999,-1608,-1758,-1868,-1758}, +{ -499,-1108,-1258,-1368,-1258}, +{ -989,-1598,-1748,-1858,-1748}, +{ -789,-1398,-1548,-1658,-1548}}, +/* UG.GG..CG */ +{{ -50, -659, -809, -919, -809}, +{-1079,-1688,-1838,-1948,-1838}, +{ -569,-1178,-1328,-1438,-1328}, +{ -989,-1598,-1748,-1858,-1748}, +{ -859,-1468,-1618,-1728,-1618}}, +/* UG.GU..CG */ +{{ -50, -659, -809, -919, -809}, +{-1079,-1688,-1838,-1948,-1838}, +{ -719,-1328,-1478,-1588,-1478}, +{ -989,-1598,-1748,-1858,-1748}, +{ -909,-1518,-1668,-1778,-1668}}}, +/* UG.U@..CG */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..CG */ +{{ -50, -549, -439, -549, -359}, +{-1079,-1578,-1468,-1578,-1388}, +{ -569,-1068, -958,-1068, -878}, +{ -989,-1488,-1378,-1488,-1298}, +{ -859,-1358,-1248,-1358,-1168}}, +/* UG.UC..CG */ +{{ -50, -549, -439, -549, -359}, +{ -999,-1498,-1388,-1498,-1308}, +{ -499, -998, -888, -998, -808}, +{ -989,-1488,-1378,-1488,-1298}, +{ -789,-1288,-1178,-1288,-1098}}, +/* UG.UG..CG */ +{{ -50, -549, -439, -549, -359}, +{-1079,-1578,-1468,-1578,-1388}, +{ -569,-1068, -958,-1068, -878}, +{ -989,-1488,-1378,-1488,-1298}, +{ -859,-1358,-1248,-1358,-1168}}, +/* UG.UU..CG */ +{{ -50, -549, -439, -549, -359}, +{-1079,-1578,-1468,-1578,-1388}, +{ -719,-1218,-1108,-1218,-1028}, +{ -989,-1488,-1378,-1488,-1298}, +{ -909,-1408,-1298,-1408,-1218}}}}, +/* UG.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* UG.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* UG.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* UG.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* UG.A@..GC */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..GC */ +{{ -50, -719, -789, -959, -809}, +{ -569,-1238,-1308,-1478,-1328}, +{ -769,-1438,-1508,-1678,-1528}, +{ -759,-1428,-1498,-1668,-1518}, +{ -549,-1218,-1288,-1458,-1308}}, +/* UG.AC..GC */ +{{ -50, -719, -789, -959, -809}, +{ -929,-1598,-1668,-1838,-1688}, +{ -359,-1028,-1098,-1268,-1118}, +{ -789,-1458,-1528,-1698,-1548}, +{ -549,-1218,-1288,-1458,-1308}}, +/* UG.AG..GC */ +{{ -50, -719, -789, -959, -809}, +{ -609,-1278,-1348,-1518,-1368}, +{ -359,-1028,-1098,-1268,-1118}, +{ -669,-1338,-1408,-1578,-1428}, +{ -549,-1218,-1288,-1458,-1308}}, +/* UG.AU..GC */ +{{ -50, -719, -789, -959, -809}, +{ -929,-1598,-1668,-1838,-1688}, +{ -439,-1108,-1178,-1348,-1198}, +{ -789,-1458,-1528,-1698,-1548}, +{ -619,-1288,-1358,-1528,-1378}}}, +/* UG.C@..GC */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..GC */ +{{ -50, -479, -479, -359, -479}, +{ -569, -998, -998, -878, -998}, +{ -769,-1198,-1198,-1078,-1198}, +{ -759,-1188,-1188,-1068,-1188}, +{ -549, -978, -978, -858, -978}}, +/* UG.CC..GC */ +{{ -50, -479, -479, -359, -479}, +{ -929,-1358,-1358,-1238,-1358}, +{ -359, -788, -788, -668, -788}, +{ -789,-1218,-1218,-1098,-1218}, +{ -549, -978, -978, -858, -978}}, +/* UG.CG..GC */ +{{ -50, -479, -479, -359, -479}, +{ -609,-1038,-1038, -918,-1038}, +{ -359, -788, -788, -668, -788}, +{ -669,-1098,-1098, -978,-1098}, +{ -549, -978, -978, -858, -978}}, +/* UG.CU..GC */ +{{ -50, -479, -479, -359, -479}, +{ -929,-1358,-1358,-1238,-1358}, +{ -439, -868, -868, -748, -868}, +{ -789,-1218,-1218,-1098,-1218}, +{ -619,-1048,-1048, -928,-1048}}}, +/* UG.G@..GC */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..GC */ +{{ -50, -659, -809, -919, -809}, +{ -569,-1178,-1328,-1438,-1328}, +{ -769,-1378,-1528,-1638,-1528}, +{ -759,-1368,-1518,-1628,-1518}, +{ -549,-1158,-1308,-1418,-1308}}, +/* UG.GC..GC */ +{{ -50, -659, -809, -919, -809}, +{ -929,-1538,-1688,-1798,-1688}, +{ -359, -968,-1118,-1228,-1118}, +{ -789,-1398,-1548,-1658,-1548}, +{ -549,-1158,-1308,-1418,-1308}}, +/* UG.GG..GC */ +{{ -50, -659, -809, -919, -809}, +{ -609,-1218,-1368,-1478,-1368}, +{ -359, -968,-1118,-1228,-1118}, +{ -669,-1278,-1428,-1538,-1428}, +{ -549,-1158,-1308,-1418,-1308}}, +/* UG.GU..GC */ +{{ -50, -659, -809, -919, -809}, +{ -929,-1538,-1688,-1798,-1688}, +{ -439,-1048,-1198,-1308,-1198}, +{ -789,-1398,-1548,-1658,-1548}, +{ -619,-1228,-1378,-1488,-1378}}}, +/* UG.U@..GC */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..GC */ +{{ -50, -549, -439, -549, -359}, +{ -569,-1068, -958,-1068, -878}, +{ -769,-1268,-1158,-1268,-1078}, +{ -759,-1258,-1148,-1258,-1068}, +{ -549,-1048, -938,-1048, -858}}, +/* UG.UC..GC */ +{{ -50, -549, -439, -549, -359}, +{ -929,-1428,-1318,-1428,-1238}, +{ -359, -858, -748, -858, -668}, +{ -789,-1288,-1178,-1288,-1098}, +{ -549,-1048, -938,-1048, -858}}, +/* UG.UG..GC */ +{{ -50, -549, -439, -549, -359}, +{ -609,-1108, -998,-1108, -918}, +{ -359, -858, -748, -858, -668}, +{ -669,-1168,-1058,-1168, -978}, +{ -549,-1048, -938,-1048, -858}}, +/* UG.UU..GC */ +{{ -50, -549, -439, -549, -359}, +{ -929,-1428,-1318,-1428,-1238}, +{ -439, -938, -828, -938, -748}, +{ -789,-1288,-1178,-1288,-1098}, +{ -619,-1118,-1008,-1118, -928}}}}, +/* UG.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* UG.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UG.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UG.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* UG.A@..GU */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..GU */ +{{ -50, -719, -789, -959, -809}, +{ -479,-1148,-1218,-1388,-1238}, +{ -309, -978,-1048,-1218,-1068}, +{ -389,-1058,-1128,-1298,-1148}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AC..GU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AG..GU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AU..GU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}}, +/* UG.C@..GU */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..GU */ +{{ -50, -479, -479, -359, -479}, +{ -479, -908, -908, -788, -908}, +{ -309, -738, -738, -618, -738}, +{ -389, -818, -818, -698, -818}, +{ -379, -808, -808, -688, -808}}, +/* UG.CC..GU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}, +/* UG.CG..GU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}, +/* UG.CU..GU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}}, +/* UG.G@..GU */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..GU */ +{{ -50, -659, -809, -919, -809}, +{ -479,-1088,-1238,-1348,-1238}, +{ -309, -918,-1068,-1178,-1068}, +{ -389, -998,-1148,-1258,-1148}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GC..GU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GG..GU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GU..GU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}}, +/* UG.U@..GU */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..GU */ +{{ -50, -549, -439, -549, -359}, +{ -479, -978, -868, -978, -788}, +{ -309, -808, -698, -808, -618}, +{ -389, -888, -778, -888, -698}, +{ -379, -878, -768, -878, -688}}, +/* UG.UC..GU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}, +/* UG.UG..GU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}, +/* UG.UU..GU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}}}, +/* UG.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* UG.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* UG.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* UG.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* UG.A@..UG */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..UG */ +{{ -50, -719, -789, -959, -809}, +{ -769,-1438,-1508,-1678,-1528}, +{ -529,-1198,-1268,-1438,-1288}, +{ -709,-1378,-1448,-1618,-1468}, +{ -599,-1268,-1338,-1508,-1358}}, +/* UG.AC..UG */ +{{ -50, -719, -789, -959, -809}, +{ -839,-1508,-1578,-1748,-1598}, +{ -529,-1198,-1268,-1438,-1288}, +{ -859,-1528,-1598,-1768,-1618}, +{ -489,-1158,-1228,-1398,-1248}}, +/* UG.AG..UG */ +{{ -50, -719, -789, -959, -809}, +{-1009,-1678,-1748,-1918,-1768}, +{ -409,-1078,-1148,-1318,-1168}, +{ -969,-1638,-1708,-1878,-1728}, +{ -599,-1268,-1338,-1508,-1358}}, +/* UG.AU..UG */ +{{ -50, -719, -789, -959, -809}, +{ -859,-1528,-1598,-1768,-1618}, +{ -529,-1198,-1268,-1438,-1288}, +{ -859,-1528,-1598,-1768,-1618}, +{ -409,-1078,-1148,-1318,-1168}}}, +/* UG.C@..UG */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..UG */ +{{ -50, -479, -479, -359, -479}, +{ -769,-1198,-1198,-1078,-1198}, +{ -529, -958, -958, -838, -958}, +{ -709,-1138,-1138,-1018,-1138}, +{ -599,-1028,-1028, -908,-1028}}, +/* UG.CC..UG */ +{{ -50, -479, -479, -359, -479}, +{ -839,-1268,-1268,-1148,-1268}, +{ -529, -958, -958, -838, -958}, +{ -859,-1288,-1288,-1168,-1288}, +{ -489, -918, -918, -798, -918}}, +/* UG.CG..UG */ +{{ -50, -479, -479, -359, -479}, +{-1009,-1438,-1438,-1318,-1438}, +{ -409, -838, -838, -718, -838}, +{ -969,-1398,-1398,-1278,-1398}, +{ -599,-1028,-1028, -908,-1028}}, +/* UG.CU..UG */ +{{ -50, -479, -479, -359, -479}, +{ -859,-1288,-1288,-1168,-1288}, +{ -529, -958, -958, -838, -958}, +{ -859,-1288,-1288,-1168,-1288}, +{ -409, -838, -838, -718, -838}}}, +/* UG.G@..UG */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..UG */ +{{ -50, -659, -809, -919, -809}, +{ -769,-1378,-1528,-1638,-1528}, +{ -529,-1138,-1288,-1398,-1288}, +{ -709,-1318,-1468,-1578,-1468}, +{ -599,-1208,-1358,-1468,-1358}}, +/* UG.GC..UG */ +{{ -50, -659, -809, -919, -809}, +{ -839,-1448,-1598,-1708,-1598}, +{ -529,-1138,-1288,-1398,-1288}, +{ -859,-1468,-1618,-1728,-1618}, +{ -489,-1098,-1248,-1358,-1248}}, +/* UG.GG..UG */ +{{ -50, -659, -809, -919, -809}, +{-1009,-1618,-1768,-1878,-1768}, +{ -409,-1018,-1168,-1278,-1168}, +{ -969,-1578,-1728,-1838,-1728}, +{ -599,-1208,-1358,-1468,-1358}}, +/* UG.GU..UG */ +{{ -50, -659, -809, -919, -809}, +{ -859,-1468,-1618,-1728,-1618}, +{ -529,-1138,-1288,-1398,-1288}, +{ -859,-1468,-1618,-1728,-1618}, +{ -409,-1018,-1168,-1278,-1168}}}, +/* UG.U@..UG */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..UG */ +{{ -50, -549, -439, -549, -359}, +{ -769,-1268,-1158,-1268,-1078}, +{ -529,-1028, -918,-1028, -838}, +{ -709,-1208,-1098,-1208,-1018}, +{ -599,-1098, -988,-1098, -908}}, +/* UG.UC..UG */ +{{ -50, -549, -439, -549, -359}, +{ -839,-1338,-1228,-1338,-1148}, +{ -529,-1028, -918,-1028, -838}, +{ -859,-1358,-1248,-1358,-1168}, +{ -489, -988, -878, -988, -798}}, +/* UG.UG..UG */ +{{ -50, -549, -439, -549, -359}, +{-1009,-1508,-1398,-1508,-1318}, +{ -409, -908, -798, -908, -718}, +{ -969,-1468,-1358,-1468,-1278}, +{ -599,-1098, -988,-1098, -908}}, +/* UG.UU..UG */ +{{ -50, -549, -439, -549, -359}, +{ -859,-1358,-1248,-1358,-1168}, +{ -529,-1028, -918,-1028, -838}, +{ -859,-1358,-1248,-1358,-1168}, +{ -409, -908, -798, -908, -718}}}}, +/* UG.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* UG.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UG.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UG.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* UG.A@..AU */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..AU */ +{{ -50, -719, -789, -959, -809}, +{ -479,-1148,-1218,-1388,-1238}, +{ -309, -978,-1048,-1218,-1068}, +{ -389,-1058,-1128,-1298,-1148}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AC..AU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AG..AU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}, +/* UG.AU..AU */ +{{ -50, -719, -789, -959, -809}, +{ -649,-1318,-1388,-1558,-1408}, +{ -289, -958,-1028,-1198,-1048}, +{ -739,-1408,-1478,-1648,-1498}, +{ -379,-1048,-1118,-1288,-1138}}}, +/* UG.C@..AU */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..AU */ +{{ -50, -479, -479, -359, -479}, +{ -479, -908, -908, -788, -908}, +{ -309, -738, -738, -618, -738}, +{ -389, -818, -818, -698, -818}, +{ -379, -808, -808, -688, -808}}, +/* UG.CC..AU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}, +/* UG.CG..AU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}, +/* UG.CU..AU */ +{{ -50, -479, -479, -359, -479}, +{ -649,-1078,-1078, -958,-1078}, +{ -289, -718, -718, -598, -718}, +{ -739,-1168,-1168,-1048,-1168}, +{ -379, -808, -808, -688, -808}}}, +/* UG.G@..AU */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..AU */ +{{ -50, -659, -809, -919, -809}, +{ -479,-1088,-1238,-1348,-1238}, +{ -309, -918,-1068,-1178,-1068}, +{ -389, -998,-1148,-1258,-1148}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GC..AU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GG..AU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}, +/* UG.GU..AU */ +{{ -50, -659, -809, -919, -809}, +{ -649,-1258,-1408,-1518,-1408}, +{ -289, -898,-1048,-1158,-1048}, +{ -739,-1348,-1498,-1608,-1498}, +{ -379, -988,-1138,-1248,-1138}}}, +/* UG.U@..AU */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..AU */ +{{ -50, -549, -439, -549, -359}, +{ -479, -978, -868, -978, -788}, +{ -309, -808, -698, -808, -618}, +{ -389, -888, -778, -888, -698}, +{ -379, -878, -768, -878, -688}}, +/* UG.UC..AU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}, +/* UG.UG..AU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}, +/* UG.UU..AU */ +{{ -50, -549, -439, -549, -359}, +{ -649,-1148,-1038,-1148, -958}, +{ -289, -788, -678, -788, -598}, +{ -739,-1238,-1128,-1238,-1048}, +{ -379, -878, -768, -878, -688}}}}, +/* UG.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* UG.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* UG.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* UG.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* UG.A@..UA */ +{{{ -50, -719, -789, -959, -809}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA..UA */ +{{ -50, -719, -789, -959, -809}, +{ -449,-1118,-1188,-1358,-1208}, +{ -479,-1148,-1218,-1388,-1238}, +{ -429,-1098,-1168,-1338,-1188}, +{ -329, -998,-1068,-1238,-1088}}, +/* UG.AC..UA */ +{{ -50, -719, -789, -959, -809}, +{ -679,-1348,-1418,-1588,-1438}, +{ -559,-1228,-1298,-1468,-1318}, +{ -729,-1398,-1468,-1638,-1488}, +{ -189, -858, -928,-1098, -948}}, +/* UG.AG..UA */ +{{ -50, -719, -789, -959, -809}, +{ -939,-1608,-1678,-1848,-1698}, +{ -249, -918, -988,-1158,-1008}, +{ -939,-1608,-1678,-1848,-1698}, +{ -329, -998,-1068,-1238,-1088}}, +/* UG.AU..UA */ +{{ -50, -719, -789, -959, -809}, +{ -639,-1308,-1378,-1548,-1398}, +{ -229, -898, -968,-1138, -988}, +{ -729,-1398,-1468,-1638,-1488}, +{ -190, -859, -929,-1099, -949}}}, +/* UG.C@..UA */ +{{{ -50, -479, -479, -359, -479}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA..UA */ +{{ -50, -479, -479, -359, -479}, +{ -449, -878, -878, -758, -878}, +{ -479, -908, -908, -788, -908}, +{ -429, -858, -858, -738, -858}, +{ -329, -758, -758, -638, -758}}, +/* UG.CC..UA */ +{{ -50, -479, -479, -359, -479}, +{ -679,-1108,-1108, -988,-1108}, +{ -559, -988, -988, -868, -988}, +{ -729,-1158,-1158,-1038,-1158}, +{ -189, -618, -618, -498, -618}}, +/* UG.CG..UA */ +{{ -50, -479, -479, -359, -479}, +{ -939,-1368,-1368,-1248,-1368}, +{ -249, -678, -678, -558, -678}, +{ -939,-1368,-1368,-1248,-1368}, +{ -329, -758, -758, -638, -758}}, +/* UG.CU..UA */ +{{ -50, -479, -479, -359, -479}, +{ -639,-1068,-1068, -948,-1068}, +{ -229, -658, -658, -538, -658}, +{ -729,-1158,-1158,-1038,-1158}, +{ -190, -619, -619, -499, -619}}}, +/* UG.G@..UA */ +{{{ -50, -659, -809, -919, -809}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA..UA */ +{{ -50, -659, -809, -919, -809}, +{ -449,-1058,-1208,-1318,-1208}, +{ -479,-1088,-1238,-1348,-1238}, +{ -429,-1038,-1188,-1298,-1188}, +{ -329, -938,-1088,-1198,-1088}}, +/* UG.GC..UA */ +{{ -50, -659, -809, -919, -809}, +{ -679,-1288,-1438,-1548,-1438}, +{ -559,-1168,-1318,-1428,-1318}, +{ -729,-1338,-1488,-1598,-1488}, +{ -189, -798, -948,-1058, -948}}, +/* UG.GG..UA */ +{{ -50, -659, -809, -919, -809}, +{ -939,-1548,-1698,-1808,-1698}, +{ -249, -858,-1008,-1118,-1008}, +{ -939,-1548,-1698,-1808,-1698}, +{ -329, -938,-1088,-1198,-1088}}, +/* UG.GU..UA */ +{{ -50, -659, -809, -919, -809}, +{ -639,-1248,-1398,-1508,-1398}, +{ -229, -838, -988,-1098, -988}, +{ -729,-1338,-1488,-1598,-1488}, +{ -190, -799, -949,-1059, -949}}}, +/* UG.U@..UA */ +{{{ -50, -549, -439, -549, -359}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA..UA */ +{{ -50, -549, -439, -549, -359}, +{ -449, -948, -838, -948, -758}, +{ -479, -978, -868, -978, -788}, +{ -429, -928, -818, -928, -738}, +{ -329, -828, -718, -828, -638}}, +/* UG.UC..UA */ +{{ -50, -549, -439, -549, -359}, +{ -679,-1178,-1068,-1178, -988}, +{ -559,-1058, -948,-1058, -868}, +{ -729,-1228,-1118,-1228,-1038}, +{ -189, -688, -578, -688, -498}}, +/* UG.UG..UA */ +{{ -50, -549, -439, -549, -359}, +{ -939,-1438,-1328,-1438,-1248}, +{ -249, -748, -638, -748, -558}, +{ -939,-1438,-1328,-1438,-1248}, +{ -329, -828, -718, -828, -638}}, +/* UG.UU..UA */ +{{ -50, -549, -439, -549, -359}, +{ -639,-1138,-1028,-1138, -948}, +{ -229, -728, -618, -728, -538}, +{ -729,-1228,-1118,-1228,-1038}, +{ -190, -689, -579, -689, -499}}}}, +/* UG.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UG.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* UG.A@.. @ */ +{{{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AA.. @ */ +{{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AC.. @ */ +{{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AG.. @ */ +{{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}, +/* UG.AU.. @ */ +{{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}, +{ -100, -769, -839,-1009, -859}}}, +/* UG.C@.. @ */ +{{{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CA.. @ */ +{{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CC.. @ */ +{{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CG.. @ */ +{{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}, +/* UG.CU.. @ */ +{{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}, +{ -100, -529, -529, -409, -529}}}, +/* UG.G@.. @ */ +{{{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GA.. @ */ +{{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GC.. @ */ +{{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GG.. @ */ +{{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}, +/* UG.GU.. @ */ +{{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}, +{ -100, -709, -859, -969, -859}}}, +/* UG.U@.. @ */ +{{{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UA.. @ */ +{{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UC.. @ */ +{{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UG.. @ */ +{{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}, +/* UG.UU.. @ */ +{{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}, +{ -100, -599, -489, -599, -409}}}}}, +{ /* noPair */ {{{{0}}}}, +/* AU.@@..CG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* AU.@C..CG */ +{{ 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* AU.@G..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* AU.@U..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* AU.A@..CG */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -569, -948,-1118,-1118,-1118}, +{ -989,-1368,-1538,-1538,-1538}, +{ -859,-1238,-1408,-1408,-1408}}, +/* AU.AC..CG */ +{{ -50, -429, -599, -599, -599}, +{ -999,-1378,-1548,-1548,-1548}, +{ -499, -878,-1048,-1048,-1048}, +{ -989,-1368,-1538,-1538,-1538}, +{ -789,-1168,-1338,-1338,-1338}}, +/* AU.AG..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -569, -948,-1118,-1118,-1118}, +{ -989,-1368,-1538,-1538,-1538}, +{ -859,-1238,-1408,-1408,-1408}}, +/* AU.AU..CG */ +{{ -50, -429, -599, -599, -599}, +{-1079,-1458,-1628,-1628,-1628}, +{ -719,-1098,-1268,-1268,-1268}, +{ -989,-1368,-1538,-1538,-1538}, +{ -909,-1288,-1458,-1458,-1458}}}, +/* AU.C@..CG */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -569, -778, -758, -758, -758}, +{ -989,-1198,-1178,-1178,-1178}, +{ -859,-1068,-1048,-1048,-1048}}, +/* AU.CC..CG */ +{{ -50, -259, -239, -239, -239}, +{ -999,-1208,-1188,-1188,-1188}, +{ -499, -708, -688, -688, -688}, +{ -989,-1198,-1178,-1178,-1178}, +{ -789, -998, -978, -978, -978}}, +/* AU.CG..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -569, -778, -758, -758, -758}, +{ -989,-1198,-1178,-1178,-1178}, +{ -859,-1068,-1048,-1048,-1048}}, +/* AU.CU..CG */ +{{ -50, -259, -239, -239, -239}, +{-1079,-1288,-1268,-1268,-1268}, +{ -719, -928, -908, -908, -908}, +{ -989,-1198,-1178,-1178,-1178}, +{ -909,-1118,-1098,-1098,-1098}}}, +/* AU.G@..CG */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -569, -858,-1208,-1208,-1208}, +{ -989,-1278,-1628,-1628,-1628}, +{ -859,-1148,-1498,-1498,-1498}}, +/* AU.GC..CG */ +{{ -50, -339, -689, -689, -689}, +{ -999,-1288,-1638,-1638,-1638}, +{ -499, -788,-1138,-1138,-1138}, +{ -989,-1278,-1628,-1628,-1628}, +{ -789,-1078,-1428,-1428,-1428}}, +/* AU.GG..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -569, -858,-1208,-1208,-1208}, +{ -989,-1278,-1628,-1628,-1628}, +{ -859,-1148,-1498,-1498,-1498}}, +/* AU.GU..CG */ +{{ -50, -339, -689, -689, -689}, +{-1079,-1368,-1718,-1718,-1718}, +{ -719,-1008,-1358,-1358,-1358}, +{ -989,-1278,-1628,-1628,-1628}, +{ -909,-1198,-1548,-1548,-1548}}}, +/* AU.U@..CG */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -569, -848, -848, -848, -848}, +{ -989,-1268,-1268,-1268,-1268}, +{ -859,-1138,-1138,-1138,-1138}}, +/* AU.UC..CG */ +{{ -50, -329, -329, -329, -329}, +{ -999,-1278,-1278,-1278,-1278}, +{ -499, -778, -778, -778, -778}, +{ -989,-1268,-1268,-1268,-1268}, +{ -789,-1068,-1068,-1068,-1068}}, +/* AU.UG..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -569, -848, -848, -848, -848}, +{ -989,-1268,-1268,-1268,-1268}, +{ -859,-1138,-1138,-1138,-1138}}, +/* AU.UU..CG */ +{{ -50, -329, -329, -329, -329}, +{-1079,-1358,-1358,-1358,-1358}, +{ -719, -998, -998, -998, -998}, +{ -989,-1268,-1268,-1268,-1268}, +{ -909,-1188,-1188,-1188,-1188}}}}, +/* AU.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* AU.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* AU.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* AU.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* AU.A@..GC */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..GC */ +{{ -50, -429, -599, -599, -599}, +{ -569, -948,-1118,-1118,-1118}, +{ -769,-1148,-1318,-1318,-1318}, +{ -759,-1138,-1308,-1308,-1308}, +{ -549, -928,-1098,-1098,-1098}}, +/* AU.AC..GC */ +{{ -50, -429, -599, -599, -599}, +{ -929,-1308,-1478,-1478,-1478}, +{ -359, -738, -908, -908, -908}, +{ -789,-1168,-1338,-1338,-1338}, +{ -549, -928,-1098,-1098,-1098}}, +/* AU.AG..GC */ +{{ -50, -429, -599, -599, -599}, +{ -609, -988,-1158,-1158,-1158}, +{ -359, -738, -908, -908, -908}, +{ -669,-1048,-1218,-1218,-1218}, +{ -549, -928,-1098,-1098,-1098}}, +/* AU.AU..GC */ +{{ -50, -429, -599, -599, -599}, +{ -929,-1308,-1478,-1478,-1478}, +{ -439, -818, -988, -988, -988}, +{ -789,-1168,-1338,-1338,-1338}, +{ -619, -998,-1168,-1168,-1168}}}, +/* AU.C@..GC */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..GC */ +{{ -50, -259, -239, -239, -239}, +{ -569, -778, -758, -758, -758}, +{ -769, -978, -958, -958, -958}, +{ -759, -968, -948, -948, -948}, +{ -549, -758, -738, -738, -738}}, +/* AU.CC..GC */ +{{ -50, -259, -239, -239, -239}, +{ -929,-1138,-1118,-1118,-1118}, +{ -359, -568, -548, -548, -548}, +{ -789, -998, -978, -978, -978}, +{ -549, -758, -738, -738, -738}}, +/* AU.CG..GC */ +{{ -50, -259, -239, -239, -239}, +{ -609, -818, -798, -798, -798}, +{ -359, -568, -548, -548, -548}, +{ -669, -878, -858, -858, -858}, +{ -549, -758, -738, -738, -738}}, +/* AU.CU..GC */ +{{ -50, -259, -239, -239, -239}, +{ -929,-1138,-1118,-1118,-1118}, +{ -439, -648, -628, -628, -628}, +{ -789, -998, -978, -978, -978}, +{ -619, -828, -808, -808, -808}}}, +/* AU.G@..GC */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..GC */ +{{ -50, -339, -689, -689, -689}, +{ -569, -858,-1208,-1208,-1208}, +{ -769,-1058,-1408,-1408,-1408}, +{ -759,-1048,-1398,-1398,-1398}, +{ -549, -838,-1188,-1188,-1188}}, +/* AU.GC..GC */ +{{ -50, -339, -689, -689, -689}, +{ -929,-1218,-1568,-1568,-1568}, +{ -359, -648, -998, -998, -998}, +{ -789,-1078,-1428,-1428,-1428}, +{ -549, -838,-1188,-1188,-1188}}, +/* AU.GG..GC */ +{{ -50, -339, -689, -689, -689}, +{ -609, -898,-1248,-1248,-1248}, +{ -359, -648, -998, -998, -998}, +{ -669, -958,-1308,-1308,-1308}, +{ -549, -838,-1188,-1188,-1188}}, +/* AU.GU..GC */ +{{ -50, -339, -689, -689, -689}, +{ -929,-1218,-1568,-1568,-1568}, +{ -439, -728,-1078,-1078,-1078}, +{ -789,-1078,-1428,-1428,-1428}, +{ -619, -908,-1258,-1258,-1258}}}, +/* AU.U@..GC */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..GC */ +{{ -50, -329, -329, -329, -329}, +{ -569, -848, -848, -848, -848}, +{ -769,-1048,-1048,-1048,-1048}, +{ -759,-1038,-1038,-1038,-1038}, +{ -549, -828, -828, -828, -828}}, +/* AU.UC..GC */ +{{ -50, -329, -329, -329, -329}, +{ -929,-1208,-1208,-1208,-1208}, +{ -359, -638, -638, -638, -638}, +{ -789,-1068,-1068,-1068,-1068}, +{ -549, -828, -828, -828, -828}}, +/* AU.UG..GC */ +{{ -50, -329, -329, -329, -329}, +{ -609, -888, -888, -888, -888}, +{ -359, -638, -638, -638, -638}, +{ -669, -948, -948, -948, -948}, +{ -549, -828, -828, -828, -828}}, +/* AU.UU..GC */ +{{ -50, -329, -329, -329, -329}, +{ -929,-1208,-1208,-1208,-1208}, +{ -439, -718, -718, -718, -718}, +{ -789,-1068,-1068,-1068,-1068}, +{ -619, -898, -898, -898, -898}}}}, +/* AU.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* AU.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* AU.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* AU.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* AU.A@..GU */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..GU */ +{{ -50, -429, -599, -599, -599}, +{ -479, -858,-1028,-1028,-1028}, +{ -309, -688, -858, -858, -858}, +{ -389, -768, -938, -938, -938}, +{ -379, -758, -928, -928, -928}}, +/* AU.AC..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* AU.AG..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* AU.AU..GU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}}, +/* AU.C@..GU */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..GU */ +{{ -50, -259, -239, -239, -239}, +{ -479, -688, -668, -668, -668}, +{ -309, -518, -498, -498, -498}, +{ -389, -598, -578, -578, -578}, +{ -379, -588, -568, -568, -568}}, +/* AU.CC..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* AU.CG..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* AU.CU..GU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}}, +/* AU.G@..GU */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..GU */ +{{ -50, -339, -689, -689, -689}, +{ -479, -768,-1118,-1118,-1118}, +{ -309, -598, -948, -948, -948}, +{ -389, -678,-1028,-1028,-1028}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GC..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GG..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GU..GU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}}, +/* AU.U@..GU */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..GU */ +{{ -50, -329, -329, -329, -329}, +{ -479, -758, -758, -758, -758}, +{ -309, -588, -588, -588, -588}, +{ -389, -668, -668, -668, -668}, +{ -379, -658, -658, -658, -658}}, +/* AU.UC..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* AU.UG..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* AU.UU..GU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}}}, +/* AU.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* AU.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* AU.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* AU.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* AU.A@..UG */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..UG */ +{{ -50, -429, -599, -599, -599}, +{ -769,-1148,-1318,-1318,-1318}, +{ -529, -908,-1078,-1078,-1078}, +{ -709,-1088,-1258,-1258,-1258}, +{ -599, -978,-1148,-1148,-1148}}, +/* AU.AC..UG */ +{{ -50, -429, -599, -599, -599}, +{ -839,-1218,-1388,-1388,-1388}, +{ -529, -908,-1078,-1078,-1078}, +{ -859,-1238,-1408,-1408,-1408}, +{ -489, -868,-1038,-1038,-1038}}, +/* AU.AG..UG */ +{{ -50, -429, -599, -599, -599}, +{-1009,-1388,-1558,-1558,-1558}, +{ -409, -788, -958, -958, -958}, +{ -969,-1348,-1518,-1518,-1518}, +{ -599, -978,-1148,-1148,-1148}}, +/* AU.AU..UG */ +{{ -50, -429, -599, -599, -599}, +{ -859,-1238,-1408,-1408,-1408}, +{ -529, -908,-1078,-1078,-1078}, +{ -859,-1238,-1408,-1408,-1408}, +{ -409, -788, -958, -958, -958}}}, +/* AU.C@..UG */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..UG */ +{{ -50, -259, -239, -239, -239}, +{ -769, -978, -958, -958, -958}, +{ -529, -738, -718, -718, -718}, +{ -709, -918, -898, -898, -898}, +{ -599, -808, -788, -788, -788}}, +/* AU.CC..UG */ +{{ -50, -259, -239, -239, -239}, +{ -839,-1048,-1028,-1028,-1028}, +{ -529, -738, -718, -718, -718}, +{ -859,-1068,-1048,-1048,-1048}, +{ -489, -698, -678, -678, -678}}, +/* AU.CG..UG */ +{{ -50, -259, -239, -239, -239}, +{-1009,-1218,-1198,-1198,-1198}, +{ -409, -618, -598, -598, -598}, +{ -969,-1178,-1158,-1158,-1158}, +{ -599, -808, -788, -788, -788}}, +/* AU.CU..UG */ +{{ -50, -259, -239, -239, -239}, +{ -859,-1068,-1048,-1048,-1048}, +{ -529, -738, -718, -718, -718}, +{ -859,-1068,-1048,-1048,-1048}, +{ -409, -618, -598, -598, -598}}}, +/* AU.G@..UG */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..UG */ +{{ -50, -339, -689, -689, -689}, +{ -769,-1058,-1408,-1408,-1408}, +{ -529, -818,-1168,-1168,-1168}, +{ -709, -998,-1348,-1348,-1348}, +{ -599, -888,-1238,-1238,-1238}}, +/* AU.GC..UG */ +{{ -50, -339, -689, -689, -689}, +{ -839,-1128,-1478,-1478,-1478}, +{ -529, -818,-1168,-1168,-1168}, +{ -859,-1148,-1498,-1498,-1498}, +{ -489, -778,-1128,-1128,-1128}}, +/* AU.GG..UG */ +{{ -50, -339, -689, -689, -689}, +{-1009,-1298,-1648,-1648,-1648}, +{ -409, -698,-1048,-1048,-1048}, +{ -969,-1258,-1608,-1608,-1608}, +{ -599, -888,-1238,-1238,-1238}}, +/* AU.GU..UG */ +{{ -50, -339, -689, -689, -689}, +{ -859,-1148,-1498,-1498,-1498}, +{ -529, -818,-1168,-1168,-1168}, +{ -859,-1148,-1498,-1498,-1498}, +{ -409, -698,-1048,-1048,-1048}}}, +/* AU.U@..UG */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..UG */ +{{ -50, -329, -329, -329, -329}, +{ -769,-1048,-1048,-1048,-1048}, +{ -529, -808, -808, -808, -808}, +{ -709, -988, -988, -988, -988}, +{ -599, -878, -878, -878, -878}}, +/* AU.UC..UG */ +{{ -50, -329, -329, -329, -329}, +{ -839,-1118,-1118,-1118,-1118}, +{ -529, -808, -808, -808, -808}, +{ -859,-1138,-1138,-1138,-1138}, +{ -489, -768, -768, -768, -768}}, +/* AU.UG..UG */ +{{ -50, -329, -329, -329, -329}, +{-1009,-1288,-1288,-1288,-1288}, +{ -409, -688, -688, -688, -688}, +{ -969,-1248,-1248,-1248,-1248}, +{ -599, -878, -878, -878, -878}}, +/* AU.UU..UG */ +{{ -50, -329, -329, -329, -329}, +{ -859,-1138,-1138,-1138,-1138}, +{ -529, -808, -808, -808, -808}, +{ -859,-1138,-1138,-1138,-1138}, +{ -409, -688, -688, -688, -688}}}}, +/* AU.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* AU.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* AU.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* AU.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* AU.A@..AU */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..AU */ +{{ -50, -429, -599, -599, -599}, +{ -479, -858,-1028,-1028,-1028}, +{ -309, -688, -858, -858, -858}, +{ -389, -768, -938, -938, -938}, +{ -379, -758, -928, -928, -928}}, +/* AU.AC..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* AU.AG..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}, +/* AU.AU..AU */ +{{ -50, -429, -599, -599, -599}, +{ -649,-1028,-1198,-1198,-1198}, +{ -289, -668, -838, -838, -838}, +{ -739,-1118,-1288,-1288,-1288}, +{ -379, -758, -928, -928, -928}}}, +/* AU.C@..AU */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..AU */ +{{ -50, -259, -239, -239, -239}, +{ -479, -688, -668, -668, -668}, +{ -309, -518, -498, -498, -498}, +{ -389, -598, -578, -578, -578}, +{ -379, -588, -568, -568, -568}}, +/* AU.CC..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* AU.CG..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}, +/* AU.CU..AU */ +{{ -50, -259, -239, -239, -239}, +{ -649, -858, -838, -838, -838}, +{ -289, -498, -478, -478, -478}, +{ -739, -948, -928, -928, -928}, +{ -379, -588, -568, -568, -568}}}, +/* AU.G@..AU */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..AU */ +{{ -50, -339, -689, -689, -689}, +{ -479, -768,-1118,-1118,-1118}, +{ -309, -598, -948, -948, -948}, +{ -389, -678,-1028,-1028,-1028}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GC..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GG..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}, +/* AU.GU..AU */ +{{ -50, -339, -689, -689, -689}, +{ -649, -938,-1288,-1288,-1288}, +{ -289, -578, -928, -928, -928}, +{ -739,-1028,-1378,-1378,-1378}, +{ -379, -668,-1018,-1018,-1018}}}, +/* AU.U@..AU */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..AU */ +{{ -50, -329, -329, -329, -329}, +{ -479, -758, -758, -758, -758}, +{ -309, -588, -588, -588, -588}, +{ -389, -668, -668, -668, -668}, +{ -379, -658, -658, -658, -658}}, +/* AU.UC..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* AU.UG..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}, +/* AU.UU..AU */ +{{ -50, -329, -329, -329, -329}, +{ -649, -928, -928, -928, -928}, +{ -289, -568, -568, -568, -568}, +{ -739,-1018,-1018,-1018,-1018}, +{ -379, -658, -658, -658, -658}}}}, +/* AU.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* AU.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* AU.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* AU.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* AU.A@..UA */ +{{{ -50, -429, -599, -599, -599}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA..UA */ +{{ -50, -429, -599, -599, -599}, +{ -449, -828, -998, -998, -998}, +{ -479, -858,-1028,-1028,-1028}, +{ -429, -808, -978, -978, -978}, +{ -329, -708, -878, -878, -878}}, +/* AU.AC..UA */ +{{ -50, -429, -599, -599, -599}, +{ -679,-1058,-1228,-1228,-1228}, +{ -559, -938,-1108,-1108,-1108}, +{ -729,-1108,-1278,-1278,-1278}, +{ -189, -568, -738, -738, -738}}, +/* AU.AG..UA */ +{{ -50, -429, -599, -599, -599}, +{ -939,-1318,-1488,-1488,-1488}, +{ -249, -628, -798, -798, -798}, +{ -939,-1318,-1488,-1488,-1488}, +{ -329, -708, -878, -878, -878}}, +/* AU.AU..UA */ +{{ -50, -429, -599, -599, -599}, +{ -639,-1018,-1188,-1188,-1188}, +{ -229, -608, -778, -778, -778}, +{ -729,-1108,-1278,-1278,-1278}, +{ -190, -569, -739, -739, -739}}}, +/* AU.C@..UA */ +{{{ -50, -259, -239, -239, -239}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA..UA */ +{{ -50, -259, -239, -239, -239}, +{ -449, -658, -638, -638, -638}, +{ -479, -688, -668, -668, -668}, +{ -429, -638, -618, -618, -618}, +{ -329, -538, -518, -518, -518}}, +/* AU.CC..UA */ +{{ -50, -259, -239, -239, -239}, +{ -679, -888, -868, -868, -868}, +{ -559, -768, -748, -748, -748}, +{ -729, -938, -918, -918, -918}, +{ -189, -398, -378, -378, -378}}, +/* AU.CG..UA */ +{{ -50, -259, -239, -239, -239}, +{ -939,-1148,-1128,-1128,-1128}, +{ -249, -458, -438, -438, -438}, +{ -939,-1148,-1128,-1128,-1128}, +{ -329, -538, -518, -518, -518}}, +/* AU.CU..UA */ +{{ -50, -259, -239, -239, -239}, +{ -639, -848, -828, -828, -828}, +{ -229, -438, -418, -418, -418}, +{ -729, -938, -918, -918, -918}, +{ -190, -399, -379, -379, -379}}}, +/* AU.G@..UA */ +{{{ -50, -339, -689, -689, -689}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA..UA */ +{{ -50, -339, -689, -689, -689}, +{ -449, -738,-1088,-1088,-1088}, +{ -479, -768,-1118,-1118,-1118}, +{ -429, -718,-1068,-1068,-1068}, +{ -329, -618, -968, -968, -968}}, +/* AU.GC..UA */ +{{ -50, -339, -689, -689, -689}, +{ -679, -968,-1318,-1318,-1318}, +{ -559, -848,-1198,-1198,-1198}, +{ -729,-1018,-1368,-1368,-1368}, +{ -189, -478, -828, -828, -828}}, +/* AU.GG..UA */ +{{ -50, -339, -689, -689, -689}, +{ -939,-1228,-1578,-1578,-1578}, +{ -249, -538, -888, -888, -888}, +{ -939,-1228,-1578,-1578,-1578}, +{ -329, -618, -968, -968, -968}}, +/* AU.GU..UA */ +{{ -50, -339, -689, -689, -689}, +{ -639, -928,-1278,-1278,-1278}, +{ -229, -518, -868, -868, -868}, +{ -729,-1018,-1368,-1368,-1368}, +{ -190, -479, -829, -829, -829}}}, +/* AU.U@..UA */ +{{{ -50, -329, -329, -329, -329}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA..UA */ +{{ -50, -329, -329, -329, -329}, +{ -449, -728, -728, -728, -728}, +{ -479, -758, -758, -758, -758}, +{ -429, -708, -708, -708, -708}, +{ -329, -608, -608, -608, -608}}, +/* AU.UC..UA */ +{{ -50, -329, -329, -329, -329}, +{ -679, -958, -958, -958, -958}, +{ -559, -838, -838, -838, -838}, +{ -729,-1008,-1008,-1008,-1008}, +{ -189, -468, -468, -468, -468}}, +/* AU.UG..UA */ +{{ -50, -329, -329, -329, -329}, +{ -939,-1218,-1218,-1218,-1218}, +{ -249, -528, -528, -528, -528}, +{ -939,-1218,-1218,-1218,-1218}, +{ -329, -608, -608, -608, -608}}, +/* AU.UU..UA */ +{{ -50, -329, -329, -329, -329}, +{ -639, -918, -918, -918, -918}, +{ -229, -508, -508, -508, -508}, +{ -729,-1008,-1008,-1008,-1008}, +{ -190, -469, -469, -469, -469}}}}, +/* AU.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* AU.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* AU.A@.. @ */ +{{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AA.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AC.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AG.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}, +/* AU.AU.. @ */ +{{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}, +{ -100, -479, -649, -649, -649}}}, +/* AU.C@.. @ */ +{{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CA.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CC.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CG.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}, +/* AU.CU.. @ */ +{{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}, +{ -100, -309, -289, -289, -289}}}, +/* AU.G@.. @ */ +{{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GA.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GC.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GG.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}, +/* AU.GU.. @ */ +{{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}, +{ -100, -389, -739, -739, -739}}}, +/* AU.U@.. @ */ +{{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UA.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UC.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UG.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}, +/* AU.UU.. @ */ +{{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}, +{ -100, -379, -379, -379, -379}}}}}, +{ /* noPair */ {{{{0}}}}, +/* UA.@@..CG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* UA.@C..CG */ +{{ 0, 0, 0, 0, 0}, +{ -949, -949, -949, -949, -949}, +{ -449, -449, -449, -449, -449}, +{ -939, -939, -939, -939, -939}, +{ -739, -739, -739, -739, -739}}, +/* UA.@G..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -519, -519, -519, -519, -519}, +{ -939, -939, -939, -939, -939}, +{ -809, -809, -809, -809, -809}}, +/* UA.@U..CG */ +{{ 0, 0, 0, 0, 0}, +{-1029,-1029,-1029,-1029,-1029}, +{ -669, -669, -669, -669, -669}, +{ -939, -939, -939, -939, -939}, +{ -859, -859, -859, -859, -859}}}, +/* UA.A@..CG */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..CG */ +{{ -50, -399, -629, -889, -589}, +{-1079,-1428,-1658,-1918,-1618}, +{ -569, -918,-1148,-1408,-1108}, +{ -989,-1338,-1568,-1828,-1528}, +{ -859,-1208,-1438,-1698,-1398}}, +/* UA.AC..CG */ +{{ -50, -399, -629, -889, -589}, +{ -999,-1348,-1578,-1838,-1538}, +{ -499, -848,-1078,-1338,-1038}, +{ -989,-1338,-1568,-1828,-1528}, +{ -789,-1138,-1368,-1628,-1328}}, +/* UA.AG..CG */ +{{ -50, -399, -629, -889, -589}, +{-1079,-1428,-1658,-1918,-1618}, +{ -569, -918,-1148,-1408,-1108}, +{ -989,-1338,-1568,-1828,-1528}, +{ -859,-1208,-1438,-1698,-1398}}, +/* UA.AU..CG */ +{{ -50, -399, -629, -889, -589}, +{-1079,-1428,-1658,-1918,-1618}, +{ -719,-1068,-1298,-1558,-1258}, +{ -989,-1338,-1568,-1828,-1528}, +{ -909,-1258,-1488,-1748,-1448}}}, +/* UA.C@..CG */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..CG */ +{{ -50, -429, -509, -199, -179}, +{-1079,-1458,-1538,-1228,-1208}, +{ -569, -948,-1028, -718, -698}, +{ -989,-1368,-1448,-1138,-1118}, +{ -859,-1238,-1318,-1008, -988}}, +/* UA.CC..CG */ +{{ -50, -429, -509, -199, -179}, +{ -999,-1378,-1458,-1148,-1128}, +{ -499, -878, -958, -648, -628}, +{ -989,-1368,-1448,-1138,-1118}, +{ -789,-1168,-1248, -938, -918}}, +/* UA.CG..CG */ +{{ -50, -429, -509, -199, -179}, +{-1079,-1458,-1538,-1228,-1208}, +{ -569, -948,-1028, -718, -698}, +{ -989,-1368,-1448,-1138,-1118}, +{ -859,-1238,-1318,-1008, -988}}, +/* UA.CU..CG */ +{{ -50, -429, -509, -199, -179}, +{-1079,-1458,-1538,-1228,-1208}, +{ -719,-1098,-1178, -868, -848}, +{ -989,-1368,-1448,-1138,-1118}, +{ -909,-1288,-1368,-1058,-1038}}}, +/* UA.G@..CG */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..CG */ +{{ -50, -379, -679, -889, -679}, +{-1079,-1408,-1708,-1918,-1708}, +{ -569, -898,-1198,-1408,-1198}, +{ -989,-1318,-1618,-1828,-1618}, +{ -859,-1188,-1488,-1698,-1488}}, +/* UA.GC..CG */ +{{ -50, -379, -679, -889, -679}, +{ -999,-1328,-1628,-1838,-1628}, +{ -499, -828,-1128,-1338,-1128}, +{ -989,-1318,-1618,-1828,-1618}, +{ -789,-1118,-1418,-1628,-1418}}, +/* UA.GG..CG */ +{{ -50, -379, -679, -889, -679}, +{-1079,-1408,-1708,-1918,-1708}, +{ -569, -898,-1198,-1408,-1198}, +{ -989,-1318,-1618,-1828,-1618}, +{ -859,-1188,-1488,-1698,-1488}}, +/* UA.GU..CG */ +{{ -50, -379, -679, -889, -679}, +{-1079,-1408,-1708,-1918,-1708}, +{ -719,-1048,-1348,-1558,-1348}, +{ -989,-1318,-1618,-1828,-1618}, +{ -909,-1238,-1538,-1748,-1538}}}, +/* UA.U@..CG */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..CG */ +{{ -50, -279, -139, -279, -140}, +{-1079,-1308,-1168,-1308,-1169}, +{ -569, -798, -658, -798, -659}, +{ -989,-1218,-1078,-1218,-1079}, +{ -859,-1088, -948,-1088, -949}}, +/* UA.UC..CG */ +{{ -50, -279, -139, -279, -140}, +{ -999,-1228,-1088,-1228,-1089}, +{ -499, -728, -588, -728, -589}, +{ -989,-1218,-1078,-1218,-1079}, +{ -789,-1018, -878,-1018, -879}}, +/* UA.UG..CG */ +{{ -50, -279, -139, -279, -140}, +{-1079,-1308,-1168,-1308,-1169}, +{ -569, -798, -658, -798, -659}, +{ -989,-1218,-1078,-1218,-1079}, +{ -859,-1088, -948,-1088, -949}}, +/* UA.UU..CG */ +{{ -50, -279, -139, -279, -140}, +{-1079,-1308,-1168,-1308,-1169}, +{ -719, -948, -808, -948, -809}, +{ -989,-1218,-1078,-1218,-1079}, +{ -909,-1138, -998,-1138, -999}}}}, +/* UA.@@..GC */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..GC */ +{{ 0, 0, 0, 0, 0}, +{ -519, -519, -519, -519, -519}, +{ -719, -719, -719, -719, -719}, +{ -709, -709, -709, -709, -709}, +{ -499, -499, -499, -499, -499}}, +/* UA.@C..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -309, -309, -309, -309, -309}, +{ -739, -739, -739, -739, -739}, +{ -499, -499, -499, -499, -499}}, +/* UA.@G..GC */ +{{ 0, 0, 0, 0, 0}, +{ -559, -559, -559, -559, -559}, +{ -309, -309, -309, -309, -309}, +{ -619, -619, -619, -619, -619}, +{ -499, -499, -499, -499, -499}}, +/* UA.@U..GC */ +{{ 0, 0, 0, 0, 0}, +{ -879, -879, -879, -879, -879}, +{ -389, -389, -389, -389, -389}, +{ -739, -739, -739, -739, -739}, +{ -569, -569, -569, -569, -569}}}, +/* UA.A@..GC */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..GC */ +{{ -50, -399, -629, -889, -589}, +{ -569, -918,-1148,-1408,-1108}, +{ -769,-1118,-1348,-1608,-1308}, +{ -759,-1108,-1338,-1598,-1298}, +{ -549, -898,-1128,-1388,-1088}}, +/* UA.AC..GC */ +{{ -50, -399, -629, -889, -589}, +{ -929,-1278,-1508,-1768,-1468}, +{ -359, -708, -938,-1198, -898}, +{ -789,-1138,-1368,-1628,-1328}, +{ -549, -898,-1128,-1388,-1088}}, +/* UA.AG..GC */ +{{ -50, -399, -629, -889, -589}, +{ -609, -958,-1188,-1448,-1148}, +{ -359, -708, -938,-1198, -898}, +{ -669,-1018,-1248,-1508,-1208}, +{ -549, -898,-1128,-1388,-1088}}, +/* UA.AU..GC */ +{{ -50, -399, -629, -889, -589}, +{ -929,-1278,-1508,-1768,-1468}, +{ -439, -788,-1018,-1278, -978}, +{ -789,-1138,-1368,-1628,-1328}, +{ -619, -968,-1198,-1458,-1158}}}, +/* UA.C@..GC */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..GC */ +{{ -50, -429, -509, -199, -179}, +{ -569, -948,-1028, -718, -698}, +{ -769,-1148,-1228, -918, -898}, +{ -759,-1138,-1218, -908, -888}, +{ -549, -928,-1008, -698, -678}}, +/* UA.CC..GC */ +{{ -50, -429, -509, -199, -179}, +{ -929,-1308,-1388,-1078,-1058}, +{ -359, -738, -818, -508, -488}, +{ -789,-1168,-1248, -938, -918}, +{ -549, -928,-1008, -698, -678}}, +/* UA.CG..GC */ +{{ -50, -429, -509, -199, -179}, +{ -609, -988,-1068, -758, -738}, +{ -359, -738, -818, -508, -488}, +{ -669,-1048,-1128, -818, -798}, +{ -549, -928,-1008, -698, -678}}, +/* UA.CU..GC */ +{{ -50, -429, -509, -199, -179}, +{ -929,-1308,-1388,-1078,-1058}, +{ -439, -818, -898, -588, -568}, +{ -789,-1168,-1248, -938, -918}, +{ -619, -998,-1078, -768, -748}}}, +/* UA.G@..GC */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..GC */ +{{ -50, -379, -679, -889, -679}, +{ -569, -898,-1198,-1408,-1198}, +{ -769,-1098,-1398,-1608,-1398}, +{ -759,-1088,-1388,-1598,-1388}, +{ -549, -878,-1178,-1388,-1178}}, +/* UA.GC..GC */ +{{ -50, -379, -679, -889, -679}, +{ -929,-1258,-1558,-1768,-1558}, +{ -359, -688, -988,-1198, -988}, +{ -789,-1118,-1418,-1628,-1418}, +{ -549, -878,-1178,-1388,-1178}}, +/* UA.GG..GC */ +{{ -50, -379, -679, -889, -679}, +{ -609, -938,-1238,-1448,-1238}, +{ -359, -688, -988,-1198, -988}, +{ -669, -998,-1298,-1508,-1298}, +{ -549, -878,-1178,-1388,-1178}}, +/* UA.GU..GC */ +{{ -50, -379, -679, -889, -679}, +{ -929,-1258,-1558,-1768,-1558}, +{ -439, -768,-1068,-1278,-1068}, +{ -789,-1118,-1418,-1628,-1418}, +{ -619, -948,-1248,-1458,-1248}}}, +/* UA.U@..GC */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..GC */ +{{ -50, -279, -139, -279, -140}, +{ -569, -798, -658, -798, -659}, +{ -769, -998, -858, -998, -859}, +{ -759, -988, -848, -988, -849}, +{ -549, -778, -638, -778, -639}}, +/* UA.UC..GC */ +{{ -50, -279, -139, -279, -140}, +{ -929,-1158,-1018,-1158,-1019}, +{ -359, -588, -448, -588, -449}, +{ -789,-1018, -878,-1018, -879}, +{ -549, -778, -638, -778, -639}}, +/* UA.UG..GC */ +{{ -50, -279, -139, -279, -140}, +{ -609, -838, -698, -838, -699}, +{ -359, -588, -448, -588, -449}, +{ -669, -898, -758, -898, -759}, +{ -549, -778, -638, -778, -639}}, +/* UA.UU..GC */ +{{ -50, -279, -139, -279, -140}, +{ -929,-1158,-1018,-1158,-1019}, +{ -439, -668, -528, -668, -529}, +{ -789,-1018, -878,-1018, -879}, +{ -619, -848, -708, -848, -709}}}}, +/* UA.@@..GU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..GU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* UA.@C..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UA.@G..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UA.@U..GU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* UA.A@..GU */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..GU */ +{{ -50, -399, -629, -889, -589}, +{ -479, -828,-1058,-1318,-1018}, +{ -309, -658, -888,-1148, -848}, +{ -389, -738, -968,-1228, -928}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AC..GU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AG..GU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AU..GU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}}, +/* UA.C@..GU */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..GU */ +{{ -50, -429, -509, -199, -179}, +{ -479, -858, -938, -628, -608}, +{ -309, -688, -768, -458, -438}, +{ -389, -768, -848, -538, -518}, +{ -379, -758, -838, -528, -508}}, +/* UA.CC..GU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}, +/* UA.CG..GU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}, +/* UA.CU..GU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}}, +/* UA.G@..GU */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..GU */ +{{ -50, -379, -679, -889, -679}, +{ -479, -808,-1108,-1318,-1108}, +{ -309, -638, -938,-1148, -938}, +{ -389, -718,-1018,-1228,-1018}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GC..GU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GG..GU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GU..GU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}}, +/* UA.U@..GU */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..GU */ +{{ -50, -279, -139, -279, -140}, +{ -479, -708, -568, -708, -569}, +{ -309, -538, -398, -538, -399}, +{ -389, -618, -478, -618, -479}, +{ -379, -608, -468, -608, -469}}, +/* UA.UC..GU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}, +/* UA.UG..GU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}, +/* UA.UU..GU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}}}, +/* UA.@@..UG */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..UG */ +{{ 0, 0, 0, 0, 0}, +{ -719, -719, -719, -719, -719}, +{ -479, -479, -479, -479, -479}, +{ -659, -659, -659, -659, -659}, +{ -549, -549, -549, -549, -549}}, +/* UA.@C..UG */ +{{ 0, 0, 0, 0, 0}, +{ -789, -789, -789, -789, -789}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -439, -439, -439, -439, -439}}, +/* UA.@G..UG */ +{{ 0, 0, 0, 0, 0}, +{ -959, -959, -959, -959, -959}, +{ -359, -359, -359, -359, -359}, +{ -919, -919, -919, -919, -919}, +{ -549, -549, -549, -549, -549}}, +/* UA.@U..UG */ +{{ 0, 0, 0, 0, 0}, +{ -809, -809, -809, -809, -809}, +{ -479, -479, -479, -479, -479}, +{ -809, -809, -809, -809, -809}, +{ -359, -359, -359, -359, -359}}}, +/* UA.A@..UG */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..UG */ +{{ -50, -399, -629, -889, -589}, +{ -769,-1118,-1348,-1608,-1308}, +{ -529, -878,-1108,-1368,-1068}, +{ -709,-1058,-1288,-1548,-1248}, +{ -599, -948,-1178,-1438,-1138}}, +/* UA.AC..UG */ +{{ -50, -399, -629, -889, -589}, +{ -839,-1188,-1418,-1678,-1378}, +{ -529, -878,-1108,-1368,-1068}, +{ -859,-1208,-1438,-1698,-1398}, +{ -489, -838,-1068,-1328,-1028}}, +/* UA.AG..UG */ +{{ -50, -399, -629, -889, -589}, +{-1009,-1358,-1588,-1848,-1548}, +{ -409, -758, -988,-1248, -948}, +{ -969,-1318,-1548,-1808,-1508}, +{ -599, -948,-1178,-1438,-1138}}, +/* UA.AU..UG */ +{{ -50, -399, -629, -889, -589}, +{ -859,-1208,-1438,-1698,-1398}, +{ -529, -878,-1108,-1368,-1068}, +{ -859,-1208,-1438,-1698,-1398}, +{ -409, -758, -988,-1248, -948}}}, +/* UA.C@..UG */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..UG */ +{{ -50, -429, -509, -199, -179}, +{ -769,-1148,-1228, -918, -898}, +{ -529, -908, -988, -678, -658}, +{ -709,-1088,-1168, -858, -838}, +{ -599, -978,-1058, -748, -728}}, +/* UA.CC..UG */ +{{ -50, -429, -509, -199, -179}, +{ -839,-1218,-1298, -988, -968}, +{ -529, -908, -988, -678, -658}, +{ -859,-1238,-1318,-1008, -988}, +{ -489, -868, -948, -638, -618}}, +/* UA.CG..UG */ +{{ -50, -429, -509, -199, -179}, +{-1009,-1388,-1468,-1158,-1138}, +{ -409, -788, -868, -558, -538}, +{ -969,-1348,-1428,-1118,-1098}, +{ -599, -978,-1058, -748, -728}}, +/* UA.CU..UG */ +{{ -50, -429, -509, -199, -179}, +{ -859,-1238,-1318,-1008, -988}, +{ -529, -908, -988, -678, -658}, +{ -859,-1238,-1318,-1008, -988}, +{ -409, -788, -868, -558, -538}}}, +/* UA.G@..UG */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..UG */ +{{ -50, -379, -679, -889, -679}, +{ -769,-1098,-1398,-1608,-1398}, +{ -529, -858,-1158,-1368,-1158}, +{ -709,-1038,-1338,-1548,-1338}, +{ -599, -928,-1228,-1438,-1228}}, +/* UA.GC..UG */ +{{ -50, -379, -679, -889, -679}, +{ -839,-1168,-1468,-1678,-1468}, +{ -529, -858,-1158,-1368,-1158}, +{ -859,-1188,-1488,-1698,-1488}, +{ -489, -818,-1118,-1328,-1118}}, +/* UA.GG..UG */ +{{ -50, -379, -679, -889, -679}, +{-1009,-1338,-1638,-1848,-1638}, +{ -409, -738,-1038,-1248,-1038}, +{ -969,-1298,-1598,-1808,-1598}, +{ -599, -928,-1228,-1438,-1228}}, +/* UA.GU..UG */ +{{ -50, -379, -679, -889, -679}, +{ -859,-1188,-1488,-1698,-1488}, +{ -529, -858,-1158,-1368,-1158}, +{ -859,-1188,-1488,-1698,-1488}, +{ -409, -738,-1038,-1248,-1038}}}, +/* UA.U@..UG */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..UG */ +{{ -50, -279, -139, -279, -140}, +{ -769, -998, -858, -998, -859}, +{ -529, -758, -618, -758, -619}, +{ -709, -938, -798, -938, -799}, +{ -599, -828, -688, -828, -689}}, +/* UA.UC..UG */ +{{ -50, -279, -139, -279, -140}, +{ -839,-1068, -928,-1068, -929}, +{ -529, -758, -618, -758, -619}, +{ -859,-1088, -948,-1088, -949}, +{ -489, -718, -578, -718, -579}}, +/* UA.UG..UG */ +{{ -50, -279, -139, -279, -140}, +{-1009,-1238,-1098,-1238,-1099}, +{ -409, -638, -498, -638, -499}, +{ -969,-1198,-1058,-1198,-1059}, +{ -599, -828, -688, -828, -689}}, +/* UA.UU..UG */ +{{ -50, -279, -139, -279, -140}, +{ -859,-1088, -948,-1088, -949}, +{ -529, -758, -618, -758, -619}, +{ -859,-1088, -948,-1088, -949}, +{ -409, -638, -498, -638, -499}}}}, +/* UA.@@..AU */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..AU */ +{{ 0, 0, 0, 0, 0}, +{ -429, -429, -429, -429, -429}, +{ -259, -259, -259, -259, -259}, +{ -339, -339, -339, -339, -339}, +{ -329, -329, -329, -329, -329}}, +/* UA.@C..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UA.@G..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}, +/* UA.@U..AU */ +{{ 0, 0, 0, 0, 0}, +{ -599, -599, -599, -599, -599}, +{ -239, -239, -239, -239, -239}, +{ -689, -689, -689, -689, -689}, +{ -329, -329, -329, -329, -329}}}, +/* UA.A@..AU */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..AU */ +{{ -50, -399, -629, -889, -589}, +{ -479, -828,-1058,-1318,-1018}, +{ -309, -658, -888,-1148, -848}, +{ -389, -738, -968,-1228, -928}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AC..AU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AG..AU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}, +/* UA.AU..AU */ +{{ -50, -399, -629, -889, -589}, +{ -649, -998,-1228,-1488,-1188}, +{ -289, -638, -868,-1128, -828}, +{ -739,-1088,-1318,-1578,-1278}, +{ -379, -728, -958,-1218, -918}}}, +/* UA.C@..AU */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..AU */ +{{ -50, -429, -509, -199, -179}, +{ -479, -858, -938, -628, -608}, +{ -309, -688, -768, -458, -438}, +{ -389, -768, -848, -538, -518}, +{ -379, -758, -838, -528, -508}}, +/* UA.CC..AU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}, +/* UA.CG..AU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}, +/* UA.CU..AU */ +{{ -50, -429, -509, -199, -179}, +{ -649,-1028,-1108, -798, -778}, +{ -289, -668, -748, -438, -418}, +{ -739,-1118,-1198, -888, -868}, +{ -379, -758, -838, -528, -508}}}, +/* UA.G@..AU */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..AU */ +{{ -50, -379, -679, -889, -679}, +{ -479, -808,-1108,-1318,-1108}, +{ -309, -638, -938,-1148, -938}, +{ -389, -718,-1018,-1228,-1018}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GC..AU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GG..AU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}, +/* UA.GU..AU */ +{{ -50, -379, -679, -889, -679}, +{ -649, -978,-1278,-1488,-1278}, +{ -289, -618, -918,-1128, -918}, +{ -739,-1068,-1368,-1578,-1368}, +{ -379, -708,-1008,-1218,-1008}}}, +/* UA.U@..AU */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..AU */ +{{ -50, -279, -139, -279, -140}, +{ -479, -708, -568, -708, -569}, +{ -309, -538, -398, -538, -399}, +{ -389, -618, -478, -618, -479}, +{ -379, -608, -468, -608, -469}}, +/* UA.UC..AU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}, +/* UA.UG..AU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}, +/* UA.UU..AU */ +{{ -50, -279, -139, -279, -140}, +{ -649, -878, -738, -878, -739}, +{ -289, -518, -378, -518, -379}, +{ -739, -968, -828, -968, -829}, +{ -379, -608, -468, -608, -469}}}}, +/* UA.@@..UA */ +{{{{ 0, 0, 0, 0, 0}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A..UA */ +{{ 0, 0, 0, 0, 0}, +{ -399, -399, -399, -399, -399}, +{ -429, -429, -429, -429, -429}, +{ -379, -379, -379, -379, -379}, +{ -279, -279, -279, -279, -279}}, +/* UA.@C..UA */ +{{ 0, 0, 0, 0, 0}, +{ -629, -629, -629, -629, -629}, +{ -509, -509, -509, -509, -509}, +{ -679, -679, -679, -679, -679}, +{ -139, -139, -139, -139, -139}}, +/* UA.@G..UA */ +{{ 0, 0, 0, 0, 0}, +{ -889, -889, -889, -889, -889}, +{ -199, -199, -199, -199, -199}, +{ -889, -889, -889, -889, -889}, +{ -279, -279, -279, -279, -279}}, +/* UA.@U..UA */ +{{ 0, 0, 0, 0, 0}, +{ -589, -589, -589, -589, -589}, +{ -179, -179, -179, -179, -179}, +{ -679, -679, -679, -679, -679}, +{ -140, -140, -140, -140, -140}}}, +/* UA.A@..UA */ +{{{ -50, -399, -629, -889, -589}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA..UA */ +{{ -50, -399, -629, -889, -589}, +{ -449, -798,-1028,-1288, -988}, +{ -479, -828,-1058,-1318,-1018}, +{ -429, -778,-1008,-1268, -968}, +{ -329, -678, -908,-1168, -868}}, +/* UA.AC..UA */ +{{ -50, -399, -629, -889, -589}, +{ -679,-1028,-1258,-1518,-1218}, +{ -559, -908,-1138,-1398,-1098}, +{ -729,-1078,-1308,-1568,-1268}, +{ -189, -538, -768,-1028, -728}}, +/* UA.AG..UA */ +{{ -50, -399, -629, -889, -589}, +{ -939,-1288,-1518,-1778,-1478}, +{ -249, -598, -828,-1088, -788}, +{ -939,-1288,-1518,-1778,-1478}, +{ -329, -678, -908,-1168, -868}}, +/* UA.AU..UA */ +{{ -50, -399, -629, -889, -589}, +{ -639, -988,-1218,-1478,-1178}, +{ -229, -578, -808,-1068, -768}, +{ -729,-1078,-1308,-1568,-1268}, +{ -190, -539, -769,-1029, -729}}}, +/* UA.C@..UA */ +{{{ -50, -429, -509, -199, -179}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA..UA */ +{{ -50, -429, -509, -199, -179}, +{ -449, -828, -908, -598, -578}, +{ -479, -858, -938, -628, -608}, +{ -429, -808, -888, -578, -558}, +{ -329, -708, -788, -478, -458}}, +/* UA.CC..UA */ +{{ -50, -429, -509, -199, -179}, +{ -679,-1058,-1138, -828, -808}, +{ -559, -938,-1018, -708, -688}, +{ -729,-1108,-1188, -878, -858}, +{ -189, -568, -648, -338, -318}}, +/* UA.CG..UA */ +{{ -50, -429, -509, -199, -179}, +{ -939,-1318,-1398,-1088,-1068}, +{ -249, -628, -708, -398, -378}, +{ -939,-1318,-1398,-1088,-1068}, +{ -329, -708, -788, -478, -458}}, +/* UA.CU..UA */ +{{ -50, -429, -509, -199, -179}, +{ -639,-1018,-1098, -788, -768}, +{ -229, -608, -688, -378, -358}, +{ -729,-1108,-1188, -878, -858}, +{ -190, -569, -649, -339, -319}}}, +/* UA.G@..UA */ +{{{ -50, -379, -679, -889, -679}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA..UA */ +{{ -50, -379, -679, -889, -679}, +{ -449, -778,-1078,-1288,-1078}, +{ -479, -808,-1108,-1318,-1108}, +{ -429, -758,-1058,-1268,-1058}, +{ -329, -658, -958,-1168, -958}}, +/* UA.GC..UA */ +{{ -50, -379, -679, -889, -679}, +{ -679,-1008,-1308,-1518,-1308}, +{ -559, -888,-1188,-1398,-1188}, +{ -729,-1058,-1358,-1568,-1358}, +{ -189, -518, -818,-1028, -818}}, +/* UA.GG..UA */ +{{ -50, -379, -679, -889, -679}, +{ -939,-1268,-1568,-1778,-1568}, +{ -249, -578, -878,-1088, -878}, +{ -939,-1268,-1568,-1778,-1568}, +{ -329, -658, -958,-1168, -958}}, +/* UA.GU..UA */ +{{ -50, -379, -679, -889, -679}, +{ -639, -968,-1268,-1478,-1268}, +{ -229, -558, -858,-1068, -858}, +{ -729,-1058,-1358,-1568,-1358}, +{ -190, -519, -819,-1029, -819}}}, +/* UA.U@..UA */ +{{{ -50, -279, -139, -279, -140}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA..UA */ +{{ -50, -279, -139, -279, -140}, +{ -449, -678, -538, -678, -539}, +{ -479, -708, -568, -708, -569}, +{ -429, -658, -518, -658, -519}, +{ -329, -558, -418, -558, -419}}, +/* UA.UC..UA */ +{{ -50, -279, -139, -279, -140}, +{ -679, -908, -768, -908, -769}, +{ -559, -788, -648, -788, -649}, +{ -729, -958, -818, -958, -819}, +{ -189, -418, -278, -418, -279}}, +/* UA.UG..UA */ +{{ -50, -279, -139, -279, -140}, +{ -939,-1168,-1028,-1168,-1029}, +{ -249, -478, -338, -478, -339}, +{ -939,-1168,-1028,-1168,-1029}, +{ -329, -558, -418, -558, -419}}, +/* UA.UU..UA */ +{{ -50, -279, -139, -279, -140}, +{ -639, -868, -728, -868, -729}, +{ -229, -458, -318, -458, -319}, +{ -729, -958, -818, -958, -819}, +{ -190, -419, -279, -419, -280}}}}, +/* UA.@@.. @ */ +{{{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@A.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@C.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@G.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}, +/* UA.@U.. @ */ +{{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}, +{ -50, -50, -50, -50, -50}}}, +/* UA.A@.. @ */ +{{{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AA.. @ */ +{{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AC.. @ */ +{{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AG.. @ */ +{{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}, +/* UA.AU.. @ */ +{{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}, +{ -100, -449, -679, -939, -639}}}, +/* UA.C@.. @ */ +{{{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CA.. @ */ +{{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CC.. @ */ +{{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CG.. @ */ +{{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}, +/* UA.CU.. @ */ +{{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}, +{ -100, -479, -559, -249, -229}}}, +/* UA.G@.. @ */ +{{{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GA.. @ */ +{{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GC.. @ */ +{{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GG.. @ */ +{{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}, +/* UA.GU.. @ */ +{{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}, +{ -100, -429, -729, -939, -729}}}, +/* UA.U@.. @ */ +{{{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UA.. @ */ +{{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UC.. @ */ +{{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UG.. @ */ +{{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}, +/* UA.UU.. @ */ +{{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}, +{ -100, -329, -189, -329, -190}}}}}, +{ /* noPair */ {{{{0}}}}, +/* @.@@..CG */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.@C..CG */ +{{ -50, -50, -50, -50, -50}, +{ -999, -999, -999, -999, -999}, +{ -499, -499, -499, -499, -499}, +{ -989, -989, -989, -989, -989}, +{ -789, -789, -789, -789, -789}}, +/* @.@G..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.@U..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -719, -719, -719, -719, -719}, +{ -989, -989, -989, -989, -989}, +{ -909, -909, -909, -909, -909}}}, +/* @.A@..CG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.AC..CG */ +{{ -50, -50, -50, -50, -50}, +{ -999, -999, -999, -999, -999}, +{ -499, -499, -499, -499, -499}, +{ -989, -989, -989, -989, -989}, +{ -789, -789, -789, -789, -789}}, +/* @.AG..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.AU..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -719, -719, -719, -719, -719}, +{ -989, -989, -989, -989, -989}, +{ -909, -909, -909, -909, -909}}}, +/* @.C@..CG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.CC..CG */ +{{ -50, -50, -50, -50, -50}, +{ -999, -999, -999, -999, -999}, +{ -499, -499, -499, -499, -499}, +{ -989, -989, -989, -989, -989}, +{ -789, -789, -789, -789, -789}}, +/* @.CG..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.CU..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -719, -719, -719, -719, -719}, +{ -989, -989, -989, -989, -989}, +{ -909, -909, -909, -909, -909}}}, +/* @.G@..CG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.GC..CG */ +{{ -50, -50, -50, -50, -50}, +{ -999, -999, -999, -999, -999}, +{ -499, -499, -499, -499, -499}, +{ -989, -989, -989, -989, -989}, +{ -789, -789, -789, -789, -789}}, +/* @.GG..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.GU..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -719, -719, -719, -719, -719}, +{ -989, -989, -989, -989, -989}, +{ -909, -909, -909, -909, -909}}}, +/* @.U@..CG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.UC..CG */ +{{ -50, -50, -50, -50, -50}, +{ -999, -999, -999, -999, -999}, +{ -499, -499, -499, -499, -499}, +{ -989, -989, -989, -989, -989}, +{ -789, -789, -789, -789, -789}}, +/* @.UG..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -569, -569, -569, -569, -569}, +{ -989, -989, -989, -989, -989}, +{ -859, -859, -859, -859, -859}}, +/* @.UU..CG */ +{{ -50, -50, -50, -50, -50}, +{-1079,-1079,-1079,-1079,-1079}, +{ -719, -719, -719, -719, -719}, +{ -989, -989, -989, -989, -989}, +{ -909, -909, -909, -909, -909}}}}, +/* @.@@..GC */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..GC */ +{{ -50, -50, -50, -50, -50}, +{ -569, -569, -569, -569, -569}, +{ -769, -769, -769, -769, -769}, +{ -759, -759, -759, -759, -759}, +{ -549, -549, -549, -549, -549}}, +/* @.@C..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -359, -359, -359, -359, -359}, +{ -789, -789, -789, -789, -789}, +{ -549, -549, -549, -549, -549}}, +/* @.@G..GC */ +{{ -50, -50, -50, -50, -50}, +{ -609, -609, -609, -609, -609}, +{ -359, -359, -359, -359, -359}, +{ -669, -669, -669, -669, -669}, +{ -549, -549, -549, -549, -549}}, +/* @.@U..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -439, -439, -439, -439, -439}, +{ -789, -789, -789, -789, -789}, +{ -619, -619, -619, -619, -619}}}, +/* @.A@..GC */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..GC */ +{{ -50, -50, -50, -50, -50}, +{ -569, -569, -569, -569, -569}, +{ -769, -769, -769, -769, -769}, +{ -759, -759, -759, -759, -759}, +{ -549, -549, -549, -549, -549}}, +/* @.AC..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -359, -359, -359, -359, -359}, +{ -789, -789, -789, -789, -789}, +{ -549, -549, -549, -549, -549}}, +/* @.AG..GC */ +{{ -50, -50, -50, -50, -50}, +{ -609, -609, -609, -609, -609}, +{ -359, -359, -359, -359, -359}, +{ -669, -669, -669, -669, -669}, +{ -549, -549, -549, -549, -549}}, +/* @.AU..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -439, -439, -439, -439, -439}, +{ -789, -789, -789, -789, -789}, +{ -619, -619, -619, -619, -619}}}, +/* @.C@..GC */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..GC */ +{{ -50, -50, -50, -50, -50}, +{ -569, -569, -569, -569, -569}, +{ -769, -769, -769, -769, -769}, +{ -759, -759, -759, -759, -759}, +{ -549, -549, -549, -549, -549}}, +/* @.CC..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -359, -359, -359, -359, -359}, +{ -789, -789, -789, -789, -789}, +{ -549, -549, -549, -549, -549}}, +/* @.CG..GC */ +{{ -50, -50, -50, -50, -50}, +{ -609, -609, -609, -609, -609}, +{ -359, -359, -359, -359, -359}, +{ -669, -669, -669, -669, -669}, +{ -549, -549, -549, -549, -549}}, +/* @.CU..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -439, -439, -439, -439, -439}, +{ -789, -789, -789, -789, -789}, +{ -619, -619, -619, -619, -619}}}, +/* @.G@..GC */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..GC */ +{{ -50, -50, -50, -50, -50}, +{ -569, -569, -569, -569, -569}, +{ -769, -769, -769, -769, -769}, +{ -759, -759, -759, -759, -759}, +{ -549, -549, -549, -549, -549}}, +/* @.GC..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -359, -359, -359, -359, -359}, +{ -789, -789, -789, -789, -789}, +{ -549, -549, -549, -549, -549}}, +/* @.GG..GC */ +{{ -50, -50, -50, -50, -50}, +{ -609, -609, -609, -609, -609}, +{ -359, -359, -359, -359, -359}, +{ -669, -669, -669, -669, -669}, +{ -549, -549, -549, -549, -549}}, +/* @.GU..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -439, -439, -439, -439, -439}, +{ -789, -789, -789, -789, -789}, +{ -619, -619, -619, -619, -619}}}, +/* @.U@..GC */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..GC */ +{{ -50, -50, -50, -50, -50}, +{ -569, -569, -569, -569, -569}, +{ -769, -769, -769, -769, -769}, +{ -759, -759, -759, -759, -759}, +{ -549, -549, -549, -549, -549}}, +/* @.UC..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -359, -359, -359, -359, -359}, +{ -789, -789, -789, -789, -789}, +{ -549, -549, -549, -549, -549}}, +/* @.UG..GC */ +{{ -50, -50, -50, -50, -50}, +{ -609, -609, -609, -609, -609}, +{ -359, -359, -359, -359, -359}, +{ -669, -669, -669, -669, -669}, +{ -549, -549, -549, -549, -549}}, +/* @.UU..GC */ +{{ -50, -50, -50, -50, -50}, +{ -929, -929, -929, -929, -929}, +{ -439, -439, -439, -439, -439}, +{ -789, -789, -789, -789, -789}, +{ -619, -619, -619, -619, -619}}}}, +/* @.@@..GU */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..GU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.@C..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.@G..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.@U..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.A@..GU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..GU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.AC..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.AG..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.AU..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.C@..GU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..GU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.CC..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.CG..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.CU..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.G@..GU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..GU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.GC..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.GG..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.GU..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.U@..GU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..GU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.UC..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.UG..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.UU..GU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}}, +/* @.@@..UG */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..UG */ +{{ -50, -50, -50, -50, -50}, +{ -769, -769, -769, -769, -769}, +{ -529, -529, -529, -529, -529}, +{ -709, -709, -709, -709, -709}, +{ -599, -599, -599, -599, -599}}, +/* @.@C..UG */ +{{ -50, -50, -50, -50, -50}, +{ -839, -839, -839, -839, -839}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -489, -489, -489, -489, -489}}, +/* @.@G..UG */ +{{ -50, -50, -50, -50, -50}, +{-1009,-1009,-1009,-1009,-1009}, +{ -409, -409, -409, -409, -409}, +{ -969, -969, -969, -969, -969}, +{ -599, -599, -599, -599, -599}}, +/* @.@U..UG */ +{{ -50, -50, -50, -50, -50}, +{ -859, -859, -859, -859, -859}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -409, -409, -409, -409, -409}}}, +/* @.A@..UG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..UG */ +{{ -50, -50, -50, -50, -50}, +{ -769, -769, -769, -769, -769}, +{ -529, -529, -529, -529, -529}, +{ -709, -709, -709, -709, -709}, +{ -599, -599, -599, -599, -599}}, +/* @.AC..UG */ +{{ -50, -50, -50, -50, -50}, +{ -839, -839, -839, -839, -839}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -489, -489, -489, -489, -489}}, +/* @.AG..UG */ +{{ -50, -50, -50, -50, -50}, +{-1009,-1009,-1009,-1009,-1009}, +{ -409, -409, -409, -409, -409}, +{ -969, -969, -969, -969, -969}, +{ -599, -599, -599, -599, -599}}, +/* @.AU..UG */ +{{ -50, -50, -50, -50, -50}, +{ -859, -859, -859, -859, -859}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -409, -409, -409, -409, -409}}}, +/* @.C@..UG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..UG */ +{{ -50, -50, -50, -50, -50}, +{ -769, -769, -769, -769, -769}, +{ -529, -529, -529, -529, -529}, +{ -709, -709, -709, -709, -709}, +{ -599, -599, -599, -599, -599}}, +/* @.CC..UG */ +{{ -50, -50, -50, -50, -50}, +{ -839, -839, -839, -839, -839}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -489, -489, -489, -489, -489}}, +/* @.CG..UG */ +{{ -50, -50, -50, -50, -50}, +{-1009,-1009,-1009,-1009,-1009}, +{ -409, -409, -409, -409, -409}, +{ -969, -969, -969, -969, -969}, +{ -599, -599, -599, -599, -599}}, +/* @.CU..UG */ +{{ -50, -50, -50, -50, -50}, +{ -859, -859, -859, -859, -859}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -409, -409, -409, -409, -409}}}, +/* @.G@..UG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..UG */ +{{ -50, -50, -50, -50, -50}, +{ -769, -769, -769, -769, -769}, +{ -529, -529, -529, -529, -529}, +{ -709, -709, -709, -709, -709}, +{ -599, -599, -599, -599, -599}}, +/* @.GC..UG */ +{{ -50, -50, -50, -50, -50}, +{ -839, -839, -839, -839, -839}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -489, -489, -489, -489, -489}}, +/* @.GG..UG */ +{{ -50, -50, -50, -50, -50}, +{-1009,-1009,-1009,-1009,-1009}, +{ -409, -409, -409, -409, -409}, +{ -969, -969, -969, -969, -969}, +{ -599, -599, -599, -599, -599}}, +/* @.GU..UG */ +{{ -50, -50, -50, -50, -50}, +{ -859, -859, -859, -859, -859}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -409, -409, -409, -409, -409}}}, +/* @.U@..UG */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..UG */ +{{ -50, -50, -50, -50, -50}, +{ -769, -769, -769, -769, -769}, +{ -529, -529, -529, -529, -529}, +{ -709, -709, -709, -709, -709}, +{ -599, -599, -599, -599, -599}}, +/* @.UC..UG */ +{{ -50, -50, -50, -50, -50}, +{ -839, -839, -839, -839, -839}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -489, -489, -489, -489, -489}}, +/* @.UG..UG */ +{{ -50, -50, -50, -50, -50}, +{-1009,-1009,-1009,-1009,-1009}, +{ -409, -409, -409, -409, -409}, +{ -969, -969, -969, -969, -969}, +{ -599, -599, -599, -599, -599}}, +/* @.UU..UG */ +{{ -50, -50, -50, -50, -50}, +{ -859, -859, -859, -859, -859}, +{ -529, -529, -529, -529, -529}, +{ -859, -859, -859, -859, -859}, +{ -409, -409, -409, -409, -409}}}}, +/* @.@@..AU */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..AU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.@C..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.@G..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.@U..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.A@..AU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..AU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.AC..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.AG..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.AU..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.C@..AU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..AU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.CC..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.CG..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.CU..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.G@..AU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..AU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.GC..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.GG..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.GU..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}, +/* @.U@..AU */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..AU */ +{{ -50, -50, -50, -50, -50}, +{ -479, -479, -479, -479, -479}, +{ -309, -309, -309, -309, -309}, +{ -389, -389, -389, -389, -389}, +{ -379, -379, -379, -379, -379}}, +/* @.UC..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.UG..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}, +/* @.UU..AU */ +{{ -50, -50, -50, -50, -50}, +{ -649, -649, -649, -649, -649}, +{ -289, -289, -289, -289, -289}, +{ -739, -739, -739, -739, -739}, +{ -379, -379, -379, -379, -379}}}}, +/* @.@@..UA */ +{{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A..UA */ +{{ -50, -50, -50, -50, -50}, +{ -449, -449, -449, -449, -449}, +{ -479, -479, -479, -479, -479}, +{ -429, -429, -429, -429, -429}, +{ -329, -329, -329, -329, -329}}, +/* @.@C..UA */ +{{ -50, -50, -50, -50, -50}, +{ -679, -679, -679, -679, -679}, +{ -559, -559, -559, -559, -559}, +{ -729, -729, -729, -729, -729}, +{ -189, -189, -189, -189, -189}}, +/* @.@G..UA */ +{{ -50, -50, -50, -50, -50}, +{ -939, -939, -939, -939, -939}, +{ -249, -249, -249, -249, -249}, +{ -939, -939, -939, -939, -939}, +{ -329, -329, -329, -329, -329}}, +/* @.@U..UA */ +{{ -50, -50, -50, -50, -50}, +{ -639, -639, -639, -639, -639}, +{ -229, -229, -229, -229, -229}, +{ -729, -729, -729, -729, -729}, +{ -190, -190, -190, -190, -190}}}, +/* @.A@..UA */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA..UA */ +{{ -50, -50, -50, -50, -50}, +{ -449, -449, -449, -449, -449}, +{ -479, -479, -479, -479, -479}, +{ -429, -429, -429, -429, -429}, +{ -329, -329, -329, -329, -329}}, +/* @.AC..UA */ +{{ -50, -50, -50, -50, -50}, +{ -679, -679, -679, -679, -679}, +{ -559, -559, -559, -559, -559}, +{ -729, -729, -729, -729, -729}, +{ -189, -189, -189, -189, -189}}, +/* @.AG..UA */ +{{ -50, -50, -50, -50, -50}, +{ -939, -939, -939, -939, -939}, +{ -249, -249, -249, -249, -249}, +{ -939, -939, -939, -939, -939}, +{ -329, -329, -329, -329, -329}}, +/* @.AU..UA */ +{{ -50, -50, -50, -50, -50}, +{ -639, -639, -639, -639, -639}, +{ -229, -229, -229, -229, -229}, +{ -729, -729, -729, -729, -729}, +{ -190, -190, -190, -190, -190}}}, +/* @.C@..UA */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA..UA */ +{{ -50, -50, -50, -50, -50}, +{ -449, -449, -449, -449, -449}, +{ -479, -479, -479, -479, -479}, +{ -429, -429, -429, -429, -429}, +{ -329, -329, -329, -329, -329}}, +/* @.CC..UA */ +{{ -50, -50, -50, -50, -50}, +{ -679, -679, -679, -679, -679}, +{ -559, -559, -559, -559, -559}, +{ -729, -729, -729, -729, -729}, +{ -189, -189, -189, -189, -189}}, +/* @.CG..UA */ +{{ -50, -50, -50, -50, -50}, +{ -939, -939, -939, -939, -939}, +{ -249, -249, -249, -249, -249}, +{ -939, -939, -939, -939, -939}, +{ -329, -329, -329, -329, -329}}, +/* @.CU..UA */ +{{ -50, -50, -50, -50, -50}, +{ -639, -639, -639, -639, -639}, +{ -229, -229, -229, -229, -229}, +{ -729, -729, -729, -729, -729}, +{ -190, -190, -190, -190, -190}}}, +/* @.G@..UA */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA..UA */ +{{ -50, -50, -50, -50, -50}, +{ -449, -449, -449, -449, -449}, +{ -479, -479, -479, -479, -479}, +{ -429, -429, -429, -429, -429}, +{ -329, -329, -329, -329, -329}}, +/* @.GC..UA */ +{{ -50, -50, -50, -50, -50}, +{ -679, -679, -679, -679, -679}, +{ -559, -559, -559, -559, -559}, +{ -729, -729, -729, -729, -729}, +{ -189, -189, -189, -189, -189}}, +/* @.GG..UA */ +{{ -50, -50, -50, -50, -50}, +{ -939, -939, -939, -939, -939}, +{ -249, -249, -249, -249, -249}, +{ -939, -939, -939, -939, -939}, +{ -329, -329, -329, -329, -329}}, +/* @.GU..UA */ +{{ -50, -50, -50, -50, -50}, +{ -639, -639, -639, -639, -639}, +{ -229, -229, -229, -229, -229}, +{ -729, -729, -729, -729, -729}, +{ -190, -190, -190, -190, -190}}}, +/* @.U@..UA */ +{{{ -50, -50, -50, -50, -50}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA..UA */ +{{ -50, -50, -50, -50, -50}, +{ -449, -449, -449, -449, -449}, +{ -479, -479, -479, -479, -479}, +{ -429, -429, -429, -429, -429}, +{ -329, -329, -329, -329, -329}}, +/* @.UC..UA */ +{{ -50, -50, -50, -50, -50}, +{ -679, -679, -679, -679, -679}, +{ -559, -559, -559, -559, -559}, +{ -729, -729, -729, -729, -729}, +{ -189, -189, -189, -189, -189}}, +/* @.UG..UA */ +{{ -50, -50, -50, -50, -50}, +{ -939, -939, -939, -939, -939}, +{ -249, -249, -249, -249, -249}, +{ -939, -939, -939, -939, -939}, +{ -329, -329, -329, -329, -329}}, +/* @.UU..UA */ +{{ -50, -50, -50, -50, -50}, +{ -639, -639, -639, -639, -639}, +{ -229, -229, -229, -229, -229}, +{ -729, -729, -729, -729, -729}, +{ -190, -190, -190, -190, -190}}}}, +/* @.@@.. @ */ +{{{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@A.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@C.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@G.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.@U.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}}, +/* @.A@.. @ */ +{{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AA.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AC.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AG.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.AU.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}}, +/* @.C@.. @ */ +{{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CA.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CC.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CG.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.CU.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}}, +/* @.G@.. @ */ +{{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GA.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GC.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GG.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.GU.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}}, +/* @.U@.. @ */ +{{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UA.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UC.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UG.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}, +/* @.UU.. @ */ +{{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}, +{ -100, -100, -100, -100, -100}}}}}}; + +int +energy_param:: +getMaxNinio() +{ return MAX_NINIO; } + +int +energy_param:: +getNinio(int i) +{ return F_ninio37[i]; } + +int +energy_param::getDangle5(int i, int j) +{ return dangle5_37[convertPairType(i)][convertBaseType(j)]; } + +int +energy_param:: +getDangle3(int i, int j) +{ return dangle3_37[convertPairType(i)][convertBaseType(j)]; } + +int +energy_param:: +getHairpin(int i) +{ return hairpin37[i]; } + +int +energy_param:: +getInternalLoop(int i) +{ return internal_loop37[i]; } + +int +energy_param::getBulge(int i) +{ return bulge37[i]; } + +const char +*energy_param:: +getTetraLoop(int i) +{ return Tetrastrings[i]; } + +int +energy_param:: +getTetraLoopEnergy(int i) +{ return TETRA_ENERGY37[i]; } + +int +energy_param:: +getStack(int i, int j) +{ return stack37[convertPairType(i)][convertPairType(j)]; } + +int +energy_param:: +getTstackH(int i, int j) +{ return mismatchH37[convertPairType(i)][convertLeftType(j)][convertRightType(j)]; } + +int +energy_param:: +getTstackI(int i, int j) +{ return mismatchI37[convertPairType(i)][convertLeftType(j)][convertRightType(j)]; } + +int +energy_param:: +getInt11(int i, int j, int k) +{ return int11_37[convertPairType(i)][convertPairType(j)][convertLeftType(k)][convertRightType(k)]; } + +int +energy_param:: +getInt21(int i, int j, int k, int l) +{ return int21_37[convertPairType(i)][convertPairType(j)][convertLeftType(k)][convertBaseType(l)][convertRightType(k)]; } + +int +energy_param:: +getInt22(int i, int j, int k, int l) +{ return int22_37[convertPairType(i)][convertPairType(j)][convertLeftType(k)][convertLeftType(l)][convertRightType(l)][convertRightType(k)]; } + +int +energy_param:: +getMLintern() +{ return ML_intern37; } + +int +energy_param:: +getMLBase() +{ return ML_BASE37; } + +int +energy_param:: +getMLclosing() +{ return ML_closing37; } + +int +energy_param:: +getTerminalAU() +{ return TerminalAU; } + +/* + 1 C<->G 1 + 2 G<->C 2 + 3 G<->U 3 + 5 U<->G 4 + 0 A<->U 5 + 4 U<->A 6 + 6 0 + */ +int +energy_param:: +convertPairType(int type) +{ + if (type == 0) return 5; + else if(type == 1) return 1; + else if(type == 2) return 2; + else if(type == 3) return 3; + else if(type == 4) return 6; + else if(type == 5) return 4; + else if(type == 6) return 0; + else { cerr << "error convertPairType" << endl; exit(1); } +} + +/* + 0 A 1 + 1 C 2 + 2 G 3 + 3 U 4 + */ +int +energy_param:: +convertBaseType(int type) +{ + if (type == 0) return 1; + else if(type == 1) return 2; + else if(type == 2) return 3; + else if(type == 3) return 4; + else { cerr << "error convertBaseType" << endl; exit(1); } +} + +/* + A<->A 0 + A<->C 1 + A<->G 2 + A<->U 3 + C<->A 4 + C<->C 5 + C<->G 6 + C<->U 7 + G<->A 8 + G<->C 9 + G<->G 10 + G<->U 11 + U<->A 12 + U<->C 13 + U<->G 14 + U<->U 15 + */ +int +energy_param:: +convertLeftType(int type) +{ + if (0 <= type && type <= 3 ) { return 1; } + else if(4 <= type && type <= 7 ) { return 2; } + else if(8 <= type && type <= 11) { return 3; } + else if(12<= type && type <= 15) { return 4; } + else { cerr << "convertLeftType" << endl; exit(1); } +} + +int +energy_param:: +convertRightType(int type) +{ + if (type % 4 == 0) { return 1; } + else if(type % 4 == 1) { return 2; } + else if(type % 4 == 2) { return 3; } + else if(type % 4 == 3) { return 4; } + else { cerr << "convertRightType" << endl; exit(1); } +} +} diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.hpp b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.hpp new file mode 100644 index 0000000000..b6bcd4c532 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/energy_param.hpp @@ -0,0 +1,111 @@ +/* + Current free energy parameters are summarized in: + + D.H.Mathews, J. Sabina, M. ZUker, D.H. Turner + "Expanded sequence dependence of thermodynamic parameters improves + prediction of RNA secondary structure" + JMB, 288, pp 911-940, 1999 + + Enthalpies taken from: + + A. Walter, D Turner, J Kim, M Lyttle, P M"uller, D Mathews, M Zuker + "Coaxial stckaing of helices enhances binding of oligoribonucleotides.." + PNAS, 91, pp 9218-9222, 1994 + + D.H. Turner, N. Sugimoto, and S.M. Freier. + "RNA Structure Prediction", + Ann. Rev. Biophys. Biophys. Chem. 17, 167-192, 1988. + + John A.Jaeger, Douglas H.Turner, and Michael Zuker. + "Improved predictions of secondary structures for RNA", + PNAS, 86, 7706-7710, October 1989. + + L. He, R. Kierzek, J. SantaLucia, A.E. Walter, D.H. Turner + "Nearest-Neughbor Parameters for GU Mismatches...." + Biochemistry 1991, 30 11124-11132 + + A.E. Peritz, R. Kierzek, N, Sugimoto, D.H. Turner + "Thermodynamic Study of Internal Loops in Oligoribonucleotides..." + Biochemistry 1991, 30, 6428--6435 + + +*/ + +#ifndef ENERGY_PARAM_H +#define ENERGY_PARAM_H + +#include +#include // by katoh + +using namespace std; +namespace MXSCARNA { +class energy_param { + + static const int INF; + static const int NST; + static const int DEF; + + static const double lxc37; /* parameter for logarithmic loop + energy extrapolation */ + static const int stack37[8][8]; + static const int enthalpies[8][8]; + static const int oldhairpin37[31]; + static const int hairpin37[31]; + static const int oldbulge37[31]; + static const int bulge37[31]; + static const int oldinternal_loop37[31]; + static const int internal_loop37[31]; + static const int mismatchI37[8][5][5]; + static const int mismatchH37[8][5][5]; + static const int mism_H[8][5][5]; + static const int dangle5_37[8][5]; + static const int dangle3_37[8][5]; + static const int dangle3_H[8][5]; + static const int dangle5_H[8][5]; + static const int ML_BASE37; + static const int ML_closing37; + static const int ML_intern37; + static const int MAX_NINIO; + static const int F_ninio37[5]; + static const char Tetraloops[1400]; + static const char Tetrastrings[30][7]; + static const int TETRA_ENERGY37[200]; + static const int TETRA_ENTH37; + static const int TerminalAU; + static const int DuplexInit; + + static const int int11_37[8][8][5][5]; + static const int int11_H[8][8][5][5]; + static const int int21_37[8][8][5][5][5]; + static const int int21_H[8][8][5][5][5]; + static const int int22_37[8][8][5][5][5][5]; + static const int int22_H[8][8][5][5][5][5]; + + int convertPairType(int type); + int convertBaseType(int type); + int convertLeftType(int type); + int convertRightType(int type); + + public: + int getMaxNinio(); + int getNinio(int i); + int getDangle5(int i, int j); + int getDangle3(int i, int j); + int getHairpin(int i); + int getInternalLoop(int i); + int getBulge(int i); + const char *getTetraLoop(int i); + int getTetraLoopEnergy(int i); + int getStack(int i, int j); + int getTstackH(int i, int j); + int getTstackI(int i, int j); + int getInt11(int i, int j, int k); + int getInt21(int i, int j, int k, int l); + int getInt22(int i, int j, int k, int l); + int getMLintern(); + int getMLBase(); + int getMLclosing(); + int getTerminalAU(); +}; +} +#endif diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/params.h b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/params.h new file mode 100644 index 0000000000..46d6122f41 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/mxscarna_src/vienna/params.h @@ -0,0 +1,32 @@ +#include "energy_const.h" +typedef struct { + int id; + int stack[NBPAIRS+1][NBPAIRS+1]; + int hairpin[31]; + int bulge[MAXLOOP+1]; + int internal_loop[MAXLOOP+1]; + int mismatchI[NBPAIRS+1][5][5]; + int mismatchH[NBPAIRS+1][5][5]; + int mismatchM[NBPAIRS+1][5][5]; + int dangle5[NBPAIRS+1][5]; + int dangle3[NBPAIRS+1][5]; + int int11[NBPAIRS+1][NBPAIRS+1][5][5]; + int int21[NBPAIRS+1][NBPAIRS+1][5][5][5]; + int int22[NBPAIRS+1][NBPAIRS+1][5][5][5][5]; + int F_ninio[5]; + double lxc; + int MLbase; + int MLintern[NBPAIRS+1]; + int MLclosing; + int TerminalAU; + int DuplexInit; + int TETRA_ENERGY[200]; + char Tetraloops[1401]; + int Triloop_E[40]; + char Triloops[241]; + double temperature; +} paramT; + +extern paramT *scale_parameters(void); +extern paramT *copy_parameters(void); +extern paramT *set_parameters(paramT *dest); diff --git a/mafft/src/mafft-7.487-with-extensions/extensions/univscript.tmpl b/mafft/src/mafft-7.487-with-extensions/extensions/univscript.tmpl new file mode 100644 index 0000000000..cdbc84a59f --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/extensions/univscript.tmpl @@ -0,0 +1,24 @@ +progs="_PROGS" +for prog in $progs; do + printf $prog" " +done + + +make clean +make CC="/opt/homebrew-x86_64/bin/gcc-11" CFLAGS="-O3 -arch x86_64 -mmacosx-version-min=10.9 -DMACOSX_DEPLOYMENT_TARGET=10.9" CXX="/opt/homebrew-x86_64/bin/g++-11" CXXFLAGS="-O3 -arch x86_64 -mmacosx-version-min=10.9 -DMACOSX_DEPLOYMENT_TARGET=10.9" LIBS="-lm -static-libgcc" +for prog in $progs; do + mv $prog $prog.x86_64 +done + +make clean +make CC="/opt/homebrew/bin/gcc-11" CFLAGS="-O3 -arch arm64 -mmacosx-version-min=11.3 -DMACOSX_DEPLOYMENT_TARGET=11.3" CXX="/opt/homebrew/bin/g++-11" CXXFLAGS="-O3 -arch arm64 -mmacosx-version-min=11.3 -DMACOSX_DEPLOYMENT_TARGET=11.3" LIBS="-lm -static-libgcc" +for prog in $progs; do + mv $prog $prog.arm64 +done + + +set $progs +for prog in $progs; do + lipo -create $prog.x86_64 $prog.arm64 -output $prog + cp $prog ../binaries +done diff --git a/mafft/src/mafft-7.487-with-extensions/license b/mafft/src/mafft-7.487-with-extensions/license new file mode 100644 index 0000000000..6d25e2715c --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/license @@ -0,0 +1,48 @@ +============================================================ + +If you have the './extensions' directory, please also see +license.extensions file. + +============================================================ + +The codes in the './core' directory is distributed with +the BSD license. + +MAFFT: multiple sequence alignment program +Copyright (c) 2009 Kazutaka Katoh + +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. + +The name of the author may not be used to endorse +or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 +AUTHOR 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/mafft/src/mafft-7.487-with-extensions/readme b/mafft/src/mafft-7.487-with-extensions/readme new file mode 100644 index 0000000000..6f040c4bdb --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/readme @@ -0,0 +1,131 @@ +----------------------------------------------------------------------- + MAFFT: a multiple sequence alignment program + version 7.487, 2021/Jul/25 + + http://mafft.cbrc.jp/alignment/software/ + katoh@ifrec.osaka-u.ac.jp +----------------------------------------------------------------------- + +1. COMPILE + % cd core + % make clean + % make + % cd .. + + If you have the './extensions' directory, which is for RNA alignments, + % cd extensions + % make clean + % make + % cd .. + + +2. INSTALL (select 2a or 2b) +2a. Install to /usr/local/ using root account + # cd core + # make install + # cd .. + + If you have the './extensions' directory, + # cd extensions + # make install + # cd .. + + By this procedure (2a), programs are installed into + /usr/local/bin/. Some binaries, which are not directly + used by a user, are installed into /usr/local/libexec/mafft/. + + If the MAFFT_BINARIES environment variable is set to /somewhare/else/, + the binaries in the /somewhere/else/ directory are used, instead + of those in /usr/local/libexec/mafft/. + +2b. Install to non-default location (root account is not necessary) + % cd core/ + Edit the first line of Makefile + From: + PREFIX = /usr/local + To: + PREFIX = /home/your_home/somewhere + + Edit the third line of Makefile + From: + BINDIR = $(PREFIX)/bin + To: + BINDIR = /home/your_home/bin + (or elsewhere in your command-search path) + % make clean + % make + % make install + + If you have the './extensions' directory, + % cd ../extensions/ + Edit the first line of Makefile + From: + PREFIX = /usr/local + To: + PREFIX = /home/your_home/somewhere + % make clean + % make + % make install + + The MAFFT_BINARIES environment variable *must not be* set. + + If the MAFFT_BINARIES environment variable is set to /somewhare/else/, + it overrides the setting of PREFIX (/home/your_home/somewhere/ in the + above example) in Makefile. + +3. CHECK + % cd test + % rehash # if necessary + % mafft sample > test.fftns2 # FFT-NS-2 + % mafft --maxiterate 100 sample > test.fftnsi # FFT-NS-i + % mafft --globalpair sample > test.gins1 # G-INS-1 + % mafft --globalpair --maxiterate 100 sample > test.ginsi # G-INS-i + % mafft --localpair sample > test.lins1 # L-INS-1 + % mafft --localpair --maxiterate 100 sample > test.linsi # L-INS-i + % diff test.fftns2 sample.fftns2 + % diff test.fftnsi sample.fftnsi + % diff test.gins1 sample.gins1 + % diff test.ginsi sample.ginsi + % diff test.lins1 sample.lins1 + + If you have the './extensions' directory, + % mafft-qinsi samplerna > test.qinsi # Q-INS-i + % mafft-xinsi samplerna > test.xinsi # X-INS-i + % diff test.qinsi samplerna.qinsi + % diff test.xinsi samplerna.xinsi + + If you use the multithread version, the results of iterative refinement + methods (*-*-i) are not always identical. Try this test with the single- + thread mode (--thread 0). + + +4. INPUT FORMAT + fasta format. + + The type of input sequences (nucleotide or amino acid) is + automatically recognized based on the frequency of A, T, G, C, U and N. + + +5. USAGE + % /usr/local/bin/mafft input > output + +See also http://mafft.cbrc.jp/alignment/software/ + + +6. UNINSTALL + # rm -r /usr/local/libexec/mafft + # rm /usr/local/bin/mafft + # rm /usr/local/bin/fftns + # rm /usr/local/bin/fftnsi + # rm /usr/local/bin/nwns + # rm /usr/local/bin/nwnsi + # rm /usr/local/bin/linsi + # rm /usr/local/bin/ginsi + # rm /usr/local/bin/mafft-* + # rm /usr/local/share/man/man1/mafft* + + +7. LICENSE + See the './license' file. + + If you have the extensions, see also the './license.extensions' file, diff --git a/mafft/src/mafft-7.487-with-extensions/scripts/.gitkeep b/mafft/src/mafft-7.487-with-extensions/scripts/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample b/mafft/src/mafft-7.487-with-extensions/test/sample new file mode 100644 index 0000000000..e323c25acf --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample @@ -0,0 +1,285 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +MNGTEGDNFYVPFSNKTGLARSPYEYPQYYLAEPWKYSALAAYMFFLILVGFPVNFLTLF +VTVQHKKLRTPLNYILLNLAMANLFMVLFGFTVTMYTSMNGYFVFGPTMCSIEGFFATLG +GEVALWSLVVLAIERYIVICKPMGNFRFGNTHAIMGVAFTWIMALACAAPPLVGWSRYIP +EGMQCSCGPDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTVKEAAAAQQES +ASTQKAEKEVTRMVVLMVIGFLVCWVPYASVAFYIFTHQGSDFGATFMTLPAFFAKSSAL +YNPVIYILMNKQFRNCMITTLCCGKNPLGDDESGASTSKTEVSSVSTSPVSPA +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +MNGTEGPNFYVPFSNITGVVRSPFEQPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLY +VTVQHKKLRTPLNYILLNLAVADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLG +GEIGLWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLVGWSRYIP +EGMQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQES +ATTQKAEKEVTRMVIIMVIFFLICWLPYASVAMYIFTHQGSNFGPIFMTLPAFFAKTASI +YNPIIYIMMNKQFRNCMLTSLCCGKNPLGDDEASATASKTETSQVAPA +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +MNGTEGINFYVPMSNKTGVVRSPFEYPQYYLAEPWKYRLVCCYIFFLISTGLPINLLTLL +VTFKHKKLRQPLNYILVNLAVADLFMACFGFTVTFYTAWNGYFVFGPVGCAVEGFFATLG +GQVALWSLVVLAIERYIVVCKPMGNFRFSATHAMMGIAFTWVMAFSCAAPPLFGWSRYMP +EGMQCSCGPDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKVREAAAQQQES +ATTQKAEKEVTRMVILMVLGFMLAWTPYAVVAFWIFTNKGADFTATLMAVPAFFSKSSSL +YNPIIYVLMNKQFRNCMITTICCGKNPFGDEDVSSTVSQSKTEVSSVSSSQVSPA +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +MNGTEGKNFYVPMSNRTGLVRSPFEYPQYYLAEPWQFKILALYLFFLMSMGLPINGLTLV +VTAQHKKLRQPLNFILVNLAVAGTIMVCFGFTVTFYTAINGYFVLGPTGCAVEGFMATLG +GEVALWSLVVLAIERYIVVCKPMGSFKFSSSHAFAGIAFTWVMALACAAPPLFGWSRYIP +EGMQCSCGPDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTVKAAAAQQQDS +ASTQKAEREVTKMVILMVFGFLIAWTPYATVAAWIFFNKGADFSAKFMAIPAFFSKSSAL +YNPVIYVLLNKQFRNCMLTTIFCGKNPLGDDESSTVSTSKTEVSSVSPA +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +MNGTEGNNFYVPLSNRTGLVRSPFEYPQYYLAEPWQFKLLAVYMFFLICLGLPINGLTLI +CTAQHKKLRQPLNFILVNLAVAGAIMVCFGFTVTFYTAINGYFALGPTGCAVEGFMATLG +GEVALWSLVVLAIERYIVVCKPMGSFKFSSTHASAGIAFTWVMAMACAAPPLVGWSRYIP +EGIQCSCGPDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTVKAAAAQQQDS +ASTQKAEREVTKMVILMVLGFLVAWTPYATVAAWIFFNKGAAFSAQFMAIPAFFSKTSAL +YNPVIYVLLNKQFRSCMLTTLFCGKNPLGDEESSTVSTSKTEVSSVSPA +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +MKQVPEFHEDFYIPIPLDINNLSAYSPFLVPQDHLGNQGIFMAMSVFMFFIFIGGASINI +LTILCTIQFKKLRSHLNYILVNLSIANLFVAIFGSPLSFYSFFNRYFIFGATACKIEGFL +ATLGGMVGLWSLAVVAFERWLVICKPLGNFTFKTPHAIAGCILPWISALAASLPPLFGWS +RYIPEGLQCSCGPDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITLKLAAKA +QADSASTQKAEREVTKMVVVMVLGFLVCWAPYASFSLWIVSHRGEEFDLRMATIPSCLSK +ASTVYNPVIYVLMNKQFRSCMMKMVCGKNIEEDEASTSSQVTQVSSVAPEK +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +MRKMSEEEFYLFKNISSVGPWDGPQYHIAPVWAFYLQAAFMGTVFLIGFPLNAMVLVATL +RYKKLRQPLNYILVNVSFGGFLLCIFSVFPVFVASCNGYFVFGRHVCALEGFLGTVAGLV +TGWSLAFLAFERYIVICKPFGNFRFSSKHALTVVLATWTIGIGVSIPPFFGWSRFIPEGL +QCSCGPDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRALKAVAAQQQESATT +QKAEREVSRMVVVMVGSFCVCYVPYAAFAMYMVNNRNHGLDLRLVTIPSFFSKSACIYNP +IIYCFMNKQFQACIMKMVCGKAMTDESDTCSSQKTEVSTVSSTQVGPN +> 8=opsin, greensensitive human (fragment) S07060 +DLAETVIASTISIVNQVSGYFVLGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKP +FGNVRFDAKLAIVGIAFSWIWAAVWTAPPIFGWSRYWPHGLKTSCGPDVFSGSSYPGVQS +YMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESESTQKAEKEVTRMVVVMVLAFC +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWSLQRLAGRHPQDSYEDSTQSSIFTYTNSNSTRGPFEGPNYHIAPRWVYHLTSVWM +IFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIASTISVVNQVYGYFV +LGHPMCVLEGYTVSLCGITGLWSLAIISWERWMVVCKPFGNVRFDAKLAIVGIAFSWIWA +AVWTAPPIFGWSRYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYL +QVWLAIRAVAKQQKESESTQKAEKEVTRMVVVMVLAFCFCWGPYAFFACFAAANPGYPFH +PLMAALPAFFAKSATIYNPVIYVFMNRQFRNCILQLFGKKVDDGSELSSASKTEVSSVSS +VSPA +> 10== Z68193 1 human Red Opsin <>[] +MAQQWSLQRLAGRHPQDSYEDSTQSSIFTYTNSNSTRGPFEGPNYHIAPRWVYHLTSVWM +IFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIASTISIVNQVSGYFV +LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGNVRFDAKLAIVGIAFSWIWS +AVWTAPPIFGWSRYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYL +QVWLAIRAVAKQQKESESTQKAEKEVTRMVVVMIFAYCVCWGPYTFFACFAAANPGYAFH +PLMAALPAYFAKSATIYNPVIYVFMNRQFRNCILQLFGKKVDDGSELSSASKTEVSSVSS +VSPA +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDDDDTTRGSVFTYTNTNNTRGPFEGPNYHIAPRWVYNLVSFFMI +IVVIASCFTNGLVLVATAKFKKLRHPLNWILVNLAFVDLVETLVASTISVFNQIFGYFIL +GHPLCVIEGYVVSSCGITGLWSLAIISWERWFVVCKPFGNIKFDSKLAIIGIVFSWVWAW +GWSAPPIFGWSRYWPHGLKTSCGPDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQ +VWMAIRAVAAQQKESESTQKAEREVSRMVVVMIVAFCICWGPYASFVSFAAANPGYAFHP +LAAALPAYFAKSATIYNPVIYVFMNRQFRNCIMQLFGKKVDDGSEASTTSRTEVSSVSNS +SVAPA +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MAAWEAAFAARRRHEEEDTTRDSVFTYTNSNNTRGPFEGPNYHIAPRWVYNLTSVWMIFV +VAASVFTNGLVLVATWKFKKLRHPLNWILVNLAVADLGETVIASTISVINQISGYFILGH +PMCVVEGYTVSACGITALWSLAIISWERWFVVCKPFGNIKFDGKLAVAGILFSWLWSCAW +TAPPIFGWSRYWPHGLKTSCGPDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVW +LAIRAVAAQQKESESTQKAEKEVSRMVVVMIVAYCFCWGPYTFFACFAAANPGYAFHPLA +AALPAYFAKSATIYNPIIYVFMNRQFRNCILQLFGKKVDDGSEVSTSRTEVSSVSNSSVS +PA +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +MSSNSSQAPPNGTPGPFDGPQWPYQAPQSTYVGVAVLMGTVVACASVVNGLVIVVSICYK +KLRSPLNYILVNLAVADLLVTLCGSSVSLSNNINGFFVFGRRMCELEGFMVSLTGIVGLW +SLAILALERYVVVCKPLGDFQFQRRHAVSGCAFTWGWALLWSAPPLLGWSSYVPEGLRTS +CGPNWYTGGSNNNSYILSLFVTCFVLPLSLILFSYTNLLLTLRAAAAQQKEADTTQRAER +EVTRMVIVMVMAFLLCWLPYSTFALVVATHKGIIIQPVLASLPSYFSKTATVYNPIIYVF +MNKQFQSCLLEMLCCGYQPQRTGKASPGTPGPHADVTAAGLRNKVMPAHPV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +MESGNVSSSLFGNVSTALRPEARLSAETRLLGWNVPPEELRHIPEHWLTYPEPPESMNYL +LGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINLAFCDFMMMVKTPIFIYNSFH +QGYALGHLGCQIFGIIGSYTGIAAGATNAFIAYDRFNVITRPMEGKMTHGKAIAMIIFIY +MYATPWVVACYTETWGRFVPEGYLTSCTFDYLTDNFDTRLFVACIFFFSFVCPTTMITYY +YSQIVGHVFSHEKALRDQAKKMNVESLRSNVDKNKETAEIRIAKAAITICFLFFCSWTPY +GVMSLIGAFGDKTLLTPGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCPWLALNE +KAPESSAVASTSTTQEPQQTTAA +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +MEYHNVSSVLGNVSSVLRPDARLSAESRLLGWNVPPDELRHIPEHWLIYPEPPESMNYLL +GTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINLAFCDFMMMIKTPIFIYNSFHQ +GYALGHLGCQIFGVIGSYTGIAAGATNAFIAYDRYNVITRPMEGKMTHGKAIAMIIFIYL +YATPWVVACYTESWGRFVPEGYLTSCTFDYLTDNFDTRLFVACIFFFSFVCPTTMITYYY +SQIVGHVFSHEKALRDQAKKMNVDSLRSNVDKSKEAAEIRIAKAAITICFLFFASWTPYG +VMSLIGAFGDKTLLTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCPWLAISEK +APESRAAISTSTTQEQQQTTAA +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +MEPLCNASEPPLRPEARSSGNGDLQFLGWNVPPDQIQYIPEHWLTQLEPPASMHYMLGVF +YIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLKAPIFNSFHRGFAIY +LGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNRNMTFTKAVIMNIIIWLYCT +PWVVLPLTQFWDRFVPEGYLTSCSFDYLSDNFDTRLFVGTIFFFSFVCPTLMILYYYSQI +VGHVFSHEKALREQAKKMNVESLRSNVDKSKETAEIRIAKAAITICFLFFVSWTPYGVMS +LIGAFGDKSLLTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCPWLGVNEKSGE +ISSAQSTTTQEQQQTTAA +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +MDALCNASEPPLRPEARMSSGSDELQFLGWNVPPDQIQYIPEHWLTQLEPPASMHYMLGV +FYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLKAPIFIYNSFHRGF +ALGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNRNMTFTKAVIMNIIIWLYC +TPWVVLPLTQFWDRFVPEGYLTSCSFDYLSDNFDTRLFVGTIFLFSFVVPTLMILYYYSQ +IVGHVFNHEKALREQAKKMNVESLRSNVDKSKETAEIRIAKAAITICFLFFVSWTPYGVM +SLIGAFGDKSLLTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCPWLGVNEKSG +EASSAQSTTTQEQTQQTSAA +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +MTNATGPQMAYYGAASMDFGYPEGVSIVDFVRPEIKPYVHQHWYNYPPVNPMWHYLLGVI +YLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNLALSDLIMLTTNVPFFTYNCFSGGV +WMFSPQYCEIYACLGAITGVCSIWLLCMISFDRYNIICNGFNGPKLTTGKAVVFALISWV +IAIGCALPPFFGWGNYILEGILDSCSYDYLTQDFNTFSYNIFIFVFDYFLPAAIIVFSYV +FIVKAIFAHEAAMRAQAKKMNVSTLRSNEADAQRAEIRIAKTALVNVSLWFICWTPYALI +SLKGVMGDTSGITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLPWFCVHETET +KSNDDSQSNSTVAQDKA +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +MANVTGPQMAFYGSGAATFGYPEGMTVADFVPDRVKHMVLDHWYNYPPVNPMWHYLLGVV +YLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNLALSDLIMLTTNFPPFCYNCFSGGR +WMFSGTYCEIYAALGAITGVCSIWTLCMISFDRYNIICNGFNGPKLTQGKATFMCGLAWV +ISVGWSLPPFFGWGSYTLEGILDSCSYDYFTRDMNTITYNICIFIFDFFLPASVIVFSYV +FIVKAIFAHEAAMRAQAKKMNVTNLRSNEAETQRAEIRIAKTALVNVSLWFICWTPYAAI +TIQGLLGNAEGITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLPWFCVHEKDP +NDVEENQSSNTQTQEKS +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +MESFAVAAAQLGPHFAPLSNGSVVDKVTPDMAHLISPYWNQFPAMDPIWAKILTAYMIMI +GMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITNTPMMGINLYFETWVLGP +MMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGRPMTIPLALGKMYVPEGNLTSC +GIDYLERDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMNVKSL +RSSEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGLFKFEGLTPLNTIWGACFAKS +AACYNPIVYGISHPKYRLALKEKCPCCVFGKVDDGKSSDAQSQATASEAESKA +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +MESFAVAAAQLGPHFAPLSNGSVVDKVTPDMAHLISPYWNQFPAMDPIWAKILTAYMIMI +GMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITNTPMMGINLYFETWVLGP +MMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGRPMTIPLALGKIAYIWFMSSIW +CLAPAFGWSRYVPEGNLTSCGIDYLERDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAA +VSAHEKAMREQAKKMNVKSLRSSEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGL +FKFEGLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVFGKVDDGKSSDA +QSQATASEAESKA +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +MDSFAAVATQLGPQFAAPSNGSVVDKVTPDMAHLISPYWDQFPAMDPIWAKILTAYMIII +GMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITNTPMMGINLYFETWVLGP +MMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGRPMTIPLALGKIAYIWFMSTIW +CCLAPVFGWSRYVPEGNLTSCGIDYLERDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIA +AVSAHEKAMREQAKKMNVKSLRSSEDADKSAEGKLAKVALVTISLWFMAWTPYLVINCMG +LFKFEGLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVFGKVDDGKSSE +AQSQATTSEAESKA +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MERSHLPETPFDLAHSGPRFQAQSSGNGSVLDNVLPDMAHLVNPYWSRFAPMDPMMSKIL +GLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQSPVMIINFYY +ETWVLGPLWCDIYAGCGSLFGCVSIWSMCMIAFDRYNVIVKGINGTPMTIKTSIMKILFI +WMMAVFWTVMPLIGWSAYVPEGNLTACSIDYMTRMWNPRSYLITYSLFVYYTPLFLICYS +YWFIIAAVAAHEKAMREQAKKMNVKSLRSSEDCDKSAEGKLAKVALTTISLWFMAWTPYL +VICYFGLFKIDGLTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCPMCVFGNTD +EPKPDAPASDTETTSEADSKA +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MERSLLPEPPLAMALLGPRFEAQTGGNRSVLDNVLPDMAPLVNPHWSRFAPMDPTMSKIL +GLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQSPVMIINFYY +ETWVLGPLWCDIYAACGSLFGCVSIWSMCMIAFDRYNVIVKGINGTPMTIKTSIMKIAFI +WMMAVFWTIMPLIGWSSYVPEGNLTACSIDYMTRQWNPRSYLITYSLFVYYTPLFMICYS +YWFIIATVAAHEKAMRDQAKKMNVKSLRSSEDCDKSAENKLAKVALTTISLWFMAWTPYL +IICYFGLFKIDGLTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCPMCVCGTTD +EPKPDAPPSDTETTSEAESKD +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +MIAVSGPSYEAFSYGGQARFNNQTVVDKVPPDMLHLIDANWYQYPPLNPMWHGILGFVIG +MLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINLAISNFLMMFCMSPPMVINCYYETWVL +GPLFCQIYAMLGSLFGCGSIWTMTMIAFDRYNVIVKGLSGKPLSINGALIRIIAIWLFSL +GWTIAPMFGWNRYVPEGNMTACGTDYFNRGLLSASYLVCYGIWVYFVPLFLIIYSYWFII +QAVAAHEKNMREQAKKMNVASLRSSENQNTSAECKLAKVALMTISLWFMAWTPYLVINFS +GIFNLVKISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFPSLACAAEPSSDAV +STTSGTTTVTDNEKSNA +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +MANQLSYSSLGWPYQPNASVVDTMPKEMLYMIHEHWYAFPPMNPLWYSILGVAMIILGII +CVLGNGMVIYLMMTTKSLRTPTNLLVVNLAFSDFCMMAFMMPTMTSNCFAETWILGPFMC +EVYGMAGSLFGCASIWSMVMITLDRYNVIVRGMAAAPLTHKKATLLLLFVWIWSGGWTIL +PFFGWSRYVPEGNLTSCTVDYLTKDWSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAE +HEKQLREQAKKMNVASLRANADQQKQSAECRLAKVAMMTVGLWFMAWTPYLIISWAGVFS +SGTRLTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFPSLACGSGESGSDVKSE +ASATTTMEEKPKIPEA +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +MVESTTLVNQTWWYNPTVDIHPHWAKFDPIPDAVYYSVGIFIGVVGIIGILGNGVVIYLF +SKTKSLQTPANMFIINLAMSDLSFSAINGFPLKTISAFMKKWIFGKVACQLYGLLGGIFG +FMSINTMAMISIDRYNVIGRPMAASKKMSHRRAFLMIIFVWMWSIVWSVGPVFNWGAYVP +EGILTSCSFDYLSTDPSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAK +RLNAKELRKAQAGASAEMKLAKISMVIITQFMLSWSPYAIIALLAQFGPAEWVTPYAAEL +PVLFAKASAIHNPIVYSVSHPKFREAIQTTFPWLLTCCQFDEKECEDANDAEEEVVASER +GGESRDAAQMKEMMAMMQKMQAQQAAYQPPPPPQGYPPQGYPPQGAYPPPQGYPPQGYPP +QGYPPQGYPPQGAPPQVEAPQGAPPQGVDNQAYQA +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +MGRDLRDNETWWYNPSIVVHPHWREFDQVPDAVYYSLGIFIGICGIIGCGGNGIVIYLFT +KTKSLQTPANMFIINLAFSDFTFSLVNGFPLMTISCFLKKWIFGFAACKVYGFIGGIFGF +MSIMTMAMISIDRYNVIGRPMAASKKMSHRRAFIMIIFVWLWSVLWAIGPIFGWGAYTLE +GVLCNCSFDYISRDSTTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKR +LNAKELRKAQAGANAEMRLAKISIVIVSQFLLSWSPYAVVALLAQFGPLEWVTPYAAQLP +VMFAKASAIHNPMIYSVSHPKFREAISQTFPWVLTCCQFDDKETEDDKDAETEIPAGESS +DAAPSADAAQMKEMMAMMQKMQQQQAAYPPQGYAPPPQGYPPQGYPPQGYPPQGYPPQGY +PPPPQGAPPQGAPPAAPPQGVDNQAYQA +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +MPHLLSGFLEVTASPAPTWDAPPDNVSGCGEQINYGRVEKVVIGSILTLITLLTIAGNCL +VVISVSFVKKLRQPSNYLIVSLALADLSVAVAVMPFVSVTDLIGGKWIFGHFFCNVFIAM +DVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASITLPPLFGW +AQNVNDDKVCLISQDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPGFPRV +QPESVISLNGVVKLQKEVEECANLSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWL +PFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLLQC +QYRNINRKLSAAGMHEALKLAERPERSEFVLQNSDHCGKKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +MPHLLSGFLEVTASPAPTWDAPPDNVSGCGEQINYGRVEKVVIGSILTLITLLTIAGNCL +VVISVSFVKKLRQPSNYLIVSLALADLSVAVAVMPFVSVTDLIGGKWIFGHFFCNVFIAM +DVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASITLPPLFGW +AQNVNDDKVCLISQDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPGFPRV +QPESVISLNGVVKLQKEVEECANLSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWL +PFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLLQC +QYRNINRKLSAAGMHEALKLAERPERSEFVLQNSDHCGKKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +MDVLSPGQGNNTTSPPAPFETGGNTTGISDVTVSYQVITSLLLGTLIFCAVLGNACVVAA +IALERSLQNVANYLIGSLAVTDLMVSVLVLPMAALYQVLNKWTLGQVTCDLFIALDVLCC +TSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLISIPPMLGWRTPED +RSDPDACTISKDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVKKVEKTGADT +RHGASPAPQPKKSVNGESGSRNWRLGVESKAGGALCANGAVRQGDDGAALEVIEVHRVGN +SKEHLPLPSEAGPTPCAPASFERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLP +FFIVALVLPFCESSCHMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC +RQ +> 33=p A35181 serotonin receptor class 1A - rat +MDVFSFGQGNNTTASQEPFGTGGNVTSISDVTFSYQVITSLLLGTLIFCAVLGNACVVAA +IALERSLQNVANYLIGSLAVTDLMVSVLVLPMAALYQVLNKWTLGQVTCDLFIALDVLCC +TSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLISIPPMLGWRTPED +RSDPDACTISKDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVRKVEKKGAGT +SLGTSSAPPPKKSLNGQPGSGDWRRCAENRAVGTPCTNGAVRQGDDEATLEVIEVHRVGN +SKEHLPLPSESGSNSYAPACLERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLP +FFIVALVLPFCESSCHMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC +RR +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +MANFTFGDLALDVARMGGLASTPSGLRSTGLTTPGLSPTGLVTSDFNDSYGLTGQFINGS +HSSRSRDNASANDTSATNMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAV +MLERSLHNVANYLILSLAVADLMVAVLVMPLSVVSEISKVWFLHSEVCDMWISVDVLCCT +ASILHLVAIAMDRYWAVTSIDYIRRRSARRILLMIMVVWIVALFISIPPLFGWRDPNNDP +DKTGTCIISQDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKTE +ETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENA +NGVNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYSRTREK +LELKRERKAARTLAIITGAFLICWLPFFIIALIGPFVDPEGIPPFARSFVLWLGYFNSLL +NPIIYTIFSPEFRSAFQKILFGKYRRGHR +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +MANFTFGDLALDVARMGGLASTPSGLRSTGLTTPGLSPTGLVTSDFNDSYGLTGQFINGS +HSSRSRDNASANDTSATNMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAV +MLERSLHNVANYLILSLAVADLMVAVLVMPLSVVSEISKVWFLHSEVCDMWISVDVLCCT +ASILHLVAIAMDRYWAVTSIDYIRRRSARRILLMIMVVWIVALFISIPPLFGWRDPNNDP +DKTGTCIISQDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKTE +ETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENA +NGVNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYSRTREK +LELKRERKAARTLAIITGAFLICWLPFFIIALIGPFVDPEGIPPFARSFVLWLGYFNSLL +NPIIYTIFSPEFRSAFQKILFGKYRRGHR +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +MEGAEGQEELDWEALYLRLPLQNCSWNSTGWEPNWNVTVVPNTTWWQASAPFDTPAALVR +AAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSLAVADLLVACLVMPLGAV +YEVVQRWTLGPELCDMWTSGDVLCCTASILHLVAIALDRYWAVTNIDYIHASTAKRVGMM +IACVWTVSFFVCIAQLLGWKDPDWNQRVSEDLRCVVSQDVGYQIFATASSFYVPVLIILI +LYWRIYQTARKRIRRRRGATARGGVGPPPVPAGGALVAGGGSGGIAAAVVAVIGRPLPTI +SETTTTGFTNVSSNNTSPEKQSCANGLEADPPTTGYGAVAAAYYPSLVRRKPKEAADSKR +ERKAAKTLAIITGAFVACWLPFFVLAILVPTCDCEVSPVLTSLSLWLGYFNSTLNPVIYT +VFSPEFRHAFQRLLCGRRVRRRRAPQ diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.dpparttree b/mafft/src/mafft-7.487-with-extensions/test/sample.dpparttree new file mode 100644 index 0000000000..b3242a2b7a --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.dpparttree @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +MN-------------------GTE------GDNFYVPF----------------SNKTGL +-----------ARSPYEYPQY-----YLAEPWK--------------------Y------ +------------------SALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNL +AMANLFMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIER +YIVICKPMGN-FRFGNTHAIMGVAFTWIMALAC-AAPPLVG-W-----SRYIPEGMQCSC +GPDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTV----KE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAAQQ------------------------------------ESASTQKAEKEVTRM +VVLMVIGFLVCWVPYASVAFYIFT-HQGS--DFGATFMTLPAFFAKSSALYNPVIYILMN +KQFRNCMITTLC----C---GKNPLGD-DE--SGASTSKTEV------------------ +------------------------------------------------------------ +---SSVS-------TSPVSP-A---------- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +MN-------------------GTE------GPNFYVPF----------------SNITGV +-----------VRSPFEQPQY-----YLAEPWQ--------------------F------ +------------------SMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNL +AVADLFMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIER +YVVVCKPMSN-FRFGENHAIMGVAFTWVMALAC-AAPPLVG-W-----SRYIPEGMQCSC +GIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTV----KE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------ESATTQKAEKEVTRM +VIIMVIFFLICWLPYASVAMYIFT-HQGS--NFGPIFMTLPAFFAKTASIYNPIIYIMMN +KQFRNCMLTSLC----C---GKNPLGD-DE--ASATASKTE------------------- +------------------------------------------------------------ +--------------TSQVAP-A---------- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +MN-------------------GTE------GINFYVPM----------------SNKTGV +-----------VRSPFEYPQY-----YLAEPWK--------------------Y------ +------------------RLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNL +AVADLFMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIER +YIVVCKPMGN-FRFSATHAMMGIAFTWVMAFSC-AAPPLFG-W-----SRYMPEGMQCSC +GPDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKV----RE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------ESATTQKAEKEVTRM +VILMVLGFMLAWTPYAVVAFWIFT-NKGA--DFTATLMAVPAFFSKSSSLYNPIIYVLMN +KQFRNCMITTIC----C---GKNPFGD-EDVSSTVSQSKTEV------------------ +------------------------------------------------------------ +---SSVS-------SSQVSP-A---------- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +MN-------------------GTE------GKNFYVPM----------------SNRTGL +-----------VRSPFEYPQY-----YLAEPWQ--------------------F------ +------------------KILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNL +AVAGTIMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIER +YIVVCKPMGS-FKFSSSHAFAGIAFTWVMALAC-AAPPLFG-W-----SRYIPEGMQCSC +GPDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTV----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------DSASTQKAEREVTKM +VILMVFGFLIAWTPYATVAAWIFF-NKGA--DFSAKFMAIPAFFSKSSALYNPVIYVLLN +KQFRNCMLTTIF----C---GKNPLGD-DE-SSTVSTSKTEV------------------ +------------------------------------------------------------ +---SS------------VSP-A---------- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +MN-------------------GTE------GNNFYVPL----------------SNRTGL +-----------VRSPFEYPQY-----YLAEPWQ--------------------F------ +------------------KLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNL +AVAGAIMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIER +YIVVCKPMGS-FKFSSTHASAGIAFTWVMAMAC-AAPPLVG-W-----SRYIPEGIQCSC +GPDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTV----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------DSASTQKAEREVTKM +VILMVLGFLVAWTPYATVAAWIFF-NKGA--AFSAQFMAIPAFFSKTSALYNPVIYVLLN +KQFRSCMLTTLF----C---GKNPLGD-EE-SSTVSTSKTEV------------------ +------------------------------------------------------------ +---SS------------VSP-A---------- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +MK-------------------QVPE----FHEDFYIPIPL------------DINNLSAY +-------------SPFLVPQD-----HLGNQGI--------------------F------ +------------------MAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNL +SIANLFVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFER +WLVICKPLGN-FTFKTPHAIAGCILPWISALAA-SLPPLFG-W-----SRYIPEGLQCSC +GPDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITL----KL----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAKAQA------------------------------------DSASTQKAEREVTKM +VVVMVLGFLVCWAPYASFSLWIVS-HRGE--EFDLRMATIPSCLSKASTVYNPVIYVLMN +KQFRSCMM-KMV----C---GKN-IEE-DE--ASTSSQVTQV------------------ +------------------------------------------------------------ +---SS------------VAPEK---------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +MR-------------------KMS------EEEFYL-----------------FKNISSV +-------------GPWDGPQY-----HIAPVWA--------------------F------ +------------------YLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNV +SFGGFLLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFER +YIVICKPFGN-FRFSSKHALTVVLATWTIGIGV-SIPPFFG-W-----SRFIPEGLQCSC +GPDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRAL----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQQ------------------------------------ESATTQKAEREVSRM +VVVMVGSFCVCYVPYAAFAMYMVN-NRNH--GLDLRLVTIPSFFSKSACIYNPIIYCFMN +KQFQACIM-KMV----C---GKA-MTD-ES--DTCSSQKTEV------------------ +------------------------------------------------------------ +---STVS-------STQVGP-N---------- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---DLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WLVVCKPFGN-VRFDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMVLAFC--------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWSLQRLAGRHPQDSYEDSTQ------SSIFTYTN----------------SNST-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------HLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNL +AVADLAETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WMVVCKPFGN-VRFDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMVLAFCFCWGPYAFFACFAAA-NPGY--PFHPLMAALPAFFAKSATIYNPVIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--ELSSASKTEV------------------ +------------------------------------------------------------ +---SSV---------SSVSP-A---------- +> 10== Z68193 1 human Red Opsin <>[] +MAQQWSLQRLAGRHPQDSYEDSTQ------SSIFTYTN----------------SNST-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------HLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNL +AVADLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WLVVCKPFGN-VRFDAKLAIVGIAFSWIWSAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMIFAYCVCWGPYTFFACFAAA-NPGY--AFHPLMAALPAYFAKSATIYNPVIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--ELSSASKTEV------------------ +------------------------------------------------------------ +---SSV---------SSVSP-A---------- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDD-DDTTR------GSVFTYTN----------------TNNT-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------NLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNL +AFVDLVETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWER +WFVVCKPFGN-IKFDSKLAIIGIVFSWVWAWGW-SAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQK------------------------------------ESESTQKAEREVSRM +VVVMIVAFCICWGPYASFVSFAAA-NPGY--AFHPLAAALPAYFAKSATIYNPVIYVFMN +RQFRNCIMQLF---------GKK-VDD-GS--EASTTSRTEV------------------ +------------------------------------------------------------ +---SSVS-------NSSVAP-A---------- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-AWEAAFAARRRHEE--EDTTR------DSVFTYTN----------------SNNT-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------NLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNL +AVADLGETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWER +WFVVCKPFGN-IKFDGKLAVAGILFSWLWSCAW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQK------------------------------------ESESTQKAEKEVSRM +VVVMIVAYCFCWGPYTFFACFAAA-NPGY--AFHPLAAALPAYFAKSATIYNPIIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--EVST-SRTEV------------------ +------------------------------------------------------------ +---SSVS-------NSSVSP-A---------- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +MS-----------------SNSSQ------AP----------------------PNGT-- +------------PGPFDGPQW----PYQAPQST--------------------Y------ +------------------VGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNL +AVADLLVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALER +YVVVCKPLGD-FQFQRRHAVSGCAFTWGWALLW-SAPPLLG-W-----SSYVPEGLRTSC +GPNWYTGGS--NNNSYILSLFVTCFVLPLSLILFSYTNLLLTL----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQK------------------------------------EADTTQRAEREVTRM +VIVMVMAFLLCWLPYSTFALVVAT-HKGI--IIQPVLASLPSYFSKTATVYNPIIYVFMN +KQFQSCLLEMLC----CGYQPQR-TGK-AS--PGTPGPHADV------------------ +------------------------------------------------------------ +---TAAG------LRNKVMP-AH-------PV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +MESGNV---------------SSSLFGNVST-ALRPEARLSA---ETRLLGW-------- +------------NVPPEELR------HIPEHWL-----------TYPEPPESMN------ +------------------YLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINL +AFCDFMMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDR +FNVITRPMEG--KMTHGKAIAMIIFIYMYATPW-VVACYTETW-----GRFVPEGYLTSC +TFDYLT--DNFDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LRDQAKK----------MNVESL----------------RSNVDKNKETAEIRIAKA +AITICFLFFCSWTPYGVMSLIGAF-GDKT--LLTPGATMIPACACKMVACIDPFVYAISH +PRYRMELQKRCP----WLALNEKAPE--SS-AVASTSTTQEP------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +MEYHNV---------------SSVL-GNVSS-VLRPDARLSA---ESRLLGW-------- +------------NVPPDELR------HIPEHWL-----------IYPEPPESMN------ +------------------YLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINL +AFCDFMMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDR +YNVITRPMEG--KMTHGKAIAMIIFIYLYATPW-VVACYTESW-----GRFVPEGYLTSC +TFDYLT--DNFDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LRDQAKK----------MNVDSL----------------RSNVDKSKEAAEIRIAKA +AITICFLFFASWTPYGVMSLIGAF-GDKT--LLTPGATMIPACTCKMVACIDPFVYAISH +PRYRMELQKRCP----WLAISEKAPE--SR-AAISTSTTQEQ------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +ME---------------------PL-CNASEPPLRPEAR-SSGNGDLQFLGW-------- +------------NVPPDQIQ------YIPEHWL-----------TQLEPPASMH------ +------------------YMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNL +AVFDLIMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDR +YNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSC +SFDYLS--DNFDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVESL----------------RSNVDKSKETAEIRIAKA +AITICFLFFVSWTPYGVMSLIGAF-GDKS--LLTQGATMIPACTCKLVACIDPFVYAISH +PRYRLELQKRCP----WLGVNEKSGE--IS-SAQST-TTQEQ------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +MD---------------------AL-CNASEPPLRPEARMSSGSDELQFLGW-------- +------------NVPPDQIQ------YIPEHWL-----------TQLEPPASMH------ +------------------YMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNL +AVFDLIMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDR +YNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSC +SFDYLS--DNFDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVESL----------------RSNVDKSKETAEIRIAKA +AITICFLFFVSWTPYGVMSLIGAF-GDKS--LLTPGATMIPACTCKLVACIEPFVYAISH +PRYRMELQKRCP----WLGVNEKSGE--AS-SAQST-TTQEQ------------------ +------------------------------------------------------------ +--------------TQQTSA-A---------- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +MT-------------------------NATGPQMAYYGAASMD------FGYP-EGVSIV +-----------DFVRPEIKP------YVHQHWY-----------NYPPVNPMWH------ +------------------YLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNL +ALSDLIMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDR +YNIICNGFNG-PKLTTGKAVVFALISWVIAIGC-ALPPFFG-W-----GNYILEGILDSC +SYDYLT--QDFNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRAQAKK----------MNVSTL----------------RS-NEADAQRAEIRIAKT +ALVNVSLWFICWTPYALISLKGVM-GDTS--GITPLVSTLPALLAKSCSCYNPFVYAISH +PKYRLAITQHLP----WFCVHETETKS-ND-DSQSNSTVAQ------------------- +------------------------------------------------------------ +------------------DK-A---------- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +MA-------------------------NVTGPQMAFYGSGAAT------FGYP-EGMTVA +-----------DFVPDRVKH------MVLDHWY-----------NYPPVNPMWH------ +------------------YLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNL +ALSDLIMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDR +YNIICNGFNG-PKLTQGKATFMCGLAWVISVGW-SLPPFFG-W-----GSYTLEGILDSC +SYDYFT--RDMNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRAQAKK----------MNVTNL----------------RS-NEAETQRAEIRIAKT +ALVNVSLWFICWTPYAAITIQGLL-GNAE--GITPLLTTLPALLAKSCSCYNPFVYAISH +PKFRLAITQHLP----WFCVHEKDPND-VE-ENQSSNTQTQ------------------- +------------------------------------------------------------ +------------------EK-S---------- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +ME-------------------SFAVAAAQLGPHFAPLS-----------------NGSVV +-----------DKVTPDMAH------LISPYWN-----------QFPAMDPIWA------ +------------------KILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKM---------------------------YVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDAEKSAEGKLAKV +ALVTITLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-DAQSQATASEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +ME-------------------SFAVAAAQLGPHFAPLS-----------------NGSVV +-----------DKVTPDMAH------LISPYWN-----------QFPAMDPIWA------ +------------------KILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKIAYIWFMSSIW-CLAPAFG-W-----SRYVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDAEKSAEGKLAKV +ALVTITLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-DAQSQATASEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +MD-------------------SFAAVATQLGPQFAAPS-----------------NGSVV +-----------DKVTPDMAH------LISPYWD-----------QFPAMDPIWA------ +------------------KILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKIAYIWFMSTIWCCLAPVFG-W-----SRYVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDADKSAEGKLAKV +ALVTISLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-EAQSQATTSEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MERSH--------------LPETPFDLAHSGPRFQAQSSG---------------NGSVL +-----------DNVLPDMAH------LVNPYWS-----------RFAPMDPMMS------ +------------------KILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNL +AFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDR +YNVIVKGING-TPMTIKTSIMKILFIWMMAVFW-TVMPLIG-W-----SAYVPEGNLTAC +SIDYMT--RMWNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDCDKSAEGKLAKV +ALTTISLWFMAWTPYLVICYFGLF-KI-D--GLTPLTTIWGATFAKTSAVYNPIVYGISH +PKYRIVLKEKCP----MCVFGNTDEPKPDA-PASDTETTSEA------------------ +------------------------------------------------------------ +---D--------------SK-A---------- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MERSL--------------LPEPPLAMALLGPRFEAQTGG---------------NRSVL +-----------DNVLPDMAP------LVNPHWS-----------RFAPMDPTMS------ +------------------KILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNL +AFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDR +YNVIVKGING-TPMTIKTSIMKIAFIWMMAVFW-TIMPLIG-W-----SSYVPEGNLTAC +SIDYMT--RQWNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRDQAKK----------MNVKSL----------------RS-SEDCDKSAENKLAKV +ALTTISLWFMAWTPYLIICYFGLF-KI-D--GLTPLTTIWGATFAKTSAVYNPIVYGISH +PNDRLVLKEKCP----MCVCGTTDEPKPDA-PPSDTETTSEA------------------ +------------------------------------------------------------ +---E--------------SK-D---------- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +MI-------------------------AVSGPSYEAFSYGGQA-----RF----NNQTVV +-----------DKVPPDMLH------LIDANWY-----------QYPPLNPMWH------ +------------------GILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINL +AISNFLMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDR +YNVIVKGLSG-KPLSINGALIRIIAIWLFSLGW-TIAPMFG-W-----NRYVPEGNMTAC +GTDYFN--RGLLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKN----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVASL----------------RS-SENQNTSAECKLAKV +ALMTISLWFMAWTPYLVINFSGIF-NL-V--KISPLFTIWGSLFAKANAVYNPIVYGISH +PKYRAALFAKFP----SLAC-AAEPSS-DA-VSTTSGTTTVT------------------ +------------------------------------------------------------ +---DNEK-----------SN-A---------- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +M---------------------------ANQLSYSSLGWPYQP------------NASVV +-----------DTMPKEMLY------MIHEHWY-----------AFPPMNPLWY------ +------------------SILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNL +AFSDFCMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDR +YNVIVRGMAA-APLTHKKATLLLLFVWIWSGGW-TILPFFG-W-----SRYVPEGNLTSC +TVDYLT--KDWSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQ----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVASL----------------RANADQQKQSAECRLAKV +AMMTVGLWFMAWTPYLIISWAGVF-SSGT--RLTPLATIWGSVFAKANSCYNPIVYGISH +PRYKAALYQRFP----SLACGSGESGS-DV-KSEASATTTME------------------ +------------------------------------------------------------ +---EKPK----------IPE-A---------- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +MVESTTL------------VNQT--------------------------WWY---NPTVD +---------------------------IHPHWA-----------KFDPIPDAVY------ +------------------YSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINL +AMSDLSFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDR +YNVIGRPMAASKKMSHRRAFLMIIFVWMWSIVW-SVGPVFN-W-----GAYVPEGILTSC +SFDYLS--TDPSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MAAMAKR----------LNAKEL----------------R--KAQAGASAEMKLAKI +SMVIITQFMLSWSPYAIIALLAQF-GPAE--WVTPYAAELPVLFAKASAIHNPIVYSVSH +PKFREAIQTTFPWLLTCCQFDEKECED-AN-DAEEEVVASER--GGESRDAAQMKEMMAM +MQKMQAQQAAYQPPPPPQGY--PPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAP +PQVEAPQGAPPQGVDNQAYQ-A---------- +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +MGRDLR-------------DNET--------------------------WWY---NPSIV +---------------------------VHPHWR-----------EFDQVPDAVY------ +------------------YSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINL +AFSDFTFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDR +YNVIGRPMAASKKMSHRRAFIMIIFVWLWSVLW-AIGPIFG-W-----GAYTLEGVLCNC +SFDYIS--RDSTTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MAAMAKR----------LNAKEL----------------R--KAQAGANAEMRLAKI +SIVIVSQFLLSWSPYAVVALLAQF-GPLE--WVTPYAAQLPVMFAKASAIHNPMIYSVSH +PKFREAISQTFPWVLTCCQFDDKETED-DK-DAETEIPAGESSDAAPSADAAQMKEMMAM +MQKMQQQQAAY----PPQGYAPPPQGYPPQGY--PPQGYPPQGYPPQGYPP---PPQGAP +PQ-GAPPAAPPQGVDNQAYQ-A---------- +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +--------------PHLLSGFLEVTASPAPTWD------------APPDNVSGC------ +-------GEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSL +ALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDR +YLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDK--VC +LIS--------QDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF-------- +---------PGF---------------------------------PRVQPESVI------ +----------------SLNGVVK----------------------LQKEVEECAN----- +---LSRLLKH--------------------------------ER-KNISIFKREQKAATT +LGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFN +RDLRPTSRSLLQ--------CQYRNIN----RKLSAAGMHEA------------------ +-LKLA------------------------------------------------------- +---ERPE------RSEFVLQNSDHCGKKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +--------------PHLLSGFLEVTASPAPTWD------------APPDNVSGC------ +-------GEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSL +ALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDR +YLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDK--VC +LIS--------QDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF-------- +---------PGF---------------------------------PRVQPESVI------ +----------------SLNGVVK----------------------LQKEVEECAN----- +---LSRLLKH--------------------------------ER-KNISIFKREQKAATT +LGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFN +RDLRTTYRSLLQ--------CQYRNIN----RKLSAAGMHEA------------------ +-LKLA------------------------------------------------------- +---ERPE------RSEFVLQNSDHCGKKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +M-DVLS-------------PGQ--------GNNTTSPPAPFETG----------GNTTGI +-------------------------SDVTVSYQ--------------------------- +------------------VITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSL +AVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDR +YWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP--EDRSDPD---AC +TIS--------KDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK----------- +----------------------------TVKKVEKTGADTRHGASPAPQPKKSVNGESGS +RNWRLGVESKAGGAL-CANGAVRQGDDGAALEVIEVHRVGNSKEHLPLPSEAGPTPCAP- +----ASFERK-----------NERNA----------------EA-KRKMALARERKTVKT +LGIIMGTFILCWLPFFIVALVLPF-CESSC-HMPTLLGAIINWLGYSNSLLNPVIYAYFN +KDFQNAFKKIIK--------CKFCR----------------------------------- +------------------------------------------------------------ +-------------------------------Q +> 33=p A35181 serotonin receptor class 1A - rat +M-DVFS-------------FGQ--------GNNTTASQEPFGTG----------GNVTSI +-------------------------SDVTFSYQ--------------------------- +------------------VITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSL +AVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDR +YWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP--EDRSDPD---AC +TIS--------KDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK----------- +----------------------------TVRKVEKKGAGTSLGTSSAPPPKKSLNGQPGS +GDWRRCAENRAVGTP-CTNGAVRQGDDEATLEVIEVHRVGNSKEHLPLPSESGSNSYAP- +----ACLERK-----------NERNA----------------EA-KRKMALARERKTVKT +LGIIMGTFILCWLPFFIVALVLPF-CESSC-HMPALLGAIINWLGYSNSLLNPVIYAYFN +KDFQNAFKKIIK--------CKFCR----------------------------------- +------------------------------------------------------------ +-------------------------------R +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +M-ANFT-------------FGDLALDVARMGGLASTPSGLRSTG----------LTTPGL +SPTG------------------LVTSDFNDSYGLTGQFINGSHSSRSRDNASAN-DTSAT +NMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSL +AVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDR +YWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NN--DPDKTGTC +IIS--------QDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLK +TEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKK-------- +--------NRAKKLPENANGVNSNSSSSERLKQIQIE-----------TAEAFANGCAEE +AS-IAMLERQ-CNNGKKISSNDTPYS----------------RT-REKLELKRERKAART +LAIITGAFLICWLPFFIIALIGPF-VDPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFS +PEFRSAFQKILF--------GKYRRG---------------------------------- +------------------------------------------------------------ +------------------------------HR +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +M-ANFT-------------FGDLALDVARMGGLASTPSGLRSTG----------LTTPGL +SPTG------------------LVTSDFNDSYGLTGQFINGSHSSRSRDNASAN-DTSAT +NMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSL +AVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDR +YWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NN--DPDKTGTC +IIS--------QDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLK +TEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKK-------- +--------NRAKKLPENANGVNSNSSSSERLKQIQIE-----------TAEAFANGCAEE +AS-IAMLERQ-CNNGKKISSNDTPYS----------------RT-REKLELKRERKAART +LAIITGAFLICWLPFFIIALIGPF-VDPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFS +PEFRSAFQKILF--------GKYRRG---------------------------------- +------------------------------------------------------------ +------------------------------HR +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +M-EG-A-------------EGQEELD----WEALYLRLPLQNCS----------WNSTGW +EPNW------------------NVTVVPNTTWW----------------QASAPFDTPAA +LVRA--------------AAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSL +AVADLLVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDR +YWAVTN-IDYIHASTAKRVGMMIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDL--RC +VVS--------QDVGYQIFATASSFYVPVLIILILYWRIYQTARKRIRR----------- +----------------------------------RRGATARGGVGPPPVP---------- +-----------------AGGALVAGGGSGGIAAAVVAVIGRP---LPTISETTTTGFTNV +SSNNTSPEKQSCANGLEA---DPPTTGYGAVAAAYYPSLVRRKP-KEAADSKRERKAAKT +LAIITGAFVACWLPFFVLAILVPT-CDCE---VSPVLTSLSLWLGYFNSTLNPVIYTVFS +PEFRHAFQRLLC--------GRRVRRR----R---------------------------- +------------------------------------------------------------ +-----------------------------APQ diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.fftns2 b/mafft/src/mafft-7.487-with-extensions/test/sample.fftns2 new file mode 100644 index 0000000000..0d4f37a3cd --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.fftns2 @@ -0,0 +1,468 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +----------------------------------------MNG----------------T +E--G--DNFYVP----FSNKTGLARSPYEYPQY-------YLAEPWK---------YSAL +AAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNLAMANLFMVLFG-FTVTMYTSM +N-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIERYIVICKPMGN-FRFGNTHAIM +GVAFTWIMALAC-AAPPLVG-W-----SRYIPEGMQCSCGPDYYTLNPNFNNESYVVYMF +VVHFLVPFVIIFFCYGRLLCTV----KEAAAAQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESASTQK------AEKEVTRMVVLMVIGFLVCWVPYASVAFYIFT-H +QGS--DFGATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTLCC--------GKNPL +GDDE--SGASTSKTEVSSVS-TSPVSPA-------------------------------- +--------------------------------------------------------- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +----------------------------------------MNG----------------T +E--G--PNFYVP----FSNITGVVRSPFEQPQY-------YLAEPWQ---------FSML +AAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGG-FTTTLYTSL +H-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIERYVVVCKPMSN-FRFGENHAIM +GVAFTWVMALAC-AAPPLVG-W-----SRYIPEGMQCSCGIDYYTLKPEVNNESFVIYMF +VVHFTIPMIVIFFCYGQLVFTV----KEAAAQQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESATTQK------AEKEVTRMVIIMVIFFLICWLPYASVAMYIFT-H +QGS--NFGPIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSLCC--------GKNPL +GDDE--ASATASKTE------TSQVAPA-------------------------------- +--------------------------------------------------------- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +----------------------------------------MNG----------------T +E--G--INFYVP----MSNKTGVVRSPFEYPQY-------YLAEPWK---------YRLV +CCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNLAVADLFMACFG-FTVTFYTAW +N-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIERYIVVCKPMGN-FRFSATHAMM +GIAFTWVMAFSC-AAPPLFG-W-----SRYMPEGMQCSCGPDYYTHNPDYHNESYVLYMF +VIHFIIPVVVIFFSYGRLICKV----REAAAQQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESATTQK------AEKEVTRMVILMVLGFMLAWTPYAVVAFWIFT-N +KGA--DFTATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTICC--------GKNPF +GDEDVSSTVSQSKTEVSSVS-SSQVSPA-------------------------------- +--------------------------------------------------------- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +----------------------------------------MNG----------------T +E--G--KNFYVP----MSNRTGLVRSPFEYPQY-------YLAEPWQ---------FKIL +ALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNLAVAGTIMVCFG-FTVTFYTAI +N-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGS-FKFSSSHAFA +GIAFTWVMALAC-AAPPLFG-W-----SRYIPEGMQCSCGPDYYTLNPDYNNESYVIYMF +VCHFILPVAVIFFTYGRLVCTV----KAAAAQQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------DSASTQK------AEREVTKMVILMVFGFLIAWTPYATVAAWIFF-N +KGA--DFSAKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTIFC--------GKNPL +GDDE-SSTVSTSKTEVSS------VSPA-------------------------------- +--------------------------------------------------------- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +----------------------------------------MNG----------------T +E--G--NNFYVP----LSNRTGLVRSPFEYPQY-------YLAEPWQ---------FKLL +AVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNLAVAGAIMVCFG-FTVTFYTAI +N-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGS-FKFSSTHASA +GIAFTWVMAMAC-AAPPLVG-W-----SRYIPEGIQCSCGPDYYTLNPEYNNESYVLYMF +ICHFILPVTIIFFTYGRLVCTV----KAAAAQQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------DSASTQK------AEREVTKMVILMVLGFLVAWTPYATVAAWIFF-N +KGA--AFSAQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTLFC--------GKNPL +GDEE-SSTVSTSKTEVSS------VSPA-------------------------------- +--------------------------------------------------------- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +----------------------------------------MKQ----------------V +PEFH--EDFYIPIPLDINNLS--AYSPFLVPQD-------HLGNQGI---------FMAM +SVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNLSIANLFVAIFG-SPLSFYSFF +N-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFERWLVICKPLGN-FTFKTPHAIA +GCILPWISALAA-SLPPLFG-W-----SRYIPEGLQCSCGPDWYTTNNKYNNESYVMFLF +CFCFAVPFGTIVFCYGQLLITL----KLAAKAQA-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------DSASTQK------AEREVTKMVVVMVLGFLVCWAPYASFSLWIVS-H +RGE--EFDLRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMM-KMVC--------GKN-I +EEDE--ASTSSQVTQVSS------VAPEK------------------------------- +--------------------------------------------------------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +----------------------------------------MRK----------------M +S--E--EEFYL-----FKNIS--SVGPWDGPQY-------HIAPVWA---------FYLQ +AAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNVSFGGFLLCIFS-VFPVFVASC +N-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFERYIVICKPFGN-FRFSSKHALT +VVLATWTIGIGV-SIPPFFG-W-----SRFIPEGLQCSCGPDWYTVGTKYRSESYTWFLF +IFCFIVPLSLICFSYTQLLRAL----KAVAAQQQ-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESATTQK------AEREVSRMVVVMVGSFCVCYVPYAAFAMYMVN-N +RNH--GLDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIM-KMVC--------GKA-M +TDES--DTCSSQKTEVSTVS-STQVGPN-------------------------------- +--------------------------------------------------------- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------DLAETVIA-STISIVNQV +S-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGN-VRFDAKLAIV +GIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLM +VTCCITPLSIIVLCYLQVWLAI----RAVAKQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESESTQK------AEKEVTRMVVVMVLAFC----------------- +------------------------------------------------------------ +------------------------------------------------------------ +--------------------------------------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +----------------------------------------MAQQWSLQRLAGRHPQDSYE +DSTQ--SSIFT-----YTNSNS-TRGPFEGPNY-------HIAPRWV---------YHLT +SVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-STISVVNQV +Y-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWMVVCKPFGN-VRFDAKLAIV +GIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLM +VTCCITPLSIIVLCYLQVWLAI----RAVAKQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESESTQK------AEKEVTRMVVVMVLAFCFCWGPYAFFACFAAA-N +PGY--PFHPLMAALPAFFAKSATIYNPVIYVFMNRQFRNCIL-QLF---------GKK-V +DDGS--ELSSASKTEVSSV---SSVSPA-------------------------------- +--------------------------------------------------------- +> 10== Z68193 1 human Red Opsin <>[] +----------------------------------------MAQQWSLQRLAGRHPQDSYE +DSTQ--SSIFT-----YTNSNS-TRGPFEGPNY-------HIAPRWV---------YHLT +SVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-STISIVNQV +S-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGN-VRFDAKLAIV +GIAFSWIWSAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLM +VTCCIIPLAIIMLCYLQVWLAI----RAVAKQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESESTQK------AEKEVTRMVVVMIFAYCVCWGPYTFFACFAAA-N +PGY--AFHPLMAALPAYFAKSATIYNPVIYVFMNRQFRNCIL-QLF---------GKK-V +DDGS--ELSSASKTEVSSV---SSVSPA-------------------------------- +--------------------------------------------------------- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +----------------------------------------MTEAWNVAVFAARRSRDD-D +DTTR--GSVFT-----YTNTNN-TRGPFEGPNY-------HIAPRWV---------YNLV +SFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNLAFVDLVETLVA-STISVFNQI +F-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWERWFVVCKPFGN-IKFDSKLAII +GIVFSWVWAWGW-SAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSVELGCQSFMLTLM +ITCCFLPLFIIIVCYLQVWMAI----RAVAAQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESESTQK------AEREVSRMVVVMIVAFCICWGPYASFVSFAAA-N +PGY--AFHPLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIM-QLF---------GKK-V +DDGS--EASTTSRTEVSSVS-NSSVAPA-------------------------------- +--------------------------------------------------------- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +----------------------------------------MAA-WEAAFAARRRHEE--E +DTTR--DSVFT-----YTNSNN-TRGPFEGPNY-------HIAPRWV---------YNLT +SVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNLAVADLGETVIA-STISVINQI +S-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWERWFVVCKPFGN-IKFDGKLAVA +GILFSWLWSCAW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSDPGVQSYMVVLM +VTCCFFPLAIIILCYLQVWLAI----RAVAAQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------ESESTQK------AEKEVSRMVVVMIVAYCFCWGPYTFFACFAAA-N +PGY--AFHPLAAALPAYFAKSATIYNPIIYVFMNRQFRNCIL-QLF---------GKK-V +DDGS--EVST-SRTEVSSVS-NSSVSPA-------------------------------- +--------------------------------------------------------- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +----------------------------------------MS-----------------S +NSSQ--AP-----------PNG-TPGPFDGPQW------PYQAPQST---------YVGV +AVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNLAVADLLVTLCG-SSVSLSNNI +N-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALERYVVVCKPLGD-FQFQRRHAVS +GCAFTWGWALLW-SAPPLLG-W-----SSYVPEGLRTSCGPNWYTGGSNN--NSYILSLF +VTCFVLPLSLILFSYTNLLLTL----RAAAAQQK-------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------EADTTQR------AEREVTRMVIVMVMAFLLCWLPYSTFALVVAT-H +KGI--IIQPVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLL-EMLCCGY----QPQR-T +GKAS--PGTPGPHADVTAAGLRNKVMPAHPV----------------------------- +--------------------------------------------------------- +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +----------MESGNVSS------------SLFGNVST-ALRP----------------E +ARLS--A----------ETRLLGWNVPPEELR--------HIPEHWLTYPEPPESMNYLL +GTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINLAFCDFMMMVK--TPIFIYNSF +H-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDRFNVITRPMEG--KMTHGKAIA +MIIFIYMYATPW-VVACYTETW-----GRFVPEGYLTSCTFDYLT--DNFDTRLFVACIF +FFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK------------------------- +--------------------------------------------------MN-------- +--VESL------------------------------------------------------ +----------RSNVDKNKET------AEIRIAKAAITICFLFFCSWTPYGVMSLIGAF-G +DKT--LLTPGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCPWLAL---------N +EKAP--ESSAVASTSTTQEP--QQTTAA-------------------------------- +--------------------------------------------------------- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +----------MEYHNVSS------------VL-GNVSS-VLRP----------------D +ARLS--A----------ESRLLGWNVPPDELR--------HIPEHWLIYPEPPESMNYLL +GTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINLAFCDFMMMIK--TPIFIYNSF +H-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDRYNVITRPMEG--KMTHGKAIA +MIIFIYLYATPW-VVACYTESW-----GRFVPEGYLTSCTFDYLT--DNFDTRLFVACIF +FFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK------------------------- +--------------------------------------------------MN-------- +--VDSL------------------------------------------------------ +----------RSNVDKSKEA------AEIRIAKAAITICFLFFASWTPYGVMSLIGAF-G +DKT--LLTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCPWLAI---------S +EKAP--ESRAAISTSTTQEQ--QQTTAA-------------------------------- +--------------------------------------------------------- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +----------ME------------------PL-CNASEPPLRP----------------E +AR-S--SG---N----GDLQFLGWNVPPDQIQ--------YIPEHWLTQLEPPASMHYML +GVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--APIF--NSF +H-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--NMTFTKAVI +MNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSCSFDYLS--DNFDTRLFVGTIF +FFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKK------------------------- +--------------------------------------------------MN-------- +--VESL------------------------------------------------------ +----------RSNVDKSKET------AEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-G +DKS--LLTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCPWLGV---------N +EKSG--EISSAQST-TTQEQ--QQTTAA-------------------------------- +--------------------------------------------------------- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +----------MD------------------AL-CNASEPPLRP----------------E +ARMS--SG---S----DELQFLGWNVPPDQIQ--------YIPEHWLTQLEPPASMHYML +GVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--APIFIYNSF +H-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--NMTFTKAVI +MNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSCSFDYLS--DNFDTRLFVGTIF +LFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKK------------------------- +--------------------------------------------------MN-------- +--VESL------------------------------------------------------ +----------RSNVDKSKET------AEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-G +DKS--LLTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCPWLGV---------N +EKSG--EASSAQST-TTQEQ-TQQTSAA-------------------------------- +--------------------------------------------------------- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +--------------------------------MTNATGPQMAY----------------Y +GAAS--MD-FGY----PEGVSIVDFVRPEIKP--------YVHQHWYNYPPVNPMWHYLL +GVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNLALSDLIMLTTN-VPFFTYNCF +SGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDRYNIICNGFNG-PKLTTGKAVV +FALISWVIAIGC-ALPPFFG-W-----GNYILEGILDSCSYDYLT--QDFNTFSYNIFIF +VFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKK------------------------- +--------------------------------------------------MN-------- +--VSTL------------------------------------------------------ +----------RS-NEADAQR------AEIRIAKTALVNVSLWFICWTPYALISLKGVM-G +DTS--GITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLPWFCV------HE-T +ETKS--NDDSQSNSTVAQDK-A-------------------------------------- +--------------------------------------------------------- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +--------------------------------MANVTGPQMAF----------------Y +GSGA--AT-FGY----PEGMTVADFVPDRVKH--------MVLDHWYNYPPVNPMWHYLL +GVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNLALSDLIMLTTN-FPPFCYNCF +SGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDRYNIICNGFNG-PKLTQGKATF +MCGLAWVISVGW-SLPPFFG-W-----GSYTLEGILDSCSYDYFT--RDMNTITYNICIF +IFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKK------------------------- +--------------------------------------------------MN-------- +--VTNL------------------------------------------------------ +----------RS-NEAETQR------AEIRIAKTALVNVSLWFICWTPYAAITIQGLL-G +NAE--GITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLPWFCV------HE-K +DPND--VEENQSSNTQTQEK-S-------------------------------------- +--------------------------------------------------------- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +----------ME----SF------------AVAAAQLGPHFAP----------------L +S-----------------NGSVVDKVTPDMAH--------LISPYWNQFPAMDPIWAKIL +TAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLY +F-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RPMTIPLALG +KM---------------------------YVPEGNLTSCGIDYLE--RDWNPRSYLIFYS +IFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------------------------- +--------------------------------------------------MN-------- +--VKSL------------------------------------------------------ +----------RS-SEDAEKS------AEGKLAKVALVTITLWFMAWTPYLVINCMGLF-K +F-E--GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------GK-V +DDGK--SSDAQSQA-TASEA-ESKA----------------------------------- +--------------------------------------------------------- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +----------ME----SF------------AVAAAQLGPHFAP----------------L +S-----------------NGSVVDKVTPDMAH--------LISPYWNQFPAMDPIWAKIL +TAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLY +F-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RPMTIPLALG +KIAYIWFMSSIW-CLAPAFG-W-----SRYVPEGNLTSCGIDYLE--RDWNPRSYLIFYS +IFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------------------------- +--------------------------------------------------MN-------- +--VKSL------------------------------------------------------ +----------RS-SEDAEKS------AEGKLAKVALVTITLWFMAWTPYLVINCMGLF-K +F-E--GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------GK-V +DDGK--SSDAQSQA-TASEA-ESKA----------------------------------- +--------------------------------------------------------- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +----------MD----SF------------AAVATQLGPQFAA----------------P +S-----------------NGSVVDKVTPDMAH--------LISPYWDQFPAMDPIWAKIL +TAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLY +F-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RPMTIPLALG +KIAYIWFMSTIWCCLAPVFG-W-----SRYVPEGNLTSCGIDYLE--RDWNPRSYLIFYS +IFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------------------------- +--------------------------------------------------MN-------- +--VKSL------------------------------------------------------ +----------RS-SEDADKS------AEGKLAKVALVTISLWFMAWTPYLVINCMGLF-K +F-E--GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------GK-V +DDGK--SSEAQSQA-TTSEA-ESKA----------------------------------- +--------------------------------------------------------- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +-----MERSHLP----ET------------PFDLAHSGPRFQA----------------Q +SSG---------------NGSVLDNVLPDMAH--------LVNPYWSRFAPMDPMMSKIL +GLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-SPVMIINFY +Y-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDRYNVIVKGING-TPMTIKTSIM +KILFIWMMAVFW-TVMPLIG-W-----SAYVPEGNLTACSIDYMT--RMWNPRSYLITYS +LFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKK------------------------- +--------------------------------------------------MN-------- +--VKSL------------------------------------------------------ +----------RS-SEDCDKS------AEGKLAKVALTTISLWFMAWTPYLVICYFGLF-K +I-D--GLTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCPMCVF------GN-T +DEPK--PDAPASDTETTSEA-DSKA----------------------------------- +--------------------------------------------------------- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +-----MERSLLP----EP------------PLAMALLGPRFEA----------------Q +TGG---------------NRSVLDNVLPDMAP--------LVNPHWSRFAPMDPTMSKIL +GLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-SPVMIINFY +Y-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDRYNVIVKGING-TPMTIKTSIM +KIAFIWMMAVFW-TIMPLIG-W-----SSYVPEGNLTACSIDYMT--RQWNPRSYLITYS +LFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKK------------------------- +--------------------------------------------------MN-------- +--VKSL------------------------------------------------------ +----------RS-SEDCDKS------AENKLAKVALTTISLWFMAWTPYLIICYFGLF-K +I-D--GLTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCPMCVC------GT-T +DEPK--PDAPPSDTETTSEA-ESKD----------------------------------- +--------------------------------------------------------- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +--------------------------------MIAVSGPSYEA----------------F +SYGG--QARF-------NNQTVVDKVPPDMLH--------LIDANWYQYPPLNPMWHGIL +GFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINLAISNFLMMFCM-SPPMVINCY +Y-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDRYNVIVKGLSG-KPLSINGALI +RIIAIWLFSLGW-TIAPMFG-W-----NRYVPEGNMTACGTDYFN--RGLLSASYLVCYG +IWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKK------------------------- +--------------------------------------------------MN-------- +--VASL------------------------------------------------------ +----------RS-SENQNTS------AECKLAKVALMTISLWFMAWTPYLVINFSGIF-N +L-V--KISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFPSLAC-------A-A +EPSS--DAVSTTSGTTTVTD-NEKSNA--------------------------------- +--------------------------------------------------------- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +----------------------------------MANQLSYSS----------------L +GWPY--QP----------NASVVDTMPKEMLY--------MIHEHWYAFPPMNPLWYSIL +GVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNLAFSDFCMMAFM-MPTMTSNCF +A-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDRYNVIVRGMAA-APLTHKKATL +LLLFVWIWSGGW-TILPFFG-W-----SRYVPEGNLTSCTVDYLT--KDWSSASYVVIYG +LAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKK------------------------- +--------------------------------------------------MN-------- +--VASL------------------------------------------------------ +----------RANADQQKQS------AECRLAKVAMMTVGLWFMAWTPYLIISWAGVF-S +SGT--RLTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFPSLAC------GS-G +ESGS--DVKSEASATTTMEE-KPKIPEA-------------------------------- +--------------------------------------------------------- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +---------------------------------------MVES----------------T +TLVN--QT-WWY------NPTVD------------------IHPHWAKFDPIPDAVYYSV +GIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINLAMSDLSFSAINGFPLKTISAF +M-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDRYNVIGRPMAASKKMSHRRAFL +MIIFVWMWSIVW-SVGPVFN-W-----GAYVPEGILTSCSFDYLS--TDPSTRSFILCMY +FCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKR------------------------- +--------------------------------------------------LN-------- +--AKEL------------------------------------------------------ +----------R--KAQAGAS------AEMKLAKISMVIITQFMLSWSPYAIIALLAQF-G +PAE--WVTPYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQTTFPWLLTCCQFDEKE-C +EDAN--DAEEEVVASER--G-GESRDAAQMKEMMAMMQKMQAQQAAYQPPPPPQGY--PP +QGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAPPQVEAPQGAPPQGVDNQAYQA +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +----------------------------------------MGR----------------D +LRDN--ET-WWY------NPSIV------------------VHPHWREFDQVPDAVYYSL +GIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINLAFSDFTFSLVNGFPLMTISCF +L-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDRYNVIGRPMAASKKMSHRRAFI +MIIFVWLWSVLW-AIGPIFG-W-----GAYTLEGVLCNCSFDYIS--RDSTTRSNILCMF +ILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKR------------------------- +--------------------------------------------------LN-------- +--AKEL------------------------------------------------------ +----------R--KAQAGAN------AEMRLAKISIVIVSQFLLSWSPYAVVALLAQF-G +PLE--WVTPYAAQLPVMFAKASAIHNPMIYSVSHPKFREAISQTFPWVLTCCQFDDKE-T +EDDK--DAETEIPAGESSDA-APSADAAQMKEMMAMMQKMQQQQAAY----PPQGYAPPP +QGYPPQGY--PPQGYPPQGYPPQGYPP---PPQGAPPQ-GAPPAAPPQGVDNQAYQA +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +------------------------------------------------------------ +------MPHLLS---GFLEVTASPAPTWDAPPDNVSGCGEQIN--------YGRVEKVVI +GSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-MPFVSVTDL +IGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAK +MILSVWLLSASI-TLPPLFG-W-----AQNVNDDKVCLISQDF----------GYTIYST +AVAFYIPMSVMLFMYYQIY-------KAARKSAAKHKF---------------------- +---------------------------------PGFPRV----QPESVISLNG------- +--VVKL----------------------QK---------EVEECAN-------------- +----LSRLLKHERKNISIFK------REQKAATTLGIIVGAFTVCWLPFFLLSTARPFIC +GTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLLQCQYR----NINR-- +------KLSAAGMHEALKLAERPERSEF------------VLQNSDH------------- +--------------------------------------------CGKKGHDT----- +> 31=p A47425 serotonin receptor 5HT-7 - rat +------------------------------------------------------------ +------MPHLLS---GFLEVTASPAPTWDAPPDNVSGCGEQIN--------YGRVEKVVI +GSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-MPFVSVTDL +IGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAK +MILSVWLLSASI-TLPPLFG-W-----AQNVNDDKVCLISQDF----------GYTIYST +AVAFYIPMSVMLFMYYQIY-------KAARKSAAKHKF---------------------- +---------------------------------PGFPRV----QPESVISLNG------- +--VVKL----------------------QK---------EVEECAN-------------- +----LSRLLKHERKNISIFK------REQKAATTLGIIVGAFTVCWLPFFLLSTARPFIC +GTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLLQCQYR----NINR-- +------KLSAAGMHEALKLAERPERSEF------------VLQNSDH------------- +--------------------------------------------CGKKGHDT----- +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +----------MDVLSP-------------------------------------------- +---------------GQGNNTTSPPAPFET-GGNTTGISDVT---------VSYQ--VIT +SLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-LPMAALYQV +L-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAA +LISLTWLIGFLI-SIPPMLG-WRTPEDRSDPD---ACTISKDH----------GYTIYST +FGAFYIPLLLMLVLYGRIF-------RAARFRIRK------------------------- +--------------TVKKVEKTGADTRHGASPAPQPKKS-----------VNGESGSR-- +-------NWRLGVESKAGGALCANGAVRQGDDGAALEVIEVHRVGNSKEHLPLPSEAG-- +PTPCAPASFERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-C +ESSC-HMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC----RQ---- +------------------------------------------------------------ +--------------------------------------------------------- +> 33=p A35181 serotonin receptor class 1A - rat +----------MDVFSF-------------------------------------------- +---------------GQGNNTTASQEPFGT-GGNVTSISDVT---------FSYQ--VIT +SLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-LPMAALYQV +L-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAA +LISLTWLIGFLI-SIPPMLG-WRTPEDRSDPD---ACTISKDH----------GYTIYST +FGAFYIPLLLMLVLYGRIF-------RAARFRIRK------------------------- +--------------TVRKVEKKGAGTSLGTSSAPPPKKS-----------LNGQPGSG-- +-------DWRRCAENRAVGTPCTNGAVRQGDDEATLEVIEVHRVGNSKEHLPLPSESG-- +SNSYAPACLERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-C +ESSC-HMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC----RR---- +------------------------------------------------------------ +--------------------------------------------------------- +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +MANFTFGDLALDVARMG-----GLASTPSGLRSTGLTTPGLSPTGLV------------T +SDFN--DSYGLT---GQFINGSHSSRSRDNASANDTSATNMTDDRYWSLTVYSHEHLVLT +SVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-MPLSVVSEI +S-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRRRSARRILL +MIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIISQDK----------GYTIFST +VGAFYLPMLVMMIIYIRIW-------LVARSRIRKDKFQMTKARLKTEETTLVASPKTEY +SVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVNSNSSS--- +-------SERLKQIQIETAEAFANGCA----EEASIAMLERQ-CNNGKKISSNDTPYS-- +-----------RTREKLELK------RERKAARTLAIITGAFLICWLPFFIIALIGPF-V +DPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILFGKYR----RGHR-- +------------------------------------------------------------ +--------------------------------------------------------- +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +MANFTFGDLALDVARMG-----GLASTPSGLRSTGLTTPGLSPTGLV------------T +SDFN--DSYGLT---GQFINGSHSSRSRDNASANDTSATNMTDDRYWSLTVYSHEHLVLT +SVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-MPLSVVSEI +S-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRRRSARRILL +MIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIISQDK----------GYTIFST +VGAFYLPMLVMMIIYIRIW-------LVARSRIRKDKFQMTKARLKTEETTLVASPKTEY +SVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVNSNSSS--- +-------SERLKQIQIETAEAFANGCA----EEASIAMLERQ-CNNGKKISSNDTPYS-- +-----------RTREKLELK------RERKAARTLAIITGAFLICWLPFFIIALIGPF-V +DPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILFGKYR----RGHR-- +------------------------------------------------------------ +--------------------------------------------------------- +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +-MEGAEGQEELDWEAL-------YLRLP--LQNCSWNSTGWEPNWNV------------T +VVPN--TTWW------------QASAPFDTPAALVRAAAK-------------------- +AVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSLAVADLLVACLV-MPLGAVYEV +V-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDRYWAVTN-IDYIHASTAKRVGM +MIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDLRCVVSQDV----------GYQIFAT +ASSFYVPVLIILILYWRIY-------QTARKRIR-------------------------- +-------------------RRRGATARGGVGPPP---------VPAGGALVAGGGSGGIA +AAVVAVIGRPLPTISETTTTGFTNVSS----NNTSP---EKQSCANGLEADPPTTGYGAV +AAAYYPSLVRRKPKEAADSK------RERKAAKTLAIITGAFVACWLPFFVLAILVPT-C +DCE---VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQRLLCGRRV----RRRR-- +------A---------------PQ------------------------------------ +--------------------------------------------------------- diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.fftnsi b/mafft/src/mafft-7.487-with-extensions/test/sample.fftnsi new file mode 100644 index 0000000000..a8a61ff21f --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.fftnsi @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +----------------------------------------MNG----------------- +TE--GDNFYVP-----FSNKTGLARSPYEYPQY---------------YLAEPWK----- +----YSALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNLAMANLFMVLFG-F +TVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIERYIVICKPMGN-FR +FGNTHAIMGVAFTWIMALAC-AAPPLVG-W-----SRYIPEGMQCSCGPDYYTLNPNFNN +ESYVVYMFVVHFLVPFVIIFFCYGRLLCTV----KEAAAAQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESASTQK------AEKEVTRMVVLMVIGFLVCWVPYASVAFYI +FTHQGS---DFGATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTLCC--------G +KNPLGDDE--SGASTSKTEVSSVS-TSPVSPA---------------------------- +------------------------------------------------------------ +- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +----------------------------------------MNG----------------- +TE--GPNFYVP-----FSNITGVVRSPFEQPQY---------------YLAEPWQ----- +----FSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGG-F +TTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIERYVVVCKPMSN-FR +FGENHAIMGVAFTWVMALAC-AAPPLVG-W-----SRYIPEGMQCSCGIDYYTLKPEVNN +ESFVIYMFVVHFTIPMIVIFFCYGQLVFTV----KEAAAQQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESATTQK------AEKEVTRMVIIMVIFFLICWLPYASVAMYI +FTHQGS---NFGPIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSLCC--------G +KNPLGDDE--ASATASKTE------TSQVAPA---------------------------- +------------------------------------------------------------ +- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +----------------------------------------MNG----------------- +TE--GINFYVP-----MSNKTGVVRSPFEYPQY---------------YLAEPWK----- +----YRLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNLAVADLFMACFG-F +TVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIERYIVVCKPMGN-FR +FSATHAMMGIAFTWVMAFSC-AAPPLFG-W-----SRYMPEGMQCSCGPDYYTHNPDYHN +ESYVLYMFVIHFIIPVVVIFFSYGRLICKV----REAAAQQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESATTQK------AEKEVTRMVILMVLGFMLAWTPYAVVAFWI +FTNKGA---DFTATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTICC--------G +KNPFGDEDVSSTVSQSKTEVSSVS-SSQVSPA---------------------------- +------------------------------------------------------------ +- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +----------------------------------------MNG----------------- +TE--GKNFYVP-----MSNRTGLVRSPFEYPQY---------------YLAEPWQ----- +----FKILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNLAVAGTIMVCFG-F +TVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGS-FK +FSSSHAFAGIAFTWVMALAC-AAPPLFG-W-----SRYIPEGMQCSCGPDYYTLNPDYNN +ESYVIYMFVCHFILPVAVIFFTYGRLVCTV----KAAAAQQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------DSASTQK------AEREVTKMVILMVFGFLIAWTPYATVAAWI +FFNKGA---DFSAKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTIFC--------G +KNPLGDDE-SSTVSTSKTEVSS------VSPA---------------------------- +------------------------------------------------------------ +- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +----------------------------------------MNG----------------- +TE--GNNFYVP-----LSNRTGLVRSPFEYPQY---------------YLAEPWQ----- +----FKLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNLAVAGAIMVCFG-F +TVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGS-FK +FSSTHASAGIAFTWVMAMAC-AAPPLVG-W-----SRYIPEGIQCSCGPDYYTLNPEYNN +ESYVLYMFICHFILPVTIIFFTYGRLVCTV----KAAAAQQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------DSASTQK------AEREVTKMVILMVLGFLVAWTPYATVAAWI +FFNKGA---AFSAQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTLFC--------G +KNPLGDEE-SSTVSTSKTEVSS------VSPA---------------------------- +------------------------------------------------------------ +- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +----------------------------------------MKQ----------------- +VPEFHEDFYIPI-PLDINNLS--AYSPFLVPQD---------------HLGNQGI----- +----FMAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNLSIANLFVAIFG-S +PLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFERWLVICKPLGN-FT +FKTPHAIAGCILPWISALAA-SLPPLFG-W-----SRYIPEGLQCSCGPDWYTTNNKYNN +ESYVMFLFCFCFAVPFGTIVFCYGQLLITL----KLAAKAQA------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------DSASTQK------AEREVTKMVVVMVLGFLVCWAPYASFSLWI +VSHRGE---EFDLRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMM-KMVC--------G +KN-IEEDE--ASTSSQVTQVSS------VAPEK--------------------------- +------------------------------------------------------------ +- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +----------------------------------------MRK----------------- +MS--EEEFYL------FKNIS--SVGPWDGPQY---------------HIAPVWA----- +----FYLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNVSFGGFLLCIFS-V +FPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFERYIVICKPFGN-FR +FSSKHALTVVLATWTIGIGV-SIPPFFG-W-----SRFIPEGLQCSCGPDWYTVGTKYRS +ESYTWFLFIFCFIVPLSLICFSYTQLLRAL----KAVAAQQQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESATTQK------AEREVSRMVVVMVGSFCVCYVPYAAFAMYM +VNNRNH---GLDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIM-KMVC--------G +KA-MTDES--DTCSSQKTEVSTVS-STQVGPN---------------------------- +------------------------------------------------------------ +- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +--------------------------------------------------DLAETVIA-S +TISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGN-VR +FDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGV +QSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RAVAKQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESESTQK------AEKEVTRMVVVMVLAFC------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +----------------------------------------MAQQWSLQRLAGRHPQDSYE +DSTQSSIFTYTN--------SNSTRGPFEGPNY---------------HIAPRWV----- +----YHLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-S +TISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWMVVCKPFGN-VR +FDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGV +QSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RAVAKQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESESTQK------AEKEVTRMVVVMVLAFCFCWGPYAFFACFA +AANPGY---PFHPLMAALPAFFAKSATIYNPVIYVFMNRQFRNCILQLF----------G +KK-VDDGS--ELSSASKTEVSSV---SSVSPA---------------------------- +------------------------------------------------------------ +- +> 10== Z68193 1 human Red Opsin <>[] +----------------------------------------MAQQWSLQRLAGRHPQDSYE +DSTQSSIFTYTN--------SNSTRGPFEGPNY---------------HIAPRWV----- +----YHLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-S +TISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGN-VR +FDAKLAIVGIAFSWIWSAVW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSYPGV +QSYMIVLMVTCCIIPLAIIMLCYLQVWLAI----RAVAKQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESESTQK------AEKEVTRMVVVMIFAYCVCWGPYTFFACFA +AANPGY---AFHPLMAALPAYFAKSATIYNPVIYVFMNRQFRNCILQLF----------G +KK-VDDGS--ELSSASKTEVSSV---SSVSPA---------------------------- +------------------------------------------------------------ +- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +----------------------------------------MTEAWNVAVFAARRSRDD-D +DTTRGSVFTYTN--------TNNTRGPFEGPNY---------------HIAPRWV----- +----YNLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNLAFVDLVETLVA-S +TISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWERWFVVCKPFGN-IK +FDSKLAIIGIVFSWVWAWGW-SAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSVELGC +QSFMLTLMITCCFLPLFIIIVCYLQVWMAI----RAVAAQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESESTQK------AEREVSRMVVVMIVAFCICWGPYASFVSFA +AANPGY---AFHPLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIMQLF----------G +KK-VDDGS--EASTTSRTEVSSVS-NSSVAPA---------------------------- +------------------------------------------------------------ +- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +----------------------------------------MAA-WEAA-FAARRRHEE-E +DTTRDSVFTYTN--------SNNTRGPFEGPNY---------------HIAPRWV----- +----YNLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNLAVADLGETVIA-S +TISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWERWFVVCKPFGN-IK +FDGKLAVAGILFSWLWSCAW-TAPPIFG-W-----SRYWPHGLKTSCGPDVFSGSSDPGV +QSYMVVLMVTCCFFPLAIIILCYLQVWLAI----RAVAAQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------ESESTQK------AEKEVSRMVVVMIVAYCFCWGPYTFFACFA +AANPGY---AFHPLAAALPAYFAKSATIYNPIIYVFMNRQFRNCILQLF----------G +KK-VDDGS--EVST-SRTEVSSVS-NSSVSPA---------------------------- +------------------------------------------------------------ +- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +----------------------------------------MSS----------------- +----NSSQAPPN-G---------TPGPFDGPQWP--------------YQAPQST----- +----YVGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNLAVADLLVTLCG-S +SVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALERYVVVCKPLGD-FQ +FQRRHAVSGCAFTWGWALLW-SAPPLLG-W-----SSYVPEGLRTSCGPNWYTGGS--NN +NSYILSLFVTCFVLPLSLILFSYTNLLLTL----RAAAAQQK------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----------------EADTTQR------AEREVTRMVIVMVMAFLLCWLPYSTFALVV +ATHKGI---IIQPVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLLEMLCC--------G +YQPQRTGKASPGTPGPHADVTAAGLRNKVMPAH--------------------------- +----------------------------------------PV------------------ +- +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +----------MESGN-----VS--------SSLFGNVSTALRP----------------- +EARLSAE-----------TRLLGWNVPPEELR----------------HIPEHWLTYPEP +PESMNYLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINLAFCDFMMMVK--T +PIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDRFNVITRPMEG--K +MTHGKAIAMIIFIYMYATPW-VVACYTETW-----GRFVPEGYLTSCTFDYLT--DNFDT +RLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK----------------- +----------------------------------------------------------MN +-----------VESL--------------------------------------------- +--------------RSNVDKNKET------AEIRIAKAAITICFLFFCSWTPYGVMSLIG +AFGDKT---LLTPGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCPWLAL------ +---NEKAP--ESSAVASTSTTQEP--QQTTAA---------------------------- +------------------------------------------------------------ +- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +----------MEYHN-----VS---------SVLGNVSSVLRP----------------- +DARLSAE-----------SRLLGWNVPPDELR----------------HIPEHWLIYPEP +PESMNYLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINLAFCDFMMMIK--T +PIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDRYNVITRPMEG--K +MTHGKAIAMIIFIYLYATPW-VVACYTESW-----GRFVPEGYLTSCTFDYLT--DNFDT +RLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK----------------- +----------------------------------------------------------MN +-----------VDSL--------------------------------------------- +--------------RSNVDKSKEA------AEIRIAKAAITICFLFFASWTPYGVMSLIG +AFGDKT---LLTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCPWLAI------ +---SEKAP--ESRAAISTSTTQEQ--QQTTAA---------------------------- +------------------------------------------------------------ +- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +----------ME-------------------PLCNASEPPLRP----------------- +EARSSGN---------GDLQFLGWNVPPDQIQ----------------YIPEHWLTQLEP +PASMHYMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--A +PIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--N +MTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSCSFDYLS--DNFDT +RLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKK----------------- +----------------------------------------------------------MN +-----------VESL--------------------------------------------- +--------------RSNVDKSKET------AEIRIAKAAITICFLFFVSWTPYGVMSLIG +AFGDKS---LLTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCPWLGV------ +---NEKSG--EISSAQSTTTQEQ---QQTTAA---------------------------- +------------------------------------------------------------ +- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +----------MD-------------------ALCNASEPPLRP----------------- +EARMSSG--------SDELQFLGWNVPPDQIQ----------------YIPEHWLTQLEP +PASMHYMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--A +PIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--N +MTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSCSFDYLS--DNFDT +RLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKK----------------- +----------------------------------------------------------MN +-----------VESL--------------------------------------------- +--------------RSNVDKSKET------AEIRIAKAAITICFLFFVSWTPYGVMSLIG +AFGDKS---LLTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCPWLGV------ +---NEKSG--EASSAQSTTTQEQT--QQTSAA---------------------------- +------------------------------------------------------------ +- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +--------------------------------MTNATGPQMAY----------------- +YGAASMDFGYP------EGVSIVDFVRPEIKP----------------YVHQHWYNYPPV +NPMWHYLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNLALSDLIMLTTN-V +PFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDRYNIICNGFNG-PK +LTTGKAVVFALISWVIAIGC-ALPPFFG-W-----GNYILEGILDSCSYDYLT--QDFNT +FSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKK----------------- +----------------------------------------------------------MN +-----------VSTL--------------------------------------------- +--------------RS-NEADAQR------AEIRIAKTALVNVSLWFICWTPYALISLKG +VMGDTS---GITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLPWFCV------ +HE-TETKS--NDDSQSNSTVAQDK-A---------------------------------- +------------------------------------------------------------ +- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +--------------------------------MANVTGPQMAF----------------- +YGSGAATFGYP------EGMTVADFVPDRVKH----------------MVLDHWYNYPPV +NPMWHYLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNLALSDLIMLTTN-F +PPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDRYNIICNGFNG-PK +LTQGKATFMCGLAWVISVGW-SLPPFFG-W-----GSYTLEGILDSCSYDYFT--RDMNT +ITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKK----------------- +----------------------------------------------------------MN +-----------VTNL--------------------------------------------- +--------------RS-NEAETQR------AEIRIAKTALVNVSLWFICWTPYAAITIQG +LLGNAE---GITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLPWFCV------ +HE-KDPND--VEENQSSNTQTQEK-S---------------------------------- +------------------------------------------------------------ +- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +----------MESF----------------AVAAAQLGPHFAP----------------- +LS----------------NGSVVDKVTPDMAH----------------LISPYWNQFPAM +DPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-T +PMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RP +MTIPLALGKM---------------------------YVPEGNLTSCGIDYLE--RDWNP +RSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK----------------- +----------------------------------------------------------MN +-----------VKSL--------------------------------------------- +--------------RS-SEDAEKS------AEGKLAKVALVTITLWFMAWTPYLVINCMG +LFKF-E---GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------ +GK-VDDGK--SSDAQSQA-TASEA-ESKA------------------------------- +------------------------------------------------------------ +- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +----------MESF----------------AVAAAQLGPHFAP----------------- +LS----------------NGSVVDKVTPDMAH----------------LISPYWNQFPAM +DPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-T +PMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RP +MTIPLALGKIAYIWFMSSIW-CLAPAFG-W-----SRYVPEGNLTSCGIDYLE--RDWNP +RSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK----------------- +----------------------------------------------------------MN +-----------VKSL--------------------------------------------- +--------------RS-SEDAEKS------AEGKLAKVALVTITLWFMAWTPYLVINCMG +LFKF-E---GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------ +GK-VDDGK--SSDAQSQA-TASEA-ESKA------------------------------- +------------------------------------------------------------ +- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +----------MDSF----------------AAVATQLGPQFAA----------------- +PS----------------NGSVVDKVTPDMAH----------------LISPYWDQFPAM +DPIWAKILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-T +PMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAG-RP +MTIPLALGKIAYIWFMSTIWCCLAPVFG-W-----SRYVPEGNLTSCGIDYLE--RDWNP +RSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK----------------- +----------------------------------------------------------MN +-----------VKSL--------------------------------------------- +--------------RS-SEDADKS------AEGKLAKVALVTISLWFMAWTPYLVINCMG +LFKF-E---GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCVF------ +GK-VDDGK--SSEAQSQA-TTSEA-ESKA------------------------------- +------------------------------------------------------------ +- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MER-----SHLPET----------------PFDLAHSGPRFQA----------------- +QSSG--------------NGSVLDNVLPDMAH----------------LVNPYWSRFAPM +DPMMSKILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-S +PVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDRYNVIVKGING-TP +MTIKTSIMKILFIWMMAVFW-TVMPLIG-W-----SAYVPEGNLTACSIDYMT--RMWNP +RSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKK----------------- +----------------------------------------------------------MN +-----------VKSL--------------------------------------------- +--------------RS-SEDCDKS------AEGKLAKVALTTISLWFMAWTPYLVICYFG +LFKI-D---GLTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCPMCVF------ +GN-TDEPK--PDAPASDTETTSEA-DSKA------------------------------- +------------------------------------------------------------ +- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MER-----SLLPEP----------------PLAMALLGPRFEA----------------- +QTGG--------------NRSVLDNVLPDMAP----------------LVNPHWSRFAPM +DPTMSKILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-S +PVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDRYNVIVKGING-TP +MTIKTSIMKIAFIWMMAVFW-TIMPLIG-W-----SSYVPEGNLTACSIDYMT--RQWNP +RSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKK----------------- +----------------------------------------------------------MN +-----------VKSL--------------------------------------------- +--------------RS-SEDCDKS------AENKLAKVALTTISLWFMAWTPYLIICYFG +LFKI-D---GLTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCPMCVC------ +GT-TDEPK--PDAPPSDTETTSEA-ESKD------------------------------- +------------------------------------------------------------ +- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +--------------------------------MIAVSGPSYEA----------------- +FSYGGQA--------RFNNQTVVDKVPPDMLH----------------LIDANWYQYPPL +NPMWHGILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINLAISNFLMMFCM-S +PPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDRYNVIVKGLSG-KP +LSINGALIRIIAIWLFSLGW-TIAPMFG-W-----NRYVPEGNMTACGTDYFN--RGLLS +ASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKK----------------- +----------------------------------------------------------MN +-----------VASL--------------------------------------------- +--------------RS-SENQNTS------AECKLAKVALMTISLWFMAWTPYLVINFSG +IFNL-V---KISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFPSLAC------ +-A-AEPSS--DAVSTTSGTTTVTD-NEKSNA----------------------------- +------------------------------------------------------------ +- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +MAN---------------------------QLSYSSLGWPYQP----------------- +------------------NASVVDTMPKEMLY----------------MIHEHWYAFPPM +NPLWYSILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNLAFSDFCMMAFM-M +PTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDRYNVIVRGMAA-AP +LTHKKATLLLLFVWIWSGGW-TILPFFG-W-----SRYVPEGNLTSCTVDYLT--KDWSS +ASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKK----------------- +----------------------------------------------------------MN +-----------VASL--------------------------------------------- +--------------RANADQQKQS------AECRLAKVAMMTVGLWFMAWTPYLIISWAG +VFSSGT---RLTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFPSLAC------ +GS-GESGS--DVKSEASATTTMEE-KPKIPEA---------------------------- +------------------------------------------------------------ +- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +---------------------------------------MVES----------------- +TTLVNQTWWY--------NPTVD--------------------------IHPHWAKFDPI +PDAVYYSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINLAMSDLSFSAINGF +PLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDRYNVIGRPMAASKK +MSHRRAFLMIIFVWMWSIVW-SVGPVFN-W-----GAYVPEGILTSCSFDYLS--TDPST +RSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKR----------------- +----------------------------------------------------------LN +-----------AKEL--------------------------------------------- +--------------R--KAQAGAS------AEMKLAKISMVIITQFMLSWSPYAIIALLA +QFGPAE---WVTPYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQTTFPWLLTCCQFDE +KE-CEDAN--DAEEEVVASER--G-GESRDAAQMKEMMAMMQKMQAQQAAYQPPPPPQGY +--PPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAPPQVEAPQGAPPQGVDNQAYQ +A +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +----------------------------------------MGR----------------- +DLRDNETWWY--------NPSIV--------------------------VHPHWREFDQV +PDAVYYSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINLAFSDFTFSLVNGF +PLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDRYNVIGRPMAASKK +MSHRRAFIMIIFVWLWSVLW-AIGPIFG-W-----GAYTLEGVLCNCSFDYIS--RDSTT +RSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKR----------------- +----------------------------------------------------------LN +-----------AKEL--------------------------------------------- +--------------R--KAQAGAN------AEMRLAKISIVIVSQFLLSWSPYAVVALLA +QFGPLE---WVTPYAAQLPVMFAKASAIHNPMIYSVSHPKFREAISQTFPWVLTCCQFDD +KE-TEDDK--DAETEIPAGESSDA-APSADAAQMKEMMAMMQKMQQQQAAY----PPQGY +APPPQGYPPQGY--PPQGYPPQGYPPQGYPP---PPQGAPPQ-GAPPAAPPQGVDNQAYQ +A +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +----------PHLLSGFLEVTASPAPTWDAPPDNVSGCGEQINYGRVE------------ +----KVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-M +PFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVR +QNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDKVCLISQDF--------- +-GYTIYSTAVAFYIPMSVMLFMYYQIY-------KAARKSAAKHKF-------------- +-------------------PGF-----------------PRVQ---------PESVISLN +G----------VVKLQK--------------------------EVEECAN---------- +--------LSRLLKHERKNISIFK------REQKAATTLGIIVGAFTVCWLPFFLLSTAR +PFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLLQCQYR---NIN +RK-LSAAGMHEALKLAERPERSEFVLQNSDHCGKK------------------------- +----------------------------------------------------GHDT---- +- +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +----------PHLLSGFLEVTASPAPTWDAPPDNVSGCGEQINYGRVE------------ +----KVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-M +PFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVR +QNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDKVCLISQDF--------- +-GYTIYSTAVAFYIPMSVMLFMYYQIY-------KAARKSAAKHKF-------------- +-------------------PGF-----------------PRVQ---------PESVISLN +G----------VVKLQK--------------------------EVEECAN---------- +--------LSRLLKHERKNISIFK------REQKAATTLGIIVGAFTVCWLPFFLLSTAR +PFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLLQCQYR---NIN +RK-LSAAGMHEALKLAERPERSEFVLQNSDHCGKK------------------------- +----------------------------------------------------GHDT---- +- +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +MDVLSPGQ--------------G------------------------------------- +------------------NNTTSPPAPFETGGNTT-------------GISDVTVSY--- +----QVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-L +PMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNK +RTPRRAAALISLTWLIGFLI-SIPPMLG-WRTPE-DRSDPDA--CTISKDH--------- +-GYTIYSTFGAFYIPLLLMLVLYGRIF-------RAARFRIRK----------------- +----------------------TVKKVEKTGADTRHGASPAPQ---------PKKS--VN +GESGSRNWRLGVESK-----AGGALCANGAVRQGDDGAALEVIEVHRVGNSKEHLPLPSE +AG--PTPCAPASFERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVL +PFCESSC--HMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC------ +RQ---------------------------------------------------------- +------------------------------------------------------------ +- +> 33=p A35181 serotonin receptor class 1A - rat +MDVFSFGQ--------------G------------------------------------- +------------------NNTTASQEPFGTGGNVT-------------SISDVTFSY--- +----QVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-L +PMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNK +RTPRRAAALISLTWLIGFLI-SIPPMLG-WRTPE-DRSDPDA--CTISKDH--------- +-GYTIYSTFGAFYIPLLLMLVLYGRIF-------RAARFRIRK----------------- +----------------------TVRKVEKKGAGTSLGTSSAPP---------PKKS--LN +GQPGSGDWRRCAENR-----AVGTPCTNGAVRQGDDEATLEVIEVHRVGNSKEHLPLPSE +SG--SNSYAPACLERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVL +PFCESSC--HMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIKCKFC------ +RR---------------------------------------------------------- +------------------------------------------------------------ +- +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +MANFTFGDLALDVAR-----MGGLASTPSGLRSTGLTTPGLSPTGL-------------V +TSDFNDSYGLTG---QFINGSHSSRSRDNASANDTSATN---------MTDDRYWSLTVY +SHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-M +PLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRR +RSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIISQDK--------- +-GYTIFSTVGAFYLPMLVMMIIYIRIW-------LVARSRIRKDKFQMTKARLKTEETTL +VASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVN +SNSSS------SERL----KQIQIETAEAFANGCAEEASIAMLERQ-CNNGKKISSNDTP +YS------------RT-REKLELK------RERKAARTLAIITGAFLICWLPFFIIALIG +PFVDPE---GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILFGKYR----RG +HR---------------------------------------------------------- +------------------------------------------------------------ +- +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +MANFTFGDLALDVAR-----MGGLASTPSGLRSTGLTTPGLSPTGL-------------V +TSDFNDSYGLTG---QFINGSHSSRSRDNASANDTSATN---------MTDDRYWSLTVY +SHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-M +PLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRR +RSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIISQDK--------- +-GYTIFSTVGAFYLPMLVMMIIYIRIW-------LVARSRIRKDKFQMTKARLKTEETTL +VASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVN +SNSSS------SERL----KQIQIETAEAFANGCAEEASIAMLERQ-CNNGKKISSNDTP +YS------------RT-REKLELK------RERKAARTLAIITGAFLICWLPFFIIALIG +PFVDPE---GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILFGKYR----RG +HR---------------------------------------------------------- +------------------------------------------------------------ +- +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +MEGAE-GQEELDWEA-----LY--LRLP--LQNCSWNSTGWEPNWN-------------V +TVVPNTTWWQ-------------ASAPFDTPAALVR------------------------ +----AAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSLAVADLLVACLV-M +PLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDRYWAVTN-IDYIHA +STAKRVGMMIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDLRCVVSQDV--------- +-GYQIFATASSFYVPVLIILILYWRIY-------QTARKRIRR----------------- +----------------------------RRGATARGGVGPPPV---------PAGGALVA +GGGSGGIAAAVVAVIGRPLPTISETTTTGFTNVSSNNTSP---EKQSCANGLEADPPTTG +YGAVAAAYYPSLVRRKPKEAADSK------RERKAAKTLAIITGAFVACWLPFFVLAILV +PTCDCE----VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQRLLCGRRV----RR +RR---------------------------------------------------------- +---------------------------------------APQ------------------ +- diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.gins1 b/mafft/src/mafft-7.487-with-extensions/test/sample.gins1 new file mode 100644 index 0000000000..9392783762 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.gins1 @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +--------------------MN-------------------------------------- +-----------------------GTE--GDNFY------------VPFSNKTG------- +---------------LARSPYEYPQY-------------YLAEPWKYSALAAYMFFLILV +GFPVNFLTLFVTVQHKKLRTPLNYILLNLAMANLFMVLFG-FTVTMYTSMN-GYFV--FG +PTMCSIEGFFATLGGEVALWSLVVLAIERYIVICKPMGNF-RFGNTHAIMGVAFTWIMAL +ACAAP-PLVG-WS-----RYIPEGMQCSCGPDYYTLNPNFNNESYVVYMFVVHFLVPFVI +IFFCYGRLLCTVKEAAAAQQESA------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEKEVTRMVVLM +VIGFLVCWVPYASVAFYIFT-HQGS-D-FGATFMTLPAFFAKSSALYNPVIYILMNKQFR +NCMITTLCC----GKNPLGDDE-SGA-STSKTEVSSVS-TSPV----------------- +------------------------------------------------------------ +--------------------SPA--- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +--------------------MN-------------------------------------- +-----------------------GTE--GPNFY------------VPFSNITG------- +---------------VVRSPFEQPQY-------------YLAEPWQFSMLAAYMFLLIVL +GFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGG-FTTTLYTSLH-GYFV--FG +PTGCNLEGFFATLGGEIGLWSLVVLAIERYVVVCKPMSNF-RFGENHAIMGVAFTWVMAL +ACAAP-PLVG-WS-----RYIPEGMQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIV +IFFCYGQLVFTVKEAAAQQQESA------------------------------------- +------------------------------------------------------------ +--------------------------------------------TTQKAEKEVTRMVIIM +VIFFLICWLPYASVAMYIFT-HQGS-N-FGPIFMTLPAFFAKTASIYNPIIYIMMNKQFR +NCMLTSLCC----GKNPLGDDE-ASA-TASKTE------TSQV----------------- +------------------------------------------------------------ +--------------------APA--- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +--------------------MN-------------------------------------- +-----------------------GTE--GINFY------------VPMSNKTG------- +---------------VVRSPFEYPQY-------------YLAEPWKYRLVCCYIFFLIST +GLPINLLTLLVTFKHKKLRQPLNYILVNLAVADLFMACFG-FTVTFYTAWN-GYFV--FG +PVGCAVEGFFATLGGQVALWSLVVLAIERYIVVCKPMGNF-RFSATHAMMGIAFTWVMAF +SCAAP-PLFG-WS-----RYMPEGMQCSCGPDYYTHNPDYHNESYVLYMFVIHFIIPVVV +IFFSYGRLICKVREAAAQQQESA------------------------------------- +------------------------------------------------------------ +--------------------------------------------TTQKAEKEVTRMVILM +VLGFMLAWTPYAVVAFWIFT-NKGA-D-FTATLMAVPAFFSKSSSLYNPIIYVLMNKQFR +NCMITTICC----GKNPFGDEDVSSTVSQSKTEVSSVS-SSQV----------------- +------------------------------------------------------------ +--------------------SPA--- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +--------------------MN-------------------------------------- +-----------------------GTE--GKNFY------------VPMSNRTG------- +---------------LVRSPFEYPQY-------------YLAEPWQFKILALYLFFLMSM +GLPINGLTLVVTAQHKKLRQPLNFILVNLAVAGTIMVCFG-FTVTFYTAIN-GYFV--LG +PTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGSF-KFSSSHAFAGIAFTWVMAL +ACAAP-PLFG-WS-----RYIPEGMQCSCGPDYYTLNPDYNNESYVIYMFVCHFILPVAV +IFFTYGRLVCTVKAAAAQQQDSA------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEREVTKMVILM +VFGFLIAWTPYATVAAWIFF-NKGA-D-FSAKFMAIPAFFSKSSALYNPVIYVLLNKQFR +NCMLTTIFC----GKNPLGDDE-SSTVSTSKTEVSS------V----------------- +------------------------------------------------------------ +--------------------SPA--- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +--------------------MN-------------------------------------- +-----------------------GTE--GNNFY------------VPLSNRTG------- +---------------LVRSPFEYPQY-------------YLAEPWQFKLLAVYMFFLICL +GLPINGLTLICTAQHKKLRQPLNFILVNLAVAGAIMVCFG-FTVTFYTAIN-GYFA--LG +PTGCAVEGFMATLGGEVALWSLVVLAIERYIVVCKPMGSF-KFSSTHASAGIAFTWVMAM +ACAAP-PLVG-WS-----RYIPEGIQCSCGPDYYTLNPEYNNESYVLYMFICHFILPVTI +IFFTYGRLVCTVKAAAAQQQDSA------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEREVTKMVILM +VLGFLVAWTPYATVAAWIFF-NKGA-A-FSAQFMAIPAFFSKTSALYNPVIYVLLNKQFR +SCMLTTLFC----GKNPLGDEE-SSTVSTSKTEVSS------V----------------- +------------------------------------------------------------ +--------------------SPA--- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +--------------------MK-------------------------------------- +-----------------------QVPEFHEDFY------------IPIPLDINN------ +--------------LSAYSPFLVPQD-------------HLGNQGIFMAMSVFMFFIFIG +GASINILTILCTIQFKKLRSHLNYILVNLSIANLFVAIFG-SPLSFYSFFN-RYFI--FG +ATACKIEGFLATLGGMVGLWSLAVVAFERWLVICKPLGNF-TFKTPHAIAGCILPWISAL +AASLP-PLFG-WS-----RYIPEGLQCSCGPDWYTTNNKYNNESYVMFLFCFCFAVPFGT +IVFCYGQLLITLKLAAKAQADSA------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEREVTKMVVVM +VLGFLVCWAPYASFSLWIVS-HRGE-E-FDLRMATIPSCLSKASTVYNPVIYVLMNKQFR +SCMM-KMVC----GKN-IEEDE-AST-SSQVTQVSS------V----------------- +------------------------------------------------------------ +--------------------APEK-- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +--------------------MR-------------------------------------- +-----------------------KMS--EEEFY------------L-FKNISS------- +---------------V--GPWDGPQY-------------HIAPVWAFYLQAAFMGTVFLI +GFPLNAMVLVATLRYKKLRQPLNYILVNVSFGGFLLCIFS-VFPVFVASCN-GYFV--FG +RHVCALEGFLGTVAGLVTGWSLAFLAFERYIVICKPFGNF-RFSSKHALTVVLATWTIGI +GVSIP-PFFG-WS-----RFIPEGLQCSCGPDWYTVGTKYRSESYTWFLFIFCFIVPLSL +ICFSYTQLLRALKAVAAQQQESA------------------------------------- +------------------------------------------------------------ +--------------------------------------------TTQKAEREVSRMVVVM +VGSFCVCYVPYAAFAMYMVN-NRNH-G-LDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQ +ACIM-KMVC----GKA-MTDES-DTC-SSQKTEVSTVS-STQV----------------- +------------------------------------------------------------ +--------------------GPN--- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------------------------DLAETVIA-STISIVNQVS-GYFV--LG +HPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWAA +VWTAP-PIFG-WS-----RYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSI +IVLCYLQVWLAIRAVAKQQKESE------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEKEVTRMVVVM +VLAFC------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWS-LQRLAGRHPQDSYED-------------------------------------- +-----------------------STQ--SSIFT------------YTNSNSTR------- +------------------GPFEGPNY-------------HIAPRWVYHLTSVWMIFVVIA +SVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-STISVVNQVY-GYFV--LG +HPMCVLEGYTVSLCGITGLWSLAIISWERWMVVCKPFGNV-RFDAKLAIVGIAFSWIWAA +VWTAP-PIFG-WS-----RYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSI +IVLCYLQVWLAIRAVAKQQKESE------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEKEVTRMVVVM +VLAFCFCWGPYAFFACFAAA-NPGY-P-FHPLMAALPAFFAKSATIYNPVIYVFMNRQFR +NCIL-QLF-----GKK-VDDGS-ELS-SASKTEVSSV---SSV----------------- +------------------------------------------------------------ +--------------------SPA--- +> 10== Z68193 1 human Red Opsin <>[] +MAQQWS-LQRLAGRHPQDSYED-------------------------------------- +-----------------------STQ--SSIFT------------YTNSNSTR------- +------------------GPFEGPNY-------------HIAPRWVYHLTSVWMIFVVTA +SVFTNGLVLAATMKFKKLRHPLNWILVNLAVADLAETVIA-STISIVNQVS-GYFV--LG +HPMCVLEGYTVSLCGITGLWSLAIISWERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWSA +VWTAP-PIFG-WS-----RYWPHGLKTSCGPDVFSGSSYPGVQSYMIVLMVTCCIIPLAI +IMLCYLQVWLAIRAVAKQQKESE------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEKEVTRMVVVM +IFAYCVCWGPYTFFACFAAA-NPGY-A-FHPLMAALPAYFAKSATIYNPVIYVFMNRQFR +NCIL-QLF-----GKK-VDDGS-ELS-SASKTEVSSV---SSV----------------- +------------------------------------------------------------ +--------------------SPA--- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDD--DD-------------------------------------- +-----------------------TTR--GSVFT------------YTNTNNTR------- +------------------GPFEGPNY-------------HIAPRWVYNLVSFFMIIVVIA +SCFTNGLVLVATAKFKKLRHPLNWILVNLAFVDLVETLVA-STISVFNQIF-GYFI--LG +HPLCVIEGYVVSSCGITGLWSLAIISWERWFVVCKPFGNI-KFDSKLAIIGIVFSWVWAW +GWSAP-PIFG-WS-----RYWPHGLKTSCGPDVFSGSVELGCQSFMLTLMITCCFLPLFI +IIVCYLQVWMAIRAVAAQQKESE------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEREVSRMVVVM +IVAFCICWGPYASFVSFAAA-NPGY-A-FHPLAAALPAYFAKSATIYNPVIYVFMNRQFR +NCIM-QLF-----GKK-VDDGS-EAS-TTSRTEVSSVS-NSSV----------------- +------------------------------------------------------------ +--------------------APA--- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-AWE-AAFAARRRHEE--ED-------------------------------------- +-----------------------TTR--DSVFT------------YTNSNNTR------- +------------------GPFEGPNY-------------HIAPRWVYNLTSVWMIFVVAA +SVFTNGLVLVATWKFKKLRHPLNWILVNLAVADLGETVIA-STISVINQIS-GYFI--LG +HPMCVVEGYTVSACGITALWSLAIISWERWFVVCKPFGNI-KFDGKLAVAGILFSWLWSC +AWTAP-PIFG-WS-----RYWPHGLKTSCGPDVFSGSSDPGVQSYMVVLMVTCCFFPLAI +IILCYLQVWLAIRAVAAQQKESE------------------------------------- +------------------------------------------------------------ +--------------------------------------------STQKAEKEVSRMVVVM +IVAYCFCWGPYTFFACFAAA-NPGY-A-FHPLAAALPAYFAKSATIYNPIIYVFMNRQFR +NCIL-QLF-----GKK-VDDGS-EVS-T-SRTEVSSVS-NSSV----------------- +------------------------------------------------------------ +--------------------SPA--- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +------------------------------------------------------------ +-------------------------M--SSNSS------------QAPPNGTP------- +------------------GPFDGPQWP------------YQAPQSTYVGVAVLMGTVVAC +ASVVNGLVIVVSICYKKLRSPLNYILVNLAVADLLVTLCG-SSVSLSNNIN-GFFV--FG +RRMCELEGFMVSLTGIVGLWSLAILALERYVVVCKPLGDF-QFQRRHAVSGCAFTWGWAL +LWSAP-PLLG-WS-----SYVPEGLRTSCGPNWYTGGSN--NNSYILSLFVTCFVLPLSL +ILFSYTNLLLTLRAAAAQQKEAD------------------------------------- +------------------------------------------------------------ +--------------------------------------------TTQRAEREVTRMVIVM +VMAFLLCWLPYSTFALVVAT-HKGI-I-IQPVLASLPSYFSKTATVYNPIIYVFMNKQFQ +SCLL-EMLCCGYQPQR-TGKAS-PGT-PGPHADVTAAGLRNKV----------------- +------------------------------------------------------------ +--------------------MPAHPV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +--------------------MESGNVS--------------------------------- +-------------------SSLFGNV--STALR-------------PEARLSA---E--- +---TRLLGWNVPPEELRHIPEHWLTY-------------PEPPESMNYLLGTLYIFFTLM +SMLGNGLVIWVFSAAKSLRTPSNILVINLAFCDFMMMVK--TPIFIYNSFH-QGYA--LG +HLGCQIFGIIGSYTGIAAGATNAFIAYDRFNVITRPMEG--KMTHGKAIAMIIFIYMYAT +PWVVA-CYTETWG-----RFVPEGYLTSCTFDYLTDN--FDTRLFVACIFFFSFVCPTTM +ITYYYSQIVGHVFSHEKALRDQAKKMNVE------------------SLRS--------- +------------------------------------------------------------ +----------------------------------------NVDKNKETAEIRIAKAAITI +CFLFFCSWTPYGVMSLIGAF-GDKT-L-LTPGATMIPACACKMVACIDPFVYAISHPRYR +MELQ-KRCPWL--ALNEKAPES-SAV-ASTST---TQE-PQQT----------------- +------------------------------------------------------------ +--------------------TAA--- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +--------------------MEYHNVS--------------------------------- +-------------------SVL-GNV--SSVLR-------------PDARLSA---E--- +---SRLLGWNVPPDELRHIPEHWLIY-------------PEPPESMNYLLGTLYIFFTVI +SMIGNGLVMWVFSAAKSLRTPSNILVINLAFCDFMMMIK--TPIFIYNSFH-QGYA--LG +HLGCQIFGVIGSYTGIAAGATNAFIAYDRYNVITRPMEG--KMTHGKAIAMIIFIYLYAT +PWVVA-CYTESWG-----RFVPEGYLTSCTFDYLTDN--FDTRLFVACIFFFSFVCPTTM +ITYYYSQIVGHVFSHEKALRDQAKKMNVD------------------SLRS--------- +------------------------------------------------------------ +----------------------------------------NVDKSKEAAEIRIAKAAITI +CFLFFASWTPYGVMSLIGAF-GDKT-L-LTPGATMIPACTCKMVACIDPFVYAISHPRYR +MELQ-KRCPWL--AISEKAPES-RAA-ISTST---TQE-QQQT----------------- +------------------------------------------------------------ +--------------------TAA--- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +--------------------ME-------------------------------------- +--------------------PLCNAS--EPPLR-------------PEAR-SSGNGD--- +---LQFLGWNVPPDQIQYIPEHWLTQ-------------LEPPASMHYMLGVFYIFLFCA +STVGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--APIF--NSFH-RGFAIYLG +NTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--NMTFTKAVIMNIIIWLYCT +PWVVL-PLTQFWD-----RFVPEGYLTSCSFDYLSDN--FDTRLFVGTIFFFSFVCPTLM +ILYYYSQIVGHVFSHEKALREQAKKMNVE------------------SLRS--------- +------------------------------------------------------------ +----------------------------------------NVDKSKETAEIRIAKAAITI +CFLFFVSWTPYGVMSLIGAF-GDKS-L-LTQGATMIPACTCKLVACIDPFVYAISHPRYR +LELQ-KRCPWL--GVNEKSGEI-SSA-QSTTT---QEQ--QQT----------------- +------------------------------------------------------------ +--------------------TAA--- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +--------------------MD-------------------------------------- +--------------------ALCNAS--EPPLR-------------PEARMSSGSDE--- +---LQFLGWNVPPDQIQYIPEHWLTQ-------------LEPPASMHYMLGVFYIFLFFA +STLGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDLIMCLK--APIFIYNSFH-RGFA--LG +NTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVITKPMNR--NMTFTKAVIMNIIIWLYCT +PWVVL-PLTQFWD-----RFVPEGYLTSCSFDYLSDN--FDTRLFVGTIFLFSFVVPTLM +ILYYYSQIVGHVFNHEKALREQAKKMNVE------------------SLRS--------- +------------------------------------------------------------ +----------------------------------------NVDKSKETAEIRIAKAAITI +CFLFFVSWTPYGVMSLIGAF-GDKS-L-LTPGATMIPACTCKLVACIEPFVYAISHPRYR +MELQ-KRCPWL--GVNEKSGEA-SSA-QSTTT---QEQ-TQQT----------------- +------------------------------------------------------------ +--------------------SAA--- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +--------------------MT-------------------------------------- +-----------------------NAT--GPQMAY-----------YGAASMDFGYPE--- +---GVSIVDFVRPEIKPYVHQHWYNY-------------PPVNPMWHYLLGVIYLFLGTV +SIFGNGLVIYLFNKSAALRTPANILVVNLALSDLIMLTTN-VPFFTYNCFSGGVWM--FS +PQYCEIYACLGAITGVCSIWLLCMISFDRYNIICNGFNGP-KLTTGKAVVFALISWVIAI +GCALP-PFFG-WG-----NYILEGILDSCSYDYLTQD--FNTFSYNIFIFVFDYFLPAAI +IVFSYVFIVKAIFAHEAAMRAQAKKMNVS------------------TLRS--------- +------------------------------------------------------------ +-----------------------------------------NEADAQRAEIRIAKTALVN +VSLWFICWTPYALISLKGVM-GDTS-G-ITPLVSTLPALLAKSCSCYNPFVYAISHPKYR +LAIT-QHLPWF--CVHETETKS-NDD-SQSNS---TVA-Q-------------------- +------------------------------------------------------------ +--------------------DKA--- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +--------------------MA-------------------------------------- +-----------------------NVT--GPQMAF-----------YGSGAATFGYPE--- +---GMTVADFVPDRVKHMVLDHWYNY-------------PPVNPMWHYLLGVVYLFLGVI +SIAGNGLVIYLYMKSQALKTPANMLIVNLALSDLIMLTTN-FPPFCYNCFSGGRWM--FS +GTYCEIYAALGAITGVCSIWTLCMISFDRYNIICNGFNGP-KLTQGKATFMCGLAWVISV +GWSLP-PFFG-WG-----SYTLEGILDSCSYDYFTRD--MNTITYNICIFIFDFFLPASV +IVFSYVFIVKAIFAHEAAMRAQAKKMNVT------------------NLRS--------- +------------------------------------------------------------ +-----------------------------------------NEAETQRAEIRIAKTALVN +VSLWFICWTPYAAITIQGLL-GNAE-G-ITPLLTTLPALLAKSCSCYNPFVYAISHPKFR +LAIT-QHLPWF--CVHEKDPND-VEE-NQSSN---TQT-Q-------------------- +------------------------------------------------------------ +--------------------EKS--- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +--------------------MESF------------------------------------ +-------------------AVAAAQL--GPHFA----------------PLS-------- +---NGSVVDKVTPDMAHLISPYWNQF-------------PAMDPIWAKILTAYMIMIGMI +SWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLYF-ETWV--LG +PMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGR-PMTIPLALGKM-------- +-------------------YVPEGNLTSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFL +ICYSYWFIIAAVSAHEKAMREQAKKMNVK------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SEDAEKSAEGKLAKVALVT +ITLWFMAWTPYLVINCMGLF-KF-E-G-LTPLNTIWGACFAKSAACYNPIVYGISHPKYR +LALK-EKCPCC--VFGKVDDGK-SSD-AQSQA-TASEA-E-------------------- +------------------------------------------------------------ +--------------------SKA--- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +--------------------MESF------------------------------------ +-------------------AVAAAQL--GPHFA----------------PLS-------- +---NGSVVDKVTPDMAHLISPYWNQF-------------PAMDPIWAKILTAYMIMIGMI +SWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLYF-ETWV--LG +PMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGR-PMTIPLALGKIAYIWFMSS +IW-CLAPAFG-WS-----RYVPEGNLTSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFL +ICYSYWFIIAAVSAHEKAMREQAKKMNVK------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SEDAEKSAEGKLAKVALVT +ITLWFMAWTPYLVINCMGLF-KF-E-G-LTPLNTIWGACFAKSAACYNPIVYGISHPKYR +LALK-EKCPCC--VFGKVDDGK-SSD-AQSQA-TASEA-E-------------------- +------------------------------------------------------------ +--------------------SKA--- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +--------------------MDSF------------------------------------ +-------------------AAVATQL--GPQFA----------------APS-------- +---NGSVVDKVTPDMAHLISPYWDQF-------------PAMDPIWAKILTAYMIIIGMI +SWCGNGVVIYIFATTKSLRTPANLLVINLAISDFGIMITN-TPMMGINLYF-ETWV--LG +PMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIVKGMAGR-PMTIPLALGKIAYIWFMST +IWCCLAPVFG-WS-----RYVPEGNLTSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFL +ICYSYWFIIAAVSAHEKAMREQAKKMNVK------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SEDADKSAEGKLAKVALVT +ISLWFMAWTPYLVINCMGLF-KF-E-G-LTPLNTIWGACFAKSAACYNPIVYGISHPKYR +LALK-EKCPCC--VFGKVDDGK-SSE-AQSQA-TTSEA-E-------------------- +------------------------------------------------------------ +--------------------SKA--- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +--------------------MERSHLP--------------------------------- +-----------------ETPFDLAHS--GPRFQ----------------AQSSG------ +---NGSVLDNVLPDMAHLVNPYWSRF-------------APMDPMMSKILGLFTLAIMII +SCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-SPVMIINFYY-ETWV--LG +PLWCDIYAGCGSLFGCVSIWSMCMIAFDRYNVIVKGINGT-PMTIKTSIMKILFIWMMAV +FWTVM-PLIG-WS-----AYVPEGNLTACSIDYMTRM--WNPRSYLITYSLFVYYTPLFL +ICYSYWFIIAAVAAHEKAMREQAKKMNVK------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SEDCDKSAEGKLAKVALTT +ISLWFMAWTPYLVICYFGLF-KI-D-G-LTPLTTIWGATFAKTSAVYNPIVYGISHPKYR +IVLK-EKCPMC--VFGNTDEPK-PDA-PASDTETTSEA-D-------------------- +------------------------------------------------------------ +--------------------SKA--- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +--------------------MERSLLP--------------------------------- +-----------------EPPLAMALL--GPRFE----------------AQTGG------ +---NRSVLDNVLPDMAPLVNPHWSRF-------------APMDPTMSKILGLFTLVILII +SCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDFCMMASQ-SPVMIINFYY-ETWV--LG +PLWCDIYAACGSLFGCVSIWSMCMIAFDRYNVIVKGINGT-PMTIKTSIMKIAFIWMMAV +FWTIM-PLIG-WS-----SYVPEGNLTACSIDYMTRQ--WNPRSYLITYSLFVYYTPLFM +ICYSYWFIIATVAAHEKAMRDQAKKMNVK------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SEDCDKSAENKLAKVALTT +ISLWFMAWTPYLIICYFGLF-KI-D-G-LTPLTTIWGATFAKTSAVYNPIVYGISHPNDR +LVLK-EKCPMC--VCGTTDEPK-PDA-PPSDTETTSEA-E-------------------- +------------------------------------------------------------ +--------------------SKD--- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +--------------------MI-------------------------------------- +-----------------------AVS--GPSYE----------------AFSYGGQAR-- +-FNNQTVVDKVPPDMLHLIDANWYQY-------------PPLNPMWHGILGFVIGMLGFV +SAMGNGMVVYIFLSTKSLRTPSNLFVINLAISNFLMMFCM-SPPMVINCYY-ETWV--LG +PLFCQIYAMLGSLFGCGSIWTMTMIAFDRYNVIVKGLSGK-PLSINGALIRIIAIWLFSL +GWTIA-PMFG-WN-----RYVPEGNMTACGTDYFNRG--LLSASYLVCYGIWVYFVPLFL +IIYSYWFIIQAVAAHEKNMREQAKKMNVA------------------SLRS--------- +------------------------------------------------------------ +-----------------------------------------SENQNTSAECKLAKVALMT +ISLWFMAWTPYLVINFSGIF-NL-V-K-ISPLFTIWGSLFAKANAVYNPIVYGISHPKYR +AALF-AKFPSL--AC-AAEPSS-DAV-STTSG-TTTVT-DNEK----------------- +------------------------------------------------------------ +--------------------SNA--- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +--------------------M--------------------------------------- +------------------------AN--QLSYS----------------SLGWPYQP--- +---NASVVDTMPKEMLYMIHEHWYAF-------------PPMNPLWYSILGVAMIILGII +CVLGNGMVIYLMMTTKSLRTPTNLLVVNLAFSDFCMMAFM-MPTMTSNCFA-ETWI--LG +PFMCEVYGMAGSLFGCASIWSMVMITLDRYNVIVRGMAAA-PLTHKKATLLLLFVWIWSG +GWTIL-PFFG-WS-----RYVPEGNLTSCTVDYLTKD--WSSASYVVIYGLAVYFLPLIT +MIYCYFFIVHAVAEHEKQLREQAKKMNVA------------------SLRA--------- +------------------------------------------------------------ +----------------------------------------NADQQKQSAECRLAKVAMMT +VGLWFMAWTPYLIISWAGVF-SSGT-R-LTPLATIWGSVFAKANSCYNPIVYGISHPRYK +AALY-QRFPSL--ACGSGESGS-DVK-SEASA-TTTME-EKPK----------------- +------------------------------------------------------------ +-------------------IPEA--- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +--------------------MV-------------------------------------- +-----------------------EST--TL------------------VNQTWWY----- +---NPTVD----------IHPHWAKF-------------DPIPDAVYYSVGIFIGVVGII +GILGNGVVIYLFSKTKSLQTPANMFIINLAMSDLSFSAINGFPLKTISAFM-KKWI--FG +KVACQLYGLLGGIFGFMSINTMAMISIDRYNVIGRPMAASKKMSHRRAFLMIIFVWMWSI +VWSVG-PVFN-WG-----AYVPEGILTSCSFDYLSTD--PSTRSFILCMYFCGFMLPIII +IAFCYFNIVMSVSNHEKEMAAMAKRLNAK------------------ELRK--------- +------------------------------------------------------------ +-----------------------------------------AQ-AGASAEMKLAKISMVI +ITQFMLSWSPYAIIALLAQF-GPAE-W-VTPYAAELPVLFAKASAIHNPIVYSVSHPKFR +EAIQ-TTFPWLLTCCQFDEKEC-EDA-NDAEE---EVV-ASER--GGESRDAAQMKEMMA +MMQKMQAQQAAYQP---PPPPQGYPPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQG +APPQVEAPQGAPPQGVDNQAYQA--- +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +--------------------MG-------------------------------------- +-----------------------RDL--R-------------------DNETWWY----- +---NPSIV----------VHPHWREF-------------DQVPDAVYYSLGIFIGICGII +GCGGNGIVIYLFTKTKSLQTPANMFIINLAFSDFTFSLVNGFPLMTISCFL-KKWI--FG +FAACKVYGFIGGIFGFMSIMTMAMISIDRYNVIGRPMAASKKMSHRRAFIMIIFVWLWSV +LWAIG-PIFG-WG-----AYTLEGVLCNCSFDYISRD--STTRSNILCMFILGFFGPILI +IFFCYFNIVMSVSNHEKEMAAMAKRLNAK------------------ELRK--------- +------------------------------------------------------------ +-----------------------------------------AQ-AGANAEMRLAKISIVI +VSQFLLSWSPYAVVALLAQF-GPLE-W-VTPYAAQLPVMFAKASAIHNPMIYSVSHPKFR +EAIS-QTFPWVLTCCQFDDKET-EDD-KDAET---EIP-AGESSDAAPSADAAQMKEMMA +MMQKMQQQQAAYPPQGYAPPPQGYPPQGYPPQGY--PPQGYPPQGYPP---PPQGAPPQG +APP------AAPPQGVDNQAYQA--- +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +------------------------------------------------------------ +------------------------------------------------------MPHLLS +GFLEVTAS----------PAPTW---DAPPDNVSGCGEQINYGRVEKVVIGSILTLITLL +TIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-MPFVSVTDLIGGKWI--FG +HFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSA +SITLP-PLFG-WA-----QNVNDDKVCLISQDF----------GYTIYSTAVAFYIPMSV +MLFMYYQIYKAARKSAAKHKF--------------PGFPRVQPESVISLNG--------- +-------------------------------------------VVKLQKE---------- +--------VEECAN------------------LSRLLKHERKNISIFKREQKAATTLGII +VGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLR +PTSR-SLLQ----CQYRNINRKLSAA-GMHEA--LKLA-ERPE----RSEFVLQNSDHCG +------------------------------------------------------------ +--------------------KKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +------------------------------------------------------------ +------------------------------------------------------MPHLLS +GFLEVTAS----------PAPTW---DAPPDNVSGCGEQINYGRVEKVVIGSILTLITLL +TIAGNCLVVISVSFVKKLRQPSNYLIVSLALADLSVAVAV-MPFVSVTDLIGGKWI--FG +HFFCNVFIAMDVMCCTASIMTLCVISIDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSA +SITLP-PLFG-WA-----QNVNDDKVCLISQDF----------GYTIYSTAVAFYIPMSV +MLFMYYQIYKAARKSAAKHKF--------------PGFPRVQPESVISLNG--------- +-------------------------------------------VVKLQKE---------- +--------VEECAN------------------LSRLLKHERKNISIFKREQKAATTLGII +VGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFNRDLR +TTYR-SLLQ----CQYRNINRKLSAA-GMHEA--LKLA-ERPE----RSEFVLQNSDHCG +------------------------------------------------------------ +--------------------KKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +--------------------MDVLSPG--------------------------------- +-----------------------------------------------QGNNT-------- +---TSPPAPF-------ETGGNTTGISD-------------VTVSYQVITSLLLGTLIFC +AVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-LPMAALYQVL-NKWT--LG +QVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAALISLTWLIGF +LISIP-PMLG-WRTPEDRSDPD---ACTISKDH----------GYTIYSTFGAFYIPLLL +MLVLYGRIFRAARFRIRKTVKKVEKTGADTRHGASPAPQPKK-----SVNG--ESGSRNW +RLGVESKAGGALCANGAVRQGDDGAAL--EVIEVHRVGNSKEHLPLPSEAGPTPCAPAS- +-----------------FERKNERNA-------------EAKRKMALARERKTVKTLGII +MGTFILCWLPFFIVALVLPF-CESSCH-MPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQ +NAFK-KIIK----CKFCR------------------------------------------ +------------------------------------------------------------ +-------------------------Q +> 33=p A35181 serotonin receptor class 1A - rat +--------------------MDVFSFG--------------------------------- +-----------------------------------------------QGNNT-------- +---TASQEPF-------GTGGNVTSISD-------------VTFSYQVITSLLLGTLIFC +AVLGNACVVAAIALERSLQNVANYLIGSLAVTDLMVSVLV-LPMAALYQVL-NKWT--LG +QVTCDLFIALDVLCCTSSILHLCAIALDRYWAITDPIDYVNKRTPRRAAALISLTWLIGF +LISIP-PMLG-WRTPEDRSDPD---ACTISKDH----------GYTIYSTFGAFYIPLLL +MLVLYGRIFRAARFRIRKTVRKVEKKGAGTSLGTSSAPPPKK-----SLNG--QPGSGDW +RRCAENRAVGTPCTNGAVRQGDDEATL--EVIEVHRVGNSKEHLPLPSESGSNSYAPAC- +-----------------LERKNERNA-------------EAKRKMALARERKTVKTLGII +MGTFILCWLPFFIVALVLPF-CESSCH-MPALLGAIINWLGYSNSLLNPVIYAYFNKDFQ +NAFK-KIIK----CKFCR------------------------------------------ +------------------------------------------------------------ +-------------------------R +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +--------------------MANFTFGDLALDVARMGGLASTPSGLRS-----TGLTTPG +LSPTGLVTSDFNDSYGLTGQFINGSH--SSRSRD-----------NASANDT-------- +---SATNM----------TDDRYWSLTV-------------YSHEHLVLTSVILGLFVLC +CIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-MPLSVVSEIS-KVWF--LH +SEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRRRSARRILLMIMVVWIVAL +FISIP-PLFG-WRDPNN--DPDKTGTCIISQDK----------GYTIFSTVGAFYLPMLV +MMIIYIRIWLVARSRIRKDKFQMTKARLKTEETTLVASPKTEYSVVSDCNGCNSPDSTTE +KKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVNSNSSSSERLKQIQIETAEAFANGCA +EEASIAMLERQCNNGKKISSNDTPYS-------------RTREKLELKRERKAARTLAII +TGAFLICWLPFFIIALIGPF-VDPE-G-IPPFARSFVLWLGYFNSLLNPIIYTIFSPEFR +SAFQ-KILF----GKYRR----GH------------------------------------ +------------------------------------------------------------ +-------------------------R +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +--------------------MANFTFGDLALDVARMGGLASTPSGLRS-----TGLTTPG +LSPTGLVTSDFNDSYGLTGQFINGSH--SSRSRD-----------NASANDT-------- +---SATNM----------TDDRYWSLTV-------------YSHEHLVLTSVILGLFVLC +CIIGNCFVIAAVMLERSLHNVANYLILSLAVADLMVAVLV-MPLSVVSEIS-KVWF--LH +SEVCDMWISVDVLCCTASILHLVAIAMDRYWAVTS-IDYIRRRSARRILLMIMVVWIVAL +FISIP-PLFG-WRDPNN--DPDKTGTCIISQDK----------GYTIFSTVGAFYLPMLV +MMIIYIRIWLVARSRIRKDKFQMTKARLKTEETTLVASPKTEYSVVSDCNGCNSPDSTTE +KKKRRAPFKSYGCSPRPERKKNRAKKLPENANGVNSNSSSSERLKQIQIETAEAFANGCA +EEASIAMLERQCNNGKKISSNDTPYS-------------RTREKLELKRERKAARTLAII +TGAFLICWLPFFIIALIGPF-VDPE-G-IPPFARSFVLWLGYFNSLLNPIIYTIFSPEFR +SAFQ-KILF----GKYRR----GH------------------------------------ +------------------------------------------------------------ +-------------------------R +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +--------------------ME-------------------------------------- +-----------------------GAE--GQEELDWEALYLRLPLQNCSWNSTGWEPN--- +--WNVTVV----------PNTTWWQASAPFDT--------PAALVRAAAKAVVLGLLILA +TVVGNVFVIAAILLERHLRSAANNLILSLAVADLLVACLV-MPLGAVYEVV-QRWT--LG +PELCDMWTSGDVLCCTASILHLVAIALDRYWAVTN-IDYIHASTAKRVGMMIACVWTVSF +FVCIA-QLLG-WKDPDWNQRVSEDLRCVVSQDV----------GYQIFATASSFYVPVLI +ILILYWRIYQTARKRIRR------RRGATARGGVGPPPVPAGGALV-AGGG--------- +-------------------SGGIAAAV---------VAVIGRPLPTISETTTTGFTNVSS +NNTSPE--KQSCANGLEADPPTTGYGAVAAAYYPSLVRRKPKEAADSKRERKAAKTLAII +TGAFVACWLPFFVLAILVPT-CD--CE-VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFR +HAFQ-RLLC----GRRVRR-RRAP------------------------------------ +------------------------------------------------------------ +-------------------------Q diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi b/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi new file mode 100644 index 0000000000..237ed0dc7d --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +MN---------------------------------------------------------- +----GTEG--DNFY------------VPFSNKTG----------------------LARS +PYEYPQY------YLAEPWKYSALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYIL +LNLAMANLFMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLA +IERYIVICKPMGNF-RFGNTHAIMGVAFTWIMALAC-AAPPLVG-WS-----RYIPEGMQ +CSCGPDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTVKEAAAAQQESA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEKEVTRMVVLMVIGFLVCWV +PYASVAFYIFT---HQGSD-FGATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTLC +C---GKNPLGDDE-SGA-STSKTEVSSVS-TSPV-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +MN---------------------------------------------------------- +----GTEG--PNFY------------VPFSNITG----------------------VVRS +PFEQPQY------YLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYIL +LNLAVADLFMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLA +IERYVVVCKPMSNF-RFGENHAIMGVAFTWVMALAC-AAPPLVG-WS-----RYIPEGMQ +CSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------TTQKAEKEVTRMVIIMVIFFLICWL +PYASVAMYIFT---HQGSN-FGPIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSLC +C---GKNPLGDDE-ASA-TASKTE------TSQV-------------------------- +------------------------------------------------------------ +-----------APA--- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +MN---------------------------------------------------------- +----GTEG--INFY------------VPMSNKTG----------------------VVRS +PFEYPQY------YLAEPWKYRLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYIL +VNLAVADLFMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLA +IERYIVVCKPMGNF-RFSATHAMMGIAFTWVMAFSC-AAPPLFG-WS-----RYMPEGMQ +CSCGPDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKVREAAAQQQESA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------TTQKAEKEVTRMVILMVLGFMLAWT +PYAVVAFWIFT---NKGAD-FTATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTIC +C---GKNPFGDEDVSSTVSQSKTEVSSVS-SSQV-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +MN---------------------------------------------------------- +----GTEG--KNFY------------VPMSNRTG----------------------LVRS +PFEYPQY------YLAEPWQFKILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFIL +VNLAVAGTIMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLA +IERYIVVCKPMGSF-KFSSSHAFAGIAFTWVMALAC-AAPPLFG-WS-----RYIPEGMQ +CSCGPDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTVKAAAAQQQDSA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEREVTKMVILMVFGFLIAWT +PYATVAAWIFF---NKGAD-FSAKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTIF +C---GKNPLGDDE-SSTVSTSKTEVSS------V-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +MN---------------------------------------------------------- +----GTEG--NNFY------------VPLSNRTG----------------------LVRS +PFEYPQY------YLAEPWQFKLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFIL +VNLAVAGAIMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLA +IERYIVVCKPMGSF-KFSSTHASAGIAFTWVMAMAC-AAPPLVG-WS-----RYIPEGIQ +CSCGPDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTVKAAAAQQQDSA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEREVTKMVILMVLGFLVAWT +PYATVAAWIFF---NKGAA-FSAQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTLF +C---GKNPLGDEE-SSTVSTSKTEVSS------V-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +MK---------------------------------------------------------- +----QVPEFHEDFY------IPIP--LDINNLSA------------------------YS +PFLVPQD------HLGNQGIFMAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYIL +VNLSIANLFVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVA +FERWLVICKPLGNF-TFKTPHAIAGCILPWISALAA-SLPPLFG-WS-----RYIPEGLQ +CSCGPDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITLKLAAKAQADSA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEREVTKMVVVMVLGFLVCWA +PYASFSLWIVS---HRGEE-FDLRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMMKMVC +----GKN-IEEDE-AST-SSQVTQVSSVA-PEK--------------------------- +------------------------------------------------------------ +----------------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +MR---------------------------------------------------------- +----KMSE--EEFY------------L-FKNISS----------------------V--G +PWDGPQY------HIAPVWAFYLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYIL +VNVSFGGFLLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLA +FERYIVICKPFGNF-RFSSKHALTVVLATWTIGIGV-SIPPFFG-WS-----RFIPEGLQ +CSCGPDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRALKAVAAQQQESA--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------TTQKAEREVSRMVVVMVGSFCVCYV +PYAAFAMYMVN---NRNHG-LDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIMKMVC +----GKA-MTDES-DTC-SSQKTEVSTVS-STQV-------------------------- +------------------------------------------------------------ +-----------GPN--- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------DLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIIS +WERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVW-TAPPIFG-WS-----RYWPHGLK +TSCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEKEVTRMVVVMVLAFC---- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MA------QQWS-LQRLAGRHPQDS--------------------------YED------ +----STQS--SIFT------------YTNSNSTR-------------------------G +PFEGPNY------HIAPRWVYHLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWIL +VNLAVADLAETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIIS +WERWMVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVW-TAPPIFG-WS-----RYWPHGLK +TSCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEKEVTRMVVVMVLAFCFCWG +PYAFFACFAAA---NPGYP-FHPLMAALPAFFAKSATIYNPVIYVFMNRQFRNCILQLF- +----GKK-VDDGS-ELS-SASKTEVSSV---SSV-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 10== Z68193 1 human Red Opsin <>[] +MA------QQWS-LQRLAGRHPQDS--------------------------YED------ +----STQS--SIFT------------YTNSNSTR-------------------------G +PFEGPNY------HIAPRWVYHLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWIL +VNLAVADLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIIS +WERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWSAVW-TAPPIFG-WS-----RYWPHGLK +TSCGPDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAIRAVAKQQKESE--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEKEVTRMVVVMIFAYCVCWG +PYTFFACFAAA---NPGYA-FHPLMAALPAYFAKSATIYNPVIYVFMNRQFRNCILQLF- +----GKK-VDDGS-ELS-SASKTEVSSV---SSV-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MT------EAWNVAVFAARRSRDD----------------------------DD------ +----TTRG--SVFT------------YTNTNNTR-------------------------G +PFEGPNY------HIAPRWVYNLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWIL +VNLAFVDLVETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIIS +WERWFVVCKPFGNI-KFDSKLAIIGIVFSWVWAWGW-SAPPIFG-WS-----RYWPHGLK +TSCGPDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAIRAVAAQQKESE--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEREVSRMVVVMIVAFCICWG +PYASFVSFAAA---NPGYA-FHPLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIMQLF- +----GKK-VDDGS-EAS-TTSRTEVSSVS-NSSV-------------------------- +------------------------------------------------------------ +-----------APA--- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-------AWE-AAFAARRRHEE----------------------------ED------ +----TTRD--SVFT------------YTNSNNTR-------------------------G +PFEGPNY------HIAPRWVYNLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWIL +VNLAVADLGETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIIS +WERWFVVCKPFGNI-KFDGKLAVAGILFSWLWSCAW-TAPPIFG-WS-----RYWPHGLK +TSCGPDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAIRAVAAQQKESE--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------STQKAEKEVSRMVVVMIVAYCFCWG +PYTFFACFAAA---NPGYA-FHPLAAALPAYFAKSATIYNPIIYVFMNRQFRNCILQLF- +----GKK-VDDGS-EVS--TSRTEVSSVS-NSSV-------------------------- +------------------------------------------------------------ +-----------SPA--- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +MS---------------------------------------------------------- +----SNSS------------------QAPPNGTP-------------------------G +PFDGPQWP-----YQAPQSTYVGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYIL +VNLAVADLLVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILA +LERYVVVCKPLGDF-QFQRRHAVSGCAFTWGWALLW-SAPPLLG-WS-----SYVPEGLR +TSCGPNWYTGGS--NNNSYILSLFVTCFVLPLSLILFSYTNLLLTLRAAAAQQKEAD--- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------------------------TTQRAEREVTRMVIVMVMAFLLCWL +PYSTFALVVAT---HKGII-IQPVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLLEMLC +C---GYQPQRTGKASPGTPGPHADVTAAGLRNKV-------------------------- +------------------------------------------------------------ +-----------MPAHPV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +MESGNVS----------------------------------------------------- +SSLFGNVS--TALR-------------PEARLSA---E------TRLLGWNVPPEELRHI +PEHWLTY------PEPPESMNYLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILV +INLAFCDFMMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIA +YDRFNVITRPMEG--KMTHGKAIAMIIFIYMYATPW-VVACYTETWG-----RFVPEGYL +TSCTFDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKM +NVE------------------SLRS----------------------------------- +------------------------------------------------------------ +-------------------------------NVDKNKETAEIRIAKAAITICFLFFCSWT +PYGVMSLIGAF---GDKTL-LTPGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCP +WL--ALNEKAPES-SAV-ASTST---TQE-PQQT-------------------------- +------------------------------------------------------------ +-----------TAA--- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +MEYHNVS----------------------------------------------------- +SVL-GNVS--SVLR-------------PDARLSA---E------SRLLGWNVPPDELRHI +PEHWLIY------PEPPESMNYLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILV +INLAFCDFMMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIA +YDRYNVITRPMEG--KMTHGKAIAMIIFIYLYATPW-VVACYTESWG-----RFVPEGYL +TSCTFDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKM +NVD------------------SLRS----------------------------------- +------------------------------------------------------------ +-------------------------------NVDKSKEAAEIRIAKAAITICFLFFASWT +PYGVMSLIGAF---GDKTL-LTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCP +WL--AISEKAPES-RAA-ISTST---TQE-QQQT-------------------------- +------------------------------------------------------------ +-----------TAA--- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +ME---------------------------------------------------------- +-PLCNASE--PPLR-------------PEAR-SSGNGD------LQFLGWNVPPDQIQYI +PEHWLTQ------LEPPASMHYMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFV +LNLAVFDLIMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIG +YDRYNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFWD-----RFVPEGYL +TSCSFDYLSDN--FDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKKM +NVE------------------SLRS----------------------------------- +------------------------------------------------------------ +-------------------------------NVDKSKETAEIRIAKAAITICFLFFVSWT +PYGVMSLIGAF---GDKSL-LTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCP +WL--GVNEKSGEI-SSA-QSTTT---QEQ--QQT-------------------------- +------------------------------------------------------------ +-----------TAA--- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +MD---------------------------------------------------------- +-ALCNASE--PPLR-------------PEARMSSGSDE------LQFLGWNVPPDQIQYI +PEHWLTQ------LEPPASMHYMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFV +LNLAVFDLIMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIG +YDRYNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFWD-----RFVPEGYL +TSCSFDYLSDN--FDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKKM +NVE------------------SLRS----------------------------------- +------------------------------------------------------------ +-------------------------------NVDKSKETAEIRIAKAAITICFLFFVSWT +PYGVMSLIGAF---GDKSL-LTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCP +WL--GVNEKSGEA-SSA-QSTTT---QEQ-TQQT-------------------------- +------------------------------------------------------------ +-----------SAA--- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +MT---------------------------------------------------------- +----NATG--PQMAY-----------YGAASMDFGYPE------GVSIVDFVRPEIKPYV +HQHWYNY------PPVNPMWHYLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILV +VNLALSDLIMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMIS +FDRYNIICNGFNGP-KLTTGKAVVFALISWVIAIGC-ALPPFFG-WG-----NYILEGIL +DSCSYDYLTQD--FNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKKM +NVS------------------TLRS----------------------------------- +------------------------------------------------------------ +--------------------------------NEADAQRAEIRIAKTALVNVSLWFICWT +PYALISLKGVM---GDTSG-ITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLP +WF--CVHETETKS-NDD-SQSNS---TVA-Q----------------------------- +------------------------------------------------------------ +-----------DKA--- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +MA---------------------------------------------------------- +----NVTG--PQMAF-----------YGSGAATFGYPE------GMTVADFVPDRVKHMV +LDHWYNY------PPVNPMWHYLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLI +VNLALSDLIMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMIS +FDRYNIICNGFNGP-KLTQGKATFMCGLAWVISVGW-SLPPFFG-WG-----SYTLEGIL +DSCSYDYFTRD--MNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKKM +NVT------------------NLRS----------------------------------- +------------------------------------------------------------ +--------------------------------NEAETQRAEIRIAKTALVNVSLWFICWT +PYAAITIQGLL---GNAEG-ITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLP +WF--CVHEKDPND-VEE-NQSSN---TQT-Q----------------------------- +------------------------------------------------------------ +-----------EKS--- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +MESF-------------------------------------------------------- +AVAAAQLG--PHFA----------------PLS-----------NGSVVDKVTPDMAHLI +SPYWNQF------PAMDPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLV +INLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMIS +LDRYQVIVKGMAGR-PMTIPLALGKM---------------------------YVPEGNL +TSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKM +NVK------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SEDAEKSAEGKLAKVALVTITLWFMAWT +PYLVINCMGLF---KF-EG-LTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCP +CC--VFGKVDDGK-SSD-AQSQA-TASEA-E----------------------------- +------------------------------------------------------------ +-----------SKA--- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +MESF-------------------------------------------------------- +AVAAAQLG--PHFA----------------PLS-----------NGSVVDKVTPDMAHLI +SPYWNQF------PAMDPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLV +INLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMIS +LDRYQVIVKGMAGR-PMTIPLALGKIAYIWFMSSIW-CLAPAFG-WS-----RYVPEGNL +TSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKM +NVK------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SEDAEKSAEGKLAKVALVTITLWFMAWT +PYLVINCMGLF---KF-EG-LTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCP +CC--VFGKVDDGK-SSD-AQSQA-TASEA-E----------------------------- +------------------------------------------------------------ +-----------SKA--- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +MDSF-------------------------------------------------------- +AAVATQLG--PQFA----------------APS-----------NGSVVDKVTPDMAHLI +SPYWDQF------PAMDPIWAKILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLV +INLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMIS +LDRYQVIVKGMAGR-PMTIPLALGKIAYIWFMSTIWCCLAPVFG-WS-----RYVPEGNL +TSCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKM +NVK------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SEDADKSAEGKLAKVALVTISLWFMAWT +PYLVINCMGLF---KF-EG-LTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCP +CC--VFGKVDDGK-SSE-AQSQA-TTSEA-E----------------------------- +------------------------------------------------------------ +-----------SKA--- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MERSHLP---------------------------------------------------ET +PFDLAHSG--PRFQ----------------AQSSG---------NGSVLDNVLPDMAHLV +NPYWSRF------APMDPMMSKILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLV +LNLAFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIA +FDRYNVIVKGINGT-PMTIKTSIMKILFIWMMAVFW-TVMPLIG-WS-----AYVPEGNL +TACSIDYMTRM--WNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKKM +NVK------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SEDCDKSAEGKLAKVALTTISLWFMAWT +PYLVICYFGLF---KI-DG-LTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCP +MC--VFGNTDEPK-PDA-PASDTETTSEA-D----------------------------- +------------------------------------------------------------ +-----------SKA--- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MERSLLP---------------------------------------------------EP +PLAMALLG--PRFE----------------AQTGG---------NRSVLDNVLPDMAPLV +NPHWSRF------APMDPTMSKILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLV +LNLAFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIA +FDRYNVIVKGINGT-PMTIKTSIMKIAFIWMMAVFW-TIMPLIG-WS-----SYVPEGNL +TACSIDYMTRQ--WNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKKM +NVK------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SEDCDKSAENKLAKVALTTISLWFMAWT +PYLIICYFGLF---KI-DG-LTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCP +MC--VCGTTDEPK-PDA-PPSDTETTSEA-E----------------------------- +------------------------------------------------------------ +-----------SKD--- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +MI---------------------------------------------------------- +----AVSG--PSYE----------------AFSYGGQAR---FNNQTVVDKVPPDMLHLI +DANWYQY------PPLNPMWHGILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFV +INLAISNFLMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIA +FDRYNVIVKGLSGK-PLSINGALIRIIAIWLFSLGW-TIAPMFG-WN-----RYVPEGNM +TACGTDYFNRG--LLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKKM +NVA------------------SLRS----------------------------------- +------------------------------------------------------------ +--------------------------------SENQNTSAECKLAKVALMTISLWFMAWT +PYLVINFSGIF---NL-VK-ISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFP +SL--AC-AAEPSS-DAV-STTSG-TTTVT-DNEK-------------------------- +------------------------------------------------------------ +-----------SNA--- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +M----------------------------------------------------------- +-----ANQ--LSYS----------------SLGWPYQP------NASVVDTMPKEMLYMI +HEHWYAF------PPMNPLWYSILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLV +VNLAFSDFCMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMIT +LDRYNVIVRGMAAA-PLTHKKATLLLLFVWIWSGGW-TILPFFG-WS-----RYVPEGNL +TSCTVDYLTKD--WSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKKM +NVA------------------SLRA----------------------------------- +------------------------------------------------------------ +-------------------------------NADQQKQSAECRLAKVAMMTVGLWFMAWT +PYLIISWAGVF---SSGTR-LTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFP +SL--ACGSGESGS-DVK-SEASA-TTTME-EKPK-------------------------- +------------------------------------------------------------ +----------IPEA--- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +MV---------------------------------------------------------- +----ESTT--------------------LVNQTWWY--------NPTVD----------I +HPHWAKF------DPIPDAVYYSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFI +INLAMSDLSFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMIS +IDRYNVIGRPMAASKKMSHRRAFLMIIFVWMWSIVW-SVGPVFN-WG-----AYVPEGIL +TSCSFDYLSTD--PSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKRL +NAK------------------ELRK----------------------------------- +------------------------------------------------------------ +--------------------------------AQ-AGASAEMKLAKISMVIITQFMLSWS +PYAIIALLAQF---GPAEW-VTPYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQTTFP +WLLTCCQFDEKEC-EDA-NDAEE---EVV-ASER--GGESRDAAQMKEMMAMMQKMQAQQ +AAYQP---PPPPQGYPPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAPPQVEAPQ +GAPPQGVDNQAYQA--- +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +MG---------------------------------------------------------- +----RDLR---------------------DNETWWY--------NPSIV----------V +HPHWREF------DQVPDAVYYSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFI +INLAFSDFTFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMIS +IDRYNVIGRPMAASKKMSHRRAFIMIIFVWLWSVLW-AIGPIFG-WG-----AYTLEGVL +CNCSFDYISRD--STTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKRL +NAK------------------ELRK----------------------------------- +------------------------------------------------------------ +--------------------------------AQ-AGANAEMRLAKISIVIVSQFLLSWS +PYAVVALLAQF---GPLEW-VTPYAAQLPVMFAKASAIHNPMIYSVSHPKFREAISQTFP +WVLTCCQFDDKET-EDD-KDAET---EIP-AGESSDAAPSADAAQMKEMMAMMQKMQQQQ +AAYPPQGYAPPPQGYPPQGYPPQGY--PPQGYPPQGYPP---PPQGAPPQGAPP------ +AAPPQGVDNQAYQA--- +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +----------PHLL------------SGFLEVTASPAPTWDAPPDNVSG----------- +---------CGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLI +VSLALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVIS +IDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-WA-----QNVNDDKV +CLISQDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPG--- +-----------FPRVQPESVISLNG----------------------------------- +---------------------------VVKLQKE-------------------VEECAN- +-----------------LSRLLKH------ERKNISIFKREQKAATTLGIIVGAFTVCWL +PFFLLSTARPFICGTSCSC-IPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLLQ +----CQYRNINRKLSAA-GMHEALKLAER-PERS-------------EFVL--------- +------------------------------------------------------------ +----QNSDHCGKKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +----------PHLL------------SGFLEVTASPAPTWDAPPDNVSG----------- +---------CGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLI +VSLALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVIS +IDRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-WA-----QNVNDDKV +CLISQDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPG--- +-----------FPRVQPESVISLNG----------------------------------- +---------------------------VVKLQKE-------------------VEECAN- +-----------------LSRLLKH------ERKNISIFKREQKAATTLGIIVGAFTVCWL +PFFLLSTARPFICGTSCSC-IPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLLQ +----CQYRNINRKLSAA-GMHEALKLAER-PERS-------------EFVL--------- +------------------------------------------------------------ +----QNSDHCGKKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +MDVLS------------------------------------------------------- +--------------------------PGQGNNTTSPPAPFETGGNTTGI----------- +-------------SDVTVSYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLI +GSLAVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIA +LDRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP---EDRSDPDA +CTISKDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVKKVEKT +GADTRHGASPAPQPKK-----SVNGE--SGSRNWRLGVESKAGGALC------------- +-----------------------------------ANGAVRQGDDGAALEVIEVHRVGNS +KEHLPLPSEAG--PTPCAPASFERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWL +PFFIVALVLPF---CESSCHMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIK +----CKFCR--------------------------------------------------- +------------------------------------------------------------ +----------------Q +> 33=p A35181 serotonin receptor class 1A - rat +MDVFS------------------------------------------------------- +--------------------------FGQGNNTTASQEPFGTGGNVTSI----------- +-------------SDVTFSYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLI +GSLAVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIA +LDRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP---EDRSDPDA +CTISKDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVRKVEKK +GAGTSLGTSSAPPPKK-----SLNGQ--PGSGDWRRCAENRAVGTPC------------- +-----------------------------------TNGAVRQGDDEATLEVIEVHRVGNS +KEHLPLPSESG--SNSYAPACLERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWL +PFFIVALVLPF---CESSCHMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIK +----CKFCR--------------------------------------------------- +------------------------------------------------------------ +----------------R +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +MANFTFGDLALD-VARMGGLASTPSGLRS-----TGLTTPGLSPTGLVTSDFNDSYGLTG +QFINGSHS--SRSRD-----------NASANDT-----------SATNM----------T +DDRYWSL------TVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLI +LSLAVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIA +MDRYWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGT +CIISQDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKA +RLKTEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKK +LPENANGVNSNSSS----------SERLKQIQIETAEAFANGCAEEASIAML-ERQCNNG +KK-------------------ISSNDTPYSRTREKLELKRERKAARTLAIITGAFLICWL +PFFIIALIGPF---VDPEG-IPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILF +----GKYRRGH------------------------------------------------- +------------------------------------------------------------ +----------------R +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +MANFTFGDLALD-VARMGGLASTPSGLRS-----TGLTTPGLSPTGLVTSDFNDSYGLTG +QFINGSHS--SRSRD-----------NASANDT-----------SATNM----------T +DDRYWSL------TVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLI +LSLAVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIA +MDRYWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGT +CIISQDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKA +RLKTEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKK +LPENANGVNSNSSS----------SERLKQIQIETAEAFANGCAEEASIAML-ERQCNNG +KK-------------------ISSNDTPYSRTREKLELKRERKAARTLAIITGAFLICWL +PFFIIALIGPF---VDPEG-IPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILF +----GKYRRGH------------------------------------------------- +------------------------------------------------------------ +----------------R +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +ME---------------------------------------------------------- +----GAEG--QEELDWEALYLRLPLQNCSWNSTGWEPN-----WNVTVV----------P +NTTWWQASAPFD-TPAALVRAAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLI +LSLAVADLLVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIA +LDRYWAVTN-IDYIHASTAKRVGMMIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDLR +CVVSQDV----------GYQIFATASSFYVPVLIILILYWRIYQTARKRIRRRRGATARG +GVG---------------------------------------------PPP--------- +VPAGGALVAGGGSGGIAAAVVAVIGRPLPTISETTTTGFTNVSSNNTSPE---KQSCANG +LEADPPTTGYGAVAAAYYPSLVRR------KPKEAADSKRERKAAKTLAIITGAFVACWL +PFFVLAILVPT---CDCE--VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQRLLC +----GRRVRRRRA----------------------------------------------- +----P------------------------------------------------------- +----------------Q diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi.allowshift b/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi.allowshift new file mode 100644 index 0000000000..f25571d59c --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.ginsi.allowshift @@ -0,0 +1,684 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +M----------------------------------------------------------- +---NG------------TEGDNFYVPFSNKTGLAR------------------------- +----------------------------------SP---------------------YEY +--------------------PQY---------------------YLAEPW---------- +-----------KYSALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNLAMANL +FMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIERYIVIC +KPMGNFRF-GNTHAIMGVAFTWIMALAC-AAPPLV-GWSR-------YIPEGMQCSCGPD +YYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTVKEAAAAQQESA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEKEVTRMVVLMVIGFLVCWVPYASVAFYIFT-HQG-SD-FG +ATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTLCC--------------------- +------------------------------------------------------------ +-----------------------------------------GKN-PLGDDE-SGA----S +TSKTE------------------VSSVSTSPV-------------------------S-- +--------------------------------------PA +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +M----------------------------------------------------------- +---NG------------TEGPNFYVPFSNITGVVR------------------------- +----------------------------------SP---------------------FEQ +--------------------PQY---------------------YLAEPW---------- +-----------QFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADL +FMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIERYVVVC +KPMSNFRF-GENHAIMGVAFTWVMALAC-AAPPLV-GWSR-------YIPEGMQCSCGID +YYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------TTQKAEKEVTRMVIIMVIFFLICWLPYASVAMYIFT-HQG-SN-FG +PIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSLCC--------------------- +------------------------------------------------------------ +-----------------------------------------GKN-PLGDDE-ASA----T +ASKTE-----------------------TSQV-------------------------A-- +--------------------------------------PA +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +M----------------------------------------------------------- +---NG------------TEGINFYVPMSNKTGVVR------------------------- +----------------------------------SP---------------------FEY +--------------------PQY---------------------YLAEPW---------- +-----------KYRLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNLAVADL +FMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIERYIVVC +KPMGNFRF-SATHAMMGIAFTWVMAFSC-AAPPLF-GWSR-------YMPEGMQCSCGPD +YYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKVREAAAQQQESA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------TTQKAEKEVTRMVILMVLGFMLAWTPYAVVAFWIFT-NKG-AD-FT +ATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTICC--------------------- +------------------------------------------------------------ +-----------------------------------------GKN-PFGDEDVSST---VS +QSKTE------------------VSSVSSSQV-------------------------S-- +--------------------------------------PA +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +M----------------------------------------------------------- +---NG------------TEGKNFYVPMSNRTGLVR------------------------- +----------------------------------SP---------------------FEY +--------------------PQY---------------------YLAEPW---------- +-----------QFKILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNLAVAGT +IMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVC +KPMGSFKF-SSSHAFAGIAFTWVMALAC-AAPPLF-GWSR-------YIPEGMQCSCGPD +YYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTVKAAAAQQQDSA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEREVTKMVILMVFGFLIAWTPYATVAAWIFF-NKG-AD-FS +AKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTIFC--------------------- +------------------------------------------------------------ +-----------------------------------------GKN-PLGDDE-SST---VS +TSKTE------------------VSS-----V-------------------------S-- +--------------------------------------PA +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +M----------------------------------------------------------- +---NG------------TEGNNFYVPLSNRTGLVR------------------------- +----------------------------------SP---------------------FEY +--------------------PQY---------------------YLAEPW---------- +-----------QFKLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNLAVAGA +IMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIERYIVVC +KPMGSFKF-SSTHASAGIAFTWVMAMAC-AAPPLV-GWSR-------YIPEGIQCSCGPD +YYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTVKAAAAQQQDSA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEREVTKMVILMVLGFLVAWTPYATVAAWIFF-NKG-AA-FS +AQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTLFC--------------------- +------------------------------------------------------------ +-----------------------------------------GKN-PLGDEE-SST---VS +TSKTE------------------VSS-----V-------------------------S-- +--------------------------------------PA +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +MK---------------------------------------------------------- +-----------------------------------QVPEF-------------------- +---------------HEDFYIPIPL-DINNLSAYSP---------------------FLV +--------------------PQD---------------------HLGNQG---------- +-----------IFMAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNLSIANL +FVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFERWLVIC +KPLGNFTF-KTPHAIAGCILPWISALAA-SLPPLF-GWSR-------YIPEGLQCSCGPD +WYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITLKLAAKAQADSA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEREVTKMVVVMVLGFLVCWAPYASFSLWIVS-HRG-EE-FD +LRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMMKMVC---------------------- +------------------------------------------------------------ +-----------------------------------------GKN--IEEDE-AST----S +SQVTQ------------------VSSVAP------------------------------- +--------------------------------------EK +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +M----------------------------------------------------------- +----------------------------------RKMSE--------------------- +----------------EEFYL------FKNISSVGP---------------------WDG +--------------------PQY---------------------HIAPVW---------- +-----------AFYLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNVSFGGF +LLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFERYIVIC +KPFGNFRF-SSKHALTVVLATWTIGIGV-SIPPFF-GWSR-------FIPEGLQCSCGPD +WYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRALKAVAAQQQESA--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------TTQKAEREVSRMVVVMVGSFCVCYVPYAAFAMYMVN-NRN-HG-LD +LRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIMKMVC---------------------- +------------------------------------------------------------ +-----------------------------------------GKA--MTDES-DTC----S +SQKTE------------------VSTVSSTQV-------------------------G-- +--------------------------------------PN +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------------------------------------------------DL +AETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVC +KPFGNVRF-DAKLAIVGIAFSWIWAAVW-TAPPIF-GWSR-------YWPHGLKTSCGPD +VFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEKEVTRMVVVMVLAFC------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWSLQRLA------GRHPQDSYEDSTQS-------------------SIFTYTNS-- +---NS------------TR----------------------------------------- +----------------------------------GP---------------------FEG +--------------------PNY---------------------HIAPRW---------- +-----------VYHLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADL +AETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWMVVC +KPFGNVRF-DAKLAIVGIAFSWIWAAVW-TAPPIF-GWSR-------YWPHGLKTSCGPD +VFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEKEVTRMVVVMVLAFCFCWGPYAFFACFAAA-NPG-YP-FH +PLMAALPAFFAKSATIYNPVIYVFMNRQFRNCILQLF----------------------- +------------------------------------------------------------ +-----------------------------------------GKK--VDDGS-ELS----S +ASKTE------------------VSSV--SSV-------------------------S-- +--------------------------------------PA +> 10== Z68193 1 human Red Opsin <>[] +MAQQWSLQRLA------GRHPQDSYEDSTQS-------------------SIFTYTNS-- +---NS------------TR----------------------------------------- +----------------------------------GP---------------------FEG +--------------------PNY---------------------HIAPRW---------- +-----------VYHLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNLAVADL +AETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERWLVVC +KPFGNVRF-DAKLAIVGIAFSWIWSAVW-TAPPIF-GWSR-------YWPHGLKTSCGPD +VFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAIRAVAKQQKESE--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEKEVTRMVVVMIFAYCVCWGPYTFFACFAAA-NPG-YA-FH +PLMAALPAYFAKSATIYNPVIYVFMNRQFRNCILQLF----------------------- +------------------------------------------------------------ +-----------------------------------------GKK--VDDGS-ELS----S +ASKTE------------------VSSV--SSV-------------------------S-- +--------------------------------------PA +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNV--------------------------AVFAARRSRDDDDTTRGSVFTYTNT-- +---NN------------TR----------------------------------------- +----------------------------------GP---------------------FEG +--------------------PNY---------------------HIAPRW---------- +-----------VYNLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNLAFVDL +VETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWERWFVVC +KPFGNIKF-DSKLAIIGIVFSWVWAWGW-SAPPIF-GWSR-------YWPHGLKTSCGPD +VFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAIRAVAAQQKESE--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEREVSRMVVVMIVAFCICWGPYASFVSFAAA-NPG-YA-FH +PLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIMQLF----------------------- +------------------------------------------------------------ +-----------------------------------------GKK--VDDGS-EAS----T +TSRTE------------------VSSVSNSSV-------------------------A-- +--------------------------------------PA +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA----------------------------AWEAAFAARRRHEEEDTTRDSVFTYTNS-- +---NN------------TR----------------------------------------- +----------------------------------GP---------------------FEG +--------------------PNY---------------------HIAPRW---------- +-----------VYNLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNLAVADL +GETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWERWFVVC +KPFGNIKF-DGKLAVAGILFSWLWSCAW-TAPPIF-GWSR-------YWPHGLKTSCGPD +VFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAIRAVAAQQKESE--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------STQKAEKEVSRMVVVMIVAYCFCWGPYTFFACFAAA-NPG-YA-FH +PLAAALPAYFAKSATIYNPIIYVFMNRQFRNCILQLF----------------------- +------------------------------------------------------------ +-----------------------------------------GKK--VDDGS-EVS----T +-SRTE------------------VSSVSNSSV-------------------------S-- +--------------------------------------PA +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +MS-----------------------------------------------------SNSSQ +APPNG------------TP----------------------------------------- +----------------------------------GP---------------------FDG +--------------------PQW--------------------PYQAPQS---------- +-----------TYVGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNLAVADL +LVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALERYVVVC +KPLGDFQF-QRRHAVSGCAFTWGWALLW-SAPPLL-GWSS-------YVPEGLRTSCGPN +WYTGGSN--NNSYILSLFVTCFVLPLSLILFSYTNLLLTLRAAAAQQKEAD--------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------TTQRAEREVTRMVIVMVMAFLLCWLPYSTFALVVAT-HKG-II-IQ +PVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLLEMLCCGYQ------------------ +------------------------------------------------------------ +-------------------------------------PQRTGK----------------- +---------------------------------------------------------ASP +GTPGPHADVTAAGLRNKVMP----------------AHPV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +ME-----------------------------------------------------SGNVS +SSLFG------------NV----STA---------------------------------- +-------------------------------------LRPEARLSA--------ETRL-- +--------------LGW-----------------NV--PPEELRHIPEHWLTYPEPPE-- +----------SMNYLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINLAFCDF +MMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDRFNVIT +RPMEGK-M-THGKAIAMIIFIYMYATPW-VVACYTETWGR-------FVPEGYLTSCTFD +YLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVESLRSN-------------------------------------------------- +-----------VDKNKETAEIRIAKAAITICFLFFCSWTPYGVMSLIGAF-GDK-TL-LT +PGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCPWLA------------------- +------------------------------------------------------------ +----------------------------------------LNE--KAPES--SAV---AS +TSTTQ----------------------EPQQT-------------------------T-- +--------------------------------------AA +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +MEYHNVSSVLGNVSSV-------------------------------------------- +------------------------------------------------------------ +-------------------------------------LRPDARLSA--------ESRL-- +--------------LGW-----------------NV--PPDELRHIPEHWLIYPEPPE-- +----------SMNYLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINLAFCDF +MMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDRYNVIT +RPMEGK-M-THGKAIAMIIFIYLYATPW-VVACYTESWGR-------FVPEGYLTSCTFD +YLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVDSLRSN-------------------------------------------------- +-----------VDKSKEAAEIRIAKAAITICFLFFASWTPYGVMSLIGAF-GDK-TL-LT +PGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCPWLA------------------- +------------------------------------------------------------ +----------------------------------------ISE--KAPES--RAA---IS +TSTTQ----------------------EQQQT-------------------------T-- +--------------------------------------AA +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +ME---------------------------------------------------------- +-------------------------PLC-------NAS---------------------- +----------------------------------EPPLRPEAR-SSG-----NGDLQF-- +--------------LGW-----------------NV--PPDQIQYIPEHWLTQLEPPA-- +----------SMHYMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDL +IMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVIT +KPMNRN-M-TFTKAVIMNIIIWLYCTPW-VVLPLTQFWDR-------FVPEGYLTSCSFD +YLSDN--FDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVESLRSN-------------------------------------------------- +-----------VDKSKETAEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-GDK-SL-LT +QGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCPWLG------------------- +------------------------------------------------------------ +----------------------------------------VNE--KSGEI--SSA---QS +TTTQE----------------------Q-QQT-------------------------T-- +--------------------------------------AA +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +MD---------------------------------------------------------- +-------------------------ALC-------NAS---------------------- +----------------------------------EPPLRPEARMSSG-----SDELQF-- +--------------LGW-----------------NV--PPDQIQYIPEHWLTQLEPPA-- +----------SMHYMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNLAVFDL +IMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDRYNVIT +KPMNRN-M-TFTKAVIMNIIIWLYCTPW-VVLPLTQFWDR-------FVPEGYLTSCSFD +YLSDN--FDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVESLRSN-------------------------------------------------- +-----------VDKSKETAEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-GDK-SL-LT +PGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCPWLG------------------- +------------------------------------------------------------ +----------------------------------------VNE--KSGEA--SSA---QS +TTTQE----------------------QTQQT-------------------------S-- +--------------------------------------AA +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +MT---------------------------------------------------------- +-----------------------------------NAT---------------------- +----------------------------------GP------------------QMAYYG +A-----------ASMDFGY-P------EGVSIVDFV--RPEIKPYVHQHWYNYPPVNP-- +----------MWHYLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNLALSDL +IMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDRYNIIC +NGFNGPKL-TTGKAVVFALISWVIAIGC-ALPPFF-GWGN-------YILEGILDSCSYD +YLTQD--FNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVSTLRS--------------------------------------------------- +-----------NEADAQRAEIRIAKTALVNVSLWFICWTPYALISLKGVM-GDT-SG-IT +PLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLPWFC------------------- +------------------------------------------------------------ +----------------------------------------VHE----------------- +----------------------------------------TETKSNDDSQSNSTVAQD-- +--------------------------------------KA +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +MA---------------------------------------------------------- +-----------------------------------NVT---------------------- +----------------------------------GP------------------QMAFYG +S-----------GAATFGY-P------EGMTVADFV--PDRVKHMVLDHWYNYPPVNP-- +----------MWHYLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNLALSDL +IMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDRYNIIC +NGFNGPKL-TQGKATFMCGLAWVISVGW-SLPPFF-GWGS-------YTLEGILDSCSYD +YFTRD--MNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVTNLRS--------------------------------------------------- +-----------NEAETQRAEIRIAKTALVNVSLWFICWTPYAAITIQGLL-GNA-EG-IT +PLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLPWFC------------------- +------------------------------------------------------------ +----------------------------------------VHE--KDPNDV--------- +---------------------------EENQS------SNTQT-------------QE-- +--------------------------------------KS +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +ME---------------------------------------------------------- +------------------------------------------------------------ +-----------------------------------------------SFAVAAAQLG--- +--------------------PHFAP-LSNGSVVDKV--TPDMAHLISPYWNQFPAMDP-- +----------IWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDF +GIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIV +KGMAGRPM-TIPLALGKM-----------------------------YVPEGNLTSCGID +YLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVKSLRS--------------------------------------------------- +-----------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGLF--KF-EG-LT +PLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCV------------------- +------------------------------------------------------------ +----------------------------------------FG------------------ +-------------------------------KVDDGKSSDAQS------QATASEAES-- +--------------------------------------KA +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +ME---------------------------------------------------------- +------------------------------------------------------------ +-----------------------------------------------SFAVAAAQLG--- +--------------------PHFAP-LSNGSVVDKV--TPDMAHLISPYWNQFPAMDP-- +----------IWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDF +GIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIV +KGMAGRPM-TIPLALGKIAYIWFMSSIW-CLAPAF-GWSR-------YVPEGNLTSCGID +YLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVKSLRS--------------------------------------------------- +-----------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGLF--KF-EG-LT +PLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCV------------------- +------------------------------------------------------------ +----------------------------------------FG------------------ +-------------------------------KVDDGKSSDAQS------QATASEAES-- +--------------------------------------KA +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +MD---------------------------------------------------------- +------------------------------------------------------------ +-----------------------------------------------SFAAVATQLG--- +--------------------PQFAA-PSNGSVVDKV--TPDMAHLISPYWDQFPAMDP-- +----------IWAKILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINLAISDF +GIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRYQVIV +KGMAGRPM-TIPLALGKIAYIWFMSTIWCCLAPVF-GWSR-------YVPEGNLTSCGID +YLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVKSLRS--------------------------------------------------- +-----------SEDADKSAEGKLAKVALVTISLWFMAWTPYLVINCMGLF--KF-EG-LT +PLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCCV------------------- +------------------------------------------------------------ +----------------------------------------FG------------------ +-------------------------------KVDDGKSSEAQS------QATTSEAES-- +--------------------------------------KA +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MERSHLPET--------------------------------------------------- +-------------------------PFD------LAHS---------------------- +----------------------------------GP--RFQAQ-SSG------------- +----------------------------NGSVLDNV--LPDMAHLVNPYWSRFAPMDP-- +----------MMSKILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDF +CMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDRYNVIV +KGINGTPM-TIKTSIMKILFIWMMAVFW-TVMPLI-GWSA-------YVPEGNLTACSID +YMTRM--WNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVKSLRS--------------------------------------------------- +-----------SEDCDKSAEGKLAKVALTTISLWFMAWTPYLVICYFGLF--KI-DG-LT +PLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCPMCV------------------- +------------------------------------------------------------ +----------------------------------------FGN----------------- +--TDEPKPDAPA---------------SDTE--------------------TTSEADS-- +--------------------------------------KA +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MERSLLPEP--------------------------------------------------- +-------------------------PLA------MALL---------------------- +----------------------------------GP--RFEAQ-TGG------------- +----------------------------NRSVLDNV--LPDMAPLVNPHWSRFAPMDP-- +----------TMSKILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNLAFSDF +CMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDRYNVIV +KGINGTPM-TIKTSIMKIAFIWMMAVFW-TIMPLI-GWSS-------YVPEGNLTACSID +YMTRQ--WNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVKSLRS--------------------------------------------------- +-----------SEDCDKSAENKLAKVALTTISLWFMAWTPYLIICYFGLF--KI-DG-LT +PLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCPMCV------------------- +------------------------------------------------------------ +----------------------------------------CGT----------------- +--TDEPKPDAPP---------------SDTE--------------------TTSEAES-- +--------------------------------------KD +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +MI---------------------------------------------------------- +-----------------------------------AVS---------------------- +----------------------------------GP--SYEAF-SYGGQARFNNQ----- +------------------------------TVVDKV--PPDMLHLIDANWYQYPPLNP-- +----------MWHGILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINLAISNF +LMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDRYNVIV +KGLSGKPL-SINGALIRIIAIWLFSLGW-TIAPMF-GWNR-------YVPEGNMTACGTD +YFNRG--LLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVASLRS--------------------------------------------------- +-----------SENQNTSAECKLAKVALMTISLWFMAWTPYLVINFSGIF--NL-VK-IS +PLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFPSLA------------------- +------------------------------------------------------------ +----------------------------------------CAA----------------- +-----------EPSSDAVSTTSGTTTVTDNEK-------------------------S-- +--------------------------------------NA +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +MA---------------------------------------------------------- +------------------------------------------------------------ +-----------------------------------------------------NQLSY-- +------------SSLGWPYQP-------NASVVDTM--PKEMLYMIHEHWYAFPPMNP-- +----------LWYSILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNLAFSDF +CMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDRYNVIV +RGMAAAPL-THKKATLLLLFVWIWSGGW-TILPFF-GWSR-------YVPEGNLTSCTVD +YLTKD--WSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKK------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-MNVASLRAN-------------------------------------------------- +-----------ADQQKQSAECRLAKVAMMTVGLWFMAWTPYLIISWAGVF-SSG-TR-LT +PLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFPSLA------------------- +------------------------------------------------------------ +----------------------------------------CGSG-ESGSDVKSEA---SA +TTTMEEKPKIP------------------------------------------------- +--------------------------------------EA +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +MV---------------------------------------------------------- +-----------------------------------ESTT--------------------- +-----LVNQT-------------------------------------------------- +----------------WWYNPTV---------------------DIHPHWAKFDPIPD-- +----------AVYYSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINLAMSDL +SFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDRYNVIG +RPMAASKKMSHRRAFLMIIFVWMWSIVW-SVGPVF-NWGA-------YVPEGILTSCSFD +YLSTD--PSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKR------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-LNAKELRKA-------------------------------------------------- +-------------QAGASAEMKLAKISMVIITQFMLSWSPYAIIALLAQF-GPA-EW-VT +PYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQTTFPWLLTCCQFDEKECED------- +------------ANDAEEEVVASERGGESRDAAQMKEMMAMMQKMQAQQAAYQP---PPP +PQGYPPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQ--------------------- +------------------------------------------------------------ +GAP----------------PQVEAPQGAPPQGVDNQAYQA +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +MGR-----------------------DLRD------------------------------ +------------------------------------------------------------ +-------NET-------------------------------------------------- +----------------WWYNPSI---------------------VVHPHWREFDQVPD-- +----------AVYYSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINLAFSDF +TFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDRYNVIG +RPMAASKKMSHRRAFIMIIFVWLWSVLW-AIGPIF-GWGA-------YTLEGVLCNCSFD +YISRD--STTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKR------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-LNAKELRKA-------------------------------------------------- +-------------QAGANAEMRLAKISIVIVSQFLLSWSPYAVVALLAQF-GPL-EW-VT +PYAAQLPVMFAKASAIHNPMIYSVSHPKFREAISQTFPWVLTCCQFDDKETEDDKDAETE +IPAGESSDAAPSA-----------------DAAQMKEMMAMMQKMQQQQAAYPPQGYAPP +PQGYPPQGYPPQGY--PPQGYPPQGYPP---PPQGAPPQ--------------------- +------------------------------------------------------------ +GAP----------------P------AAPPQGVDNQAYQA +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +--------------------PHLLSGFLEVTASPAPTW--------------DAPPDNVS +GCGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADL +SVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGIT +RPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLF-GWAQ-------NVNDDKVCLISQD +F----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFP---G------ +-----FPRVQPESVISLNGV---------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +V--------------KLQKEV------------------EECAN---------------- +--LSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIP +LWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLLQ---------------------- +------------------------------------------------------------ +-----------------------------------------CQYRNINRKL-SAAGMHEA +LKLAE-RPERSE----FVLQ---NSDHCGKKG-------------------------H-- +--------------------------------------DT +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +--------------------PHLLSGFLEVTASPAPTW--------------DAPPDNVS +GCGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLALADL +SVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRYLGIT +RPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLF-GWAQ-------NVNDDKVCLISQD +F----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFP---G------ +-----FPRVQPESVISLNGV---------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +V--------------KLQKEV------------------EECAN---------------- +--LSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIP +LWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLLQ---------------------- +------------------------------------------------------------ +-----------------------------------------CQYRNINRKL-SAAGMHEA +LKLAE-RPERSE----FVLQ---NSDHCGKKG-------------------------H-- +--------------------------------------DT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +MDVLSPG----------------------------------------------------- +------------------------------------------------------------ +-----QGNNTT--------------------SPPAP------FETGG------------- +----------------------------NTTGISDVTV---------------------- +----------SYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDL +MVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAIT +DPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPML-GWRTP--EDRSDPD---ACTISKD +H----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK-------------- +-------------------------TVKKVEKTG-------------------------- +-------------ADTRHGASPAPQPKKSVNGESGSRNWRLGVESKAGGALCANGAVRQG +DDGAALEVIEVHRVGNSKEHLPLPSEAGPTPCAPASFERKNER----------------- +--------------------NAEA------------------------------------ +-----------KRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-CESSCH-MP +TLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIK---------------------- +------------------------------------------------------------ +-----------------------------------------CKF---------------- +---------------------------CR------------------------------- +---------------------------------------Q +> 33=p A35181 serotonin receptor class 1A - rat +MDVFSFG----------------------------------------------------- +------------------------------------------------------------ +-----QGNNTT--------------------ASQEP------FGTGG------------- +----------------------------NVTSISDVTF---------------------- +----------SYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLAVTDL +MVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRYWAIT +DPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPML-GWRTP--EDRSDPD---ACTISKD +H----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK-------------- +-------------------------TVRKVEKKGAGTSLGTSSAPPPKKSLNGQPGSGDW +RRCAENRAVGTP---------------------------------------CTNGAVRQG +DDEATLEVIEVHRVGNSKEHLPLPSESGSNSYAPACLERKNER----------------- +--------------------NAEA------------------------------------ +-----------KRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-CESSCH-MP +ALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKIIK---------------------- +------------------------------------------------------------ +-----------------------------------------CKF---------------- +---------------------------CR------------------------------- +---------------------------------------R +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +MANFTFGDLALDVARMGGL----------------------------------------A +STPSG------------LRSTGLTTPGLSPTGLV----TSDFNDSYGLTGQFINGSHSSR +SRDNASANDTSATNMTDDRYWSLTVYSHEHL----------------------------- +------------------------------------------------------------ +-------------VLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADL +MVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVT +S-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLF-GWRDP--NN--DPDKTGTCIISQD +K----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKTEE +TTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRP--------------- +------------------------------------------------------------ +-------------------------------------ERKKNRAKKLPENANG------- +---VNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYS---- +---------RTREKLELKRERKAARTLAIITGAFLICWLPFFIIALIGPF-VDP-EG-IP +PFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILF---------------------- +------------------------------------------------------------ +-----------------------------------------GKY---------------- +------------------------------RR-------------------------G-- +--------------------------------------HR +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +MANFTFGDLALDVARMGGL----------------------------------------A +STPSG------------LRSTGLTTPGLSPTGLV----TSDFNDSYGLTGQFINGSHSSR +SRDNASANDTSATNMTDDRYWSLTVYSHEHL----------------------------- +------------------------------------------------------------ +-------------VLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLAVADL +MVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRYWAVT +S-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLF-GWRDP--NN--DPDKTGTCIISQD +K----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKTEE +TTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRP--------------- +------------------------------------------------------------ +-------------------------------------ERKKNRAKKLPENANG------- +---VNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYS---- +---------RTREKLELKRERKAARTLAIITGAFLICWLPFFIIALIGPF-VDP-EG-IP +PFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKILF---------------------- +------------------------------------------------------------ +-----------------------------------------GKY---------------- +------------------------------RR-------------------------G-- +--------------------------------------HR +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +ME---------------------------------------------------------- +------------------------------------------------------------ +-------------------------------------------GAEG-----QEELDWEA +LYLRLPLQNCSWNSTGWE--PNW-----NVTVVPNTTW-----------WQASAPFDTPA +AL--------VRAAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSLAVADL +LVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDRYWAVT +N-IDYIHASTAKRVGMMIACVWTVSFFV-CIAQLL-GWKDPDWNQ--RVSEDLRCVVSQD +V----------GYQIFATASSFYVPVLIILILYWRIYQTARKRIRRRR------------ +------------------------------------------------------------ +------------GATARGGVGPPPVP--------------------AGGALVAGG----G +SGGIAAAVVAV--IGR-----PLPT---------------------------ISETTTTG +FTNVSSNNTSPEK--------------------------QSCANGLEADPPTTGYGAVAA +AYYPSLVRRKPKEAADSKRERKAAKTLAIITGAFVACWLPFFVLAILVPT-CD--CE-VS +PVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQRLLC---------------------- +------------------------------------------------------------ +-----------------------------------------GRR---------------- +---------------------------VRRRR-------------------------A-- +--------------------------------------PQ diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.lins1 b/mafft/src/mafft-7.487-with-extensions/test/sample.lins1 new file mode 100644 index 0000000000..b61413e156 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.lins1 @@ -0,0 +1,468 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +--------------------MNGTE--G-------------------DNFYVPFSNKTG- +-------------------------------LARSPYEYPQY----------------YL +AEPW---------KYSA-----LAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILL +NLAMANLFMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAI +ERYIVICKPMGNF-RFGNTHAIMGVAFTWIMALACAAP-PLVG-WS-----RYIPEGMQC +SCGPDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTVKEAAAAQQESA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEKEVTRMVVLMVIGFLVCWVPYASVAFYIFT-HQGS-- +DFGATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTLC-----C----GKNPLGDDE +-SGA-STSK-TEVSSVS-TSPVSPA----------------------------------- +----------------------------------------------------------- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +--------------------MNGTE--G-------------------PNFYVPFSNITG- +-------------------------------VVRSPFEQPQY----------------YL +AEPW---------QFSM-----LAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILL +NLAVADLFMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAI +ERYVVVCKPMSNF-RFGENHAIMGVAFTWVMALACAAP-PLVG-WS-----RYIPEGMQC +SCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------TTQKAEKEVTRMVIIMVIFFLICWLPYASVAMYIFT-HQGS-- +NFGPIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSLC-----C----GKNPLGDDE +-ASA-TASK-TETSQVA-PA---------------------------------------- +----------------------------------------------------------- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +--------------------MNGTE--G-------------------INFYVPMSNKTG- +-------------------------------VVRSPFEYPQY----------------YL +AEPW---------KYRL-----VCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILV +NLAVADLFMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAI +ERYIVVCKPMGNF-RFSATHAMMGIAFTWVMAFSCAAP-PLFG-WS-----RYMPEGMQC +SCGPDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKVREAAAQQQESA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------TTQKAEKEVTRMVILMVLGFMLAWTPYAVVAFWIFT-NKGA-- +DFTATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTIC-----C----GKNPFGDED +VSSTVSQSK-TEVSSVS-SSQVSPA----------------------------------- +----------------------------------------------------------- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +--------------------MNGTE--G-------------------KNFYVPMSNRTG- +-------------------------------LVRSPFEYPQY----------------YL +AEPW---------QFKI-----LALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILV +NLAVAGTIMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAI +ERYIVVCKPMGSF-KFSSSHAFAGIAFTWVMALACAAP-PLFG-WS-----RYIPEGMQC +SCGPDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTVKAAAAQQQDSA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEREVTKMVILMVFGFLIAWTPYATVAAWIFF-NKGA-- +DFSAKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTIF-----C----GKNPLGDDE +-SSTVSTSK-TEVSSVS-PA---------------------------------------- +----------------------------------------------------------- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +--------------------MNGTE--G-------------------NNFYVPLSNRTG- +-------------------------------LVRSPFEYPQY----------------YL +AEPW---------QFKL-----LAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILV +NLAVAGAIMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAI +ERYIVVCKPMGSF-KFSSTHASAGIAFTWVMAMACAAP-PLVG-WS-----RYIPEGIQC +SCGPDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTVKAAAAQQQDSA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEREVTKMVILMVLGFLVAWTPYATVAAWIFF-NKGA-- +AFSAQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTLF-----C----GKNPLGDEE +-SSTVSTSK-TEVSSVS-PA---------------------------------------- +----------------------------------------------------------- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +--------------------MKQVPEFH-------------------EDFYIPIPLDIN- +-----------------------------NLSAYSPFLVPQD----------------HL +GNQG---------IFMA-----MSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILV +NLSIANLFVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAF +ERWLVICKPLGNF-TFKTPHAIAGCILPWISALAASLP-PLFG-WS-----RYIPEGLQC +SCGPDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITLKLAAKAQADSA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEREVTKMVVVMVLGFLVCWAPYASFSLWIVS-HRGE-- +EFDLRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMM-KMV-----C----GKN-IEEDE +-AST-SSQV-TQVSSVA-PEK--------------------------------------- +----------------------------------------------------------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +--------------------MRKMS--E-------------------EEFYL-----FK- +-----------------------------NISSVGPWDGPQY----------------HI +APVW---------AFYL-----QAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILV +NVSFGGFLLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAF +ERYIVICKPFGNF-RFSSKHALTVVLATWTIGIGVSIP-PFFG-WS-----RFIPEGLQC +SCGPDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRALKAVAAQQQESA---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------TTQKAEREVSRMVVVMVGSFCVCYVPYAAFAMYMVN-NRNH-- +GLDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIM-KMV-----C----GKA-MTDES +-DTC-SSQK-TEVSTVS-STQVGPN----------------------------------- +----------------------------------------------------------- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-----DLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISW +ERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVWTAP-PIFG-WS-----RYWPHGLKT +SCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEKEVTRMVVVMVLAFC---------------------- +------------------------------------------------------------ +------------------------------------------------------------ +----------------------------------------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWS-LQRLAGRHPQDSYEDSTQ--S-------------------SIFTYTNSN---- +-------------------------------STRGPFEGPNY----------------HI +APRW---------VYHL-----TSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILV +NLAVADLAETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISW +ERWMVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVWTAP-PIFG-WS-----RYWPHGLKT +SCGPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEKEVTRMVVVMVLAFCFCWGPYAFFACFAAA-NPGY-- +PFHPLMAALPAFFAKSATIYNPVIYVFMNRQFRNCIL-QLF----------GKK-VDDGS +-ELS-SASK-TEVSSV---SSVSPA----------------------------------- +----------------------------------------------------------- +> 10== Z68193 1 human Red Opsin <>[] +MAQQWS-LQRLAGRHPQDSYEDSTQ--S-------------------SIFTYTNSN---- +-------------------------------STRGPFEGPNY----------------HI +APRW---------VYHL-----TSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILV +NLAVADLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISW +ERWLVVCKPFGNV-RFDAKLAIVGIAFSWIWSAVWTAP-PIFG-WS-----RYWPHGLKT +SCGPDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAIRAVAKQQKESE---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEKEVTRMVVVMIFAYCVCWGPYTFFACFAAA-NPGY-- +AFHPLMAALPAYFAKSATIYNPVIYVFMNRQFRNCIL-QLF----------GKK-VDDGS +-ELS-SASK-TEVSSV---SSVSPA----------------------------------- +----------------------------------------------------------- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDD--DDTTR--G-------------------SVFTYTNTN---- +-------------------------------NTRGPFEGPNY----------------HI +APRW---------VYNL-----VSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILV +NLAFVDLVETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISW +ERWFVVCKPFGNI-KFDSKLAIIGIVFSWVWAWGWSAP-PIFG-WS-----RYWPHGLKT +SCGPDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAIRAVAAQQKESE---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEREVSRMVVVMIVAFCICWGPYASFVSFAAA-NPGY-- +AFHPLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIM-QLF----------GKK-VDDGS +-EAS-TTSR-TEVSSVS-NSSVAPA----------------------------------- +----------------------------------------------------------- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-AWE-AAFAARRRHEE--EDTTR--D-------------------SVFTYTNSN---- +-------------------------------NTRGPFEGPNY----------------HI +APRW---------VYNL-----TSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILV +NLAVADLGETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISW +ERWFVVCKPFGNI-KFDGKLAVAGILFSWLWSCAWTAP-PIFG-WS-----RYWPHGLKT +SCGPDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAIRAVAAQQKESE---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------STQKAEKEVSRMVVVMIVAYCFCWGPYTFFACFAAA-NPGY-- +AFHPLAAALPAYFAKSATIYNPIIYVFMNRQFRNCIL-QLF----------GKK-VDDGS +-EVS-T-SR-TEVSSVS-NSSVSPA----------------------------------- +----------------------------------------------------------- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +------------------------M--S-------------------SNSSQAPPN---- +-------------------------------GTPGPFDGPQW---------------PYQ +APQS---------TYVG-----VAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILV +NLAVADLLVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILAL +ERYVVVCKPLGDF-QFQRRHAVSGCAFTWGWALLWSAP-PLLG-WS-----SYVPEGLRT +SCGPNWYTGGSN--NNSYILSLFVTCFVLPLSLILFSYTNLLLTLRAAAAQQKEAD---- +------------------------------------------------------------ +------------------------------------------------------------ +-----------------TTQRAEREVTRMVIVMVMAFLLCWLPYSTFALVVAT-HKGI-- +IIQPVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLL-EML-----CCGYQPQR-TGKAS +-PGT-PGPH-ADVTAAGLRNKVMPAHPV-------------------------------- +----------------------------------------------------------- +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +-MESGNVS--SS--------LFGNV--S-------------------TALR-------P- +-------------------------------EARLSA---E---TRLLGWNVPPEELRHI +PEHWLTYPEPPESMNYL-----LGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVI +NLAFCDFMMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAY +DRFNVITRPMEG--KMTHGKAIAMIIFIYMYATPWVVA-CYTETWG-----RFVPEGYLT +SCTFDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKMN +VE------------------SLRS------------------------------------ +------------------------------------------------------------ +-------------NVDKNKETAEIRIAKAAITICFLFFCSWTPYGVMSLIGAF-GDKT-- +LLTPGATMIPACACKMVACIDPFVYAISHPRYRMELQ-KRCPWL--AL---NEK-APESS +-AVA-STST-TQEPQQT------TAA---------------------------------- +----------------------------------------------------------- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +-MEYHNVS--SV--------L-GNV--S-------------------SVLR-------P- +-------------------------------DARLSA---E---SRLLGWNVPPDELRHI +PEHWLIYPEPPESMNYL-----LGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVI +NLAFCDFMMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAY +DRYNVITRPMEG--KMTHGKAIAMIIFIYLYATPWVVA-CYTESWG-----RFVPEGYLT +SCTFDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKMN +VD------------------SLRS------------------------------------ +------------------------------------------------------------ +-------------NVDKSKEAAEIRIAKAAITICFLFFASWTPYGVMSLIGAF-GDKT-- +LLTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQ-KRCPWL--AI---SEK-APESR +-AAI-STST-TQEQQQT------TAA---------------------------------- +----------------------------------------------------------- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +-ME--------P--------LCNAS--E-------------------PPLR-------P- +-------------------------------EAR-SSGNGD---LQFLGWNVPPDQIQYI +PEHWLTQLEPPASMHYM-----LGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVL +NLAVFDLIMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGY +DRYNVITKPMNR--NMTFTKAVIMNIIIWLYCTPWVVL-PLTQFWD-----RFVPEGYLT +SCSFDYLSDN--FDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKKMN +VE------------------SLRS------------------------------------ +------------------------------------------------------------ +-------------NVDKSKETAEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-GDKS-- +LLTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQ-KRCPWL--GV---NEK-SGEIS +-SAQ-STTT-QEQQQTT------AA----------------------------------- +----------------------------------------------------------- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +-MD--------A--------LCNAS--E-------------------PPLR-------P- +-------------------------------EARMSSGSDE---LQFLGWNVPPDQIQYI +PEHWLTQLEPPASMHYM-----LGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVL +NLAVFDLIMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGY +DRYNVITKPMNR--NMTFTKAVIMNIIIWLYCTPWVVL-PLTQFWD-----RFVPEGYLT +SCSFDYLSDN--FDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKKMN +VE------------------SLRS------------------------------------ +------------------------------------------------------------ +-------------NVDKSKETAEIRIAKAAITICFLFFVSWTPYGVMSLIGAF-GDKS-- +LLTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQ-KRCPWL--GV---NEK-SGEAS +-SAQ-STTT-QEQTQQT------SAA---------------------------------- +----------------------------------------------------------- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +--------------------MTNAT--G-------------------PQMAY-----YG- +-------------------------------AASMDFGYPE---GVSIVDFVRPEIKPYV +HQHWYNYPPVNPMWHYL-----LGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVV +NLALSDLIMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISF +DRYNIICNGFNGP-KLTTGKAVVFALISWVIAIGCALP-PFFG-WG-----NYILEGILD +SCSYDYLTQD--FNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKKMN +VS------------------TLRS------------------------------------ +------------------------------------------------------------ +--------------NEADAQRAEIRIAKTALVNVSLWFICWTPYALISLKGVM-GDTS-- +GITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAIT-QHLPWF--CV---HET-ETKSN +-DDS-QSNS-TVAQDKA------------------------------------------- +----------------------------------------------------------- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +--------------------MANVT--G-------------------PQMAF-----YG- +-------------------------------SGAATFGYPE---GMTVADFVPDRVKHMV +LDHWYNYPPVNPMWHYL-----LGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIV +NLALSDLIMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISF +DRYNIICNGFNGP-KLTQGKATFMCGLAWVISVGWSLP-PFFG-WG-----SYTLEGILD +SCSYDYFTRD--MNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKKMN +VT------------------NLRS------------------------------------ +------------------------------------------------------------ +--------------NEAETQRAEIRIAKTALVNVSLWFICWTPYAAITIQGLL-GNAE-- +GITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAIT-QHLPWF--CV---HEK-DPNDV +-EEN-QSSN-TQTQEKS------------------------------------------- +----------------------------------------------------------- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +------MESFAV--------AAAQL--G-------------------PHFA--------- +---------------------------------PLS--------NGSVVDKVTPDMAHLI +SPYWNQFPAMDPIWAKI-----LTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVI +NLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISL +DRYQVIVKGMAGR-PMTIPLALGKM---------------------------YVPEGNLT +SCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMN +VK------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGLF-KF-E-- +GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALK-EKCPCC--VF---GKV-DDGKS +-SDA-QSQA-TASEAES------KA----------------------------------- +----------------------------------------------------------- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +------MESFAV--------AAAQL--G-------------------PHFA--------- +---------------------------------PLS--------NGSVVDKVTPDMAHLI +SPYWNQFPAMDPIWAKI-----LTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVI +NLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISL +DRYQVIVKGMAGR-PMTIPLALGKIAYIWFMSSIW-CLAPAFG-WS-----RYVPEGNLT +SCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMN +VK------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLVINCMGLF-KF-E-- +GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALK-EKCPCC--VF---GKV-DDGKS +-SDA-QSQA-TASEAES------KA----------------------------------- +----------------------------------------------------------- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +------MDSFAA--------VATQL--G-------------------PQFA--------- +---------------------------------APS--------NGSVVDKVTPDMAHLI +SPYWDQFPAMDPIWAKI-----LTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVI +NLAISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISL +DRYQVIVKGMAGR-PMTIPLALGKIAYIWFMSTIWCCLAPVFG-WS-----RYVPEGNLT +SCGIDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMN +VK------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SEDADKSAEGKLAKVALVTISLWFMAWTPYLVINCMGLF-KF-E-- +GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALK-EKCPCC--VF---GKV-DDGKS +-SEA-QSQA-TTSEAES------KA----------------------------------- +----------------------------------------------------------- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +-MERSHLPETPF--------DLAHS--G-------------------PRFQ--------- +---------------------------------AQSSG------NGSVLDNVLPDMAHLV +NPYWSRFAPMDPMMSKI-----LGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVL +NLAFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAF +DRYNVIVKGINGT-PMTIKTSIMKILFIWMMAVFWTVM-PLIG-WS-----AYVPEGNLT +ACSIDYMTRM--WNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKKMN +VK------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SEDCDKSAEGKLAKVALTTISLWFMAWTPYLVICYFGLF-KI-D-- +GLTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLK-EKCPMC--VF---GNT-DEPKP +-DAP-ASDTETTSEADS------KA----------------------------------- +----------------------------------------------------------- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +-MERSLLPEPPL--------AMALL--G-------------------PRFE--------- +---------------------------------AQTGG------NRSVLDNVLPDMAPLV +NPHWSRFAPMDPTMSKI-----LGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVL +NLAFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAF +DRYNVIVKGINGT-PMTIKTSIMKIAFIWMMAVFWTIM-PLIG-WS-----SYVPEGNLT +ACSIDYMTRQ--WNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKKMN +VK------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SEDCDKSAENKLAKVALTTISLWFMAWTPYLIICYFGLF-KI-D-- +GLTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLK-EKCPMC--VC---GTT-DEPKP +-DAP-PSDTETTSEAES------KD----------------------------------- +----------------------------------------------------------- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +--------------------MIAVS--G-------------------PSYE--------- +---------------------------------AFSYGGQARFNNQTVVDKVPPDMLHLI +DANWYQYPPLNPMWHGI-----LGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVI +NLAISNFLMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAF +DRYNVIVKGLSGK-PLSINGALIRIIAIWLFSLGWTIA-PMFG-WN-----RYVPEGNMT +ACGTDYFNRG--LLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKKMN +VA------------------SLRS------------------------------------ +------------------------------------------------------------ +--------------SENQNTSAECKLAKVALMTISLWFMAWTPYLVINFSGIF-NL-V-- +KISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALF-AKFPSL--AC----AA-EPSSD +-AVS-TTSG-TTTVTDN------EKSNA-------------------------------- +----------------------------------------------------------- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +----------------------MAN--Q-------------------LSYS--------- +---------------------------------SLGWPYQP---NASVVDTMPKEMLYMI +HEHWYAFPPMNPLWYSI-----LGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVV +NLAFSDFCMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITL +DRYNVIVRGMAAA-PLTHKKATLLLLFVWIWSGGWTIL-PFFG-WS-----RYVPEGNLT +SCTVDYLTKD--WSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKKMN +VA------------------SLRA------------------------------------ +------------------------------------------------------------ +-------------NADQQKQSAECRLAKVAMMTVGLWFMAWTPYLIISWAGVF-SSGT-- +RLTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALY-QRFPSL--AC---GSG-ESGSD +-VKS-EASA-TTTMEEK------PKIPEA------------------------------- +----------------------------------------------------------- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +----------------------MVE--S-------------------TTLV--------- +---------------------------------NQTWWY-----NPTV----------DI +HPHWAKFDPIPDAVYYS-----VGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFII +NLAMSDLSFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISI +DRYNVIGRPMAASKKMSHRRAFLMIIFVWMWSIVWSVG-PVFN-WG-----AYVPEGILT +SCSFDYLSTD--PSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKRLN +AK------------------ELRK------------------------------------ +------------------------------------------------------------ +--------------AQ-AGASAEMKLAKISMVIITQFMLSWSPYAIIALLAQF-GPAE-- +WVTPYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQ-TTFPWLLTCC---QFD-EKECE +-DAN-DAEE-EVVASER----GGESRDAAQMKEMMAMMQKMQAQQAAYQP---PPPPQGY +PPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAPPQVEAPQGAPPQGVDNQAYQA +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +-----------------------MG--R-------------------DLRD--------- +---------------------------------NETWWY-----NPSI----------VV +HPHWREFDQVPDAVYYS-----LGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFII +NLAFSDFTFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISI +DRYNVIGRPMAASKKMSHRRAFIMIIFVWLWSVLWAIG-PIFG-WG-----AYTLEGVLC +NCSFDYISRD--STTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKRLN +AK------------------ELRK------------------------------------ +------------------------------------------------------------ +--------------AQ-AGANAEMRLAKISIVIVSQFLLSWSPYAVVALLAQF-GPLE-- +WVTPYAAQLPVMFAKASAIHNPMIYSVSHPKFREAIS-QTFPWVLTCC---QFD-DKETE +-DDK-DAET-EIPAGES--SDAAPSADAAQMKEMMAMMQKMQQQQAAYPPQGYAPPPQGY +PPQGYPPQGY--PPQGYPPQGYPP---PPQGAPPQGAPP------AAPPQGVDNQAYQA +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +------------------------------------------------------------ +--------------------MPHLLSGFLEVTASPA---PTW--DA------PPDNVSGC +GEQ----INYGRVEKVV-----IGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIV +SLALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISI +DRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASITLP-PLFG-WA-----QNVNDDKVC +LISQDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF------ +--------PGFPRVQPESVISLNG------------------------------------ +----------------VVKLQKE------------------VEECAN------------- +-----LSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWLPFFLLSTARPFICGTSCS +CIPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSR-SLL---------QCQYRNINRK +LSAA-GMHE-ALKLAER------PERSEFVL------------QNSDHCGK--------- +-------------------------------------------------KGHDT----- +> 31=p A47425 serotonin receptor 5HT-7 - rat +------------------------------------------------------------ +--------------------MPHLLSGFLEVTASPA---PTW--DA------PPDNVSGC +GEQ----INYGRVEKVV-----IGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIV +SLALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISI +DRYLGITRPLTYPVRQNGKCMAKMILSVWLLSASITLP-PLFG-WA-----QNVNDDKVC +LISQDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF------ +--------PGFPRVQPESVISLNG------------------------------------ +----------------VVKLQKE------------------VEECAN------------- +-----LSRLLKHERKNISIFKREQKAATTLGIIVGAFTVCWLPFFLLSTARPFICGTSCS +CIPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYR-SLL---------QCQYRNINRK +LSAA-GMHE-ALKLAER------PERSEFVL------------QNSDHCGK--------- +-------------------------------------------------KGHDT----- +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +--------------------MDVLS-PG-------------------------------- +-------------------------------QGNNT--------TSPPAPFETGGNTTGI +S-------DVTVSYQVI-----TSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIG +SLAVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIAL +DRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLISIP-PMLG-WRTPEDRSDPD---AC +TISKDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVKKVEKTG +ADTRHGASPAPQPKK-----SVNG--ESGSRNWRLGVESKAGGALCANGAVRQGDDGAAL +--EVIEVHRVGNSKEHLPLPSEAGPTPCAPAS------------------FERKNERNA- +------------EAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-CESSC- +HMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFK-KII---------KCKFCRQ--- +------------------------------------------------------------ +----------------------------------------------------------- +> 33=p A35181 serotonin receptor class 1A - rat +--------------------MDVFS-FG-------------------------------- +-------------------------------QGNNT--------TASQEPFGTGGNVTSI +S-------DVTFSYQVI-----TSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIG +SLAVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIAL +DRYWAITDPIDYVNKRTPRRAAALISLTWLIGFLISIP-PMLG-WRTPEDRSDPD---AC +TISKDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVRKVEKKG +AGTSLGTSSAPPPKK-----SLNG--QPGSGDWRRCAENRAVGTPCTNGAVRQGDDEATL +--EVIEVHRVGNSKEHLPLPSESGSNSYAPAC------------------LERKNERNA- +------------EAKRKMALARERKTVKTLGIIMGTFILCWLPFFIVALVLPF-CESSC- +HMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFK-KII---------KCKFCRR--- +------------------------------------------------------------ +----------------------------------------------------------- +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +------MANFTFGDL----ALDVAR-MGGLASTPS---GLRS-----TGLTTPGLSPTGL +VTSDFNDSYGLTGQFINGSHSSRSRD---NASANDT--------SATNM---TDDRYWSL +T-------VYSHEHLVL-----TSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLIL +SLAVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAM +DRYWAVTS-IDYIRRRSARRILLMIMVVWIVALFISIP-PLFG-WRDPNN--DPDKTGTC +IISQDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKAR +LKTEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKL +PENANGVNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYS- +------------RTREKLELKRERKAARTLAIITGAFLICWLPFFIIALIGPF-VDPE-- +GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQ-KIL---------FGKYRRGHR- +------------------------------------------------------------ +----------------------------------------------------------- +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +------MANFTFGDL----ALDVAR-MGGLASTPS---GLRS-----TGLTTPGLSPTGL +VTSDFNDSYGLTGQFINGSHSSRSRD---NASANDT--------SATNM---TDDRYWSL +T-------VYSHEHLVL-----TSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLIL +SLAVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAM +DRYWAVTS-IDYIRRRSARRILLMIMVVWIVALFISIP-PLFG-WRDPNN--DPDKTGTC +IISQDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKAR +LKTEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKL +PENANGVNSNSSSSERLKQIQIETAEAFANGCAEEASIAMLERQCNNGKKISSNDTPYS- +------------RTREKLELKRERKAARTLAIITGAFLICWLPFFIIALIGPF-VDPE-- +GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQ-KIL---------FGKYRRGHR- +------------------------------------------------------------ +----------------------------------------------------------- +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +-------MEGAEGQE----ELDWEA-LY---------------------LRLP------- +------------------------LQ---NCSWNSTGWEPNW--NVTVV---PNTTWWQA +S-------APFDTPAALVRAAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLIL +SLAVADLLVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIAL +DRYWAVTN-IDYIHASTAKRVGMMIACVWTVSFFVCIA-QLLG-WKDPDWNQRVSEDLRC +VVSQDV----------GYQIFATASSFYVPVLIILILYWRIYQTARKRIRR------RRG +ATARGGVGPPPVPAGGALV-AGGG----------------------------SGGIAAAV +---------VAVIGRPLPTISETTTTGFTNVSSNNTSPE--KQSCANGLEADPPTTGYGA +VAAAYYPSLVRRKPKEAADSKRERKAAKTLAIITGAFVACWLPFFVLAILVPT-CDCE-- +-VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQ-RLL---------CGRRVRRRRA +-----------------------PQ----------------------------------- +----------------------------------------------------------- diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.linsi b/mafft/src/mafft-7.487-with-extensions/test/sample.linsi new file mode 100644 index 0000000000..36952ef413 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.linsi @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +M------------------NGTE-G------DNFYVPF----SNKTGLARSPYEYPQY-- +--------------------------------------------------YLAEPW---- +---------------KYSALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNLA +MANLFMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIERY +IVICKPMGNF-RFGNTHAIMGVAFTWIMALAC-AAPPLVG-WS-----RYIPEGMQCSCG +PDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTVKEAAAAQQESA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEKEVTRMVVLMVIGFLVCWVPYAS +VAFYIFT---HQGS-DFGATFMTLPAFFAKSSALYNPVIYILMNKQFRNCMITTL----- +CC-----GKNPLGDDE-SGA-STSK-TEVSSVS-TSPVSPA------------------- +------------------------------------------------------------ +--------------- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +M------------------NGTE-G------PNFYVPF----SNITGVVRSPFEQPQY-- +--------------------------------------------------YLAEPW---- +---------------QFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLA +VADLFMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIERY +VVVCKPMSNF-RFGENHAIMGVAFTWVMALAC-AAPPLVG-WS-----RYIPEGMQCSCG +IDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------TTQKAEKEVTRMVIIMVIFFLICWLPYAS +VAMYIFT---HQGS-NFGPIFMTLPAFFAKTASIYNPIIYIMMNKQFRNCMLTSL----- +CC-----GKNPLGDDE-ASA-TASK-TETSQVA-PA------------------------ +------------------------------------------------------------ +--------------- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +M------------------NGTE-G------INFYVPM----SNKTGVVRSPFEYPQY-- +--------------------------------------------------YLAEPW---- +---------------KYRLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNLA +VADLFMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIERY +IVVCKPMGNF-RFSATHAMMGIAFTWVMAFSC-AAPPLFG-WS-----RYMPEGMQCSCG +PDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKVREAAAQQQESA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------TTQKAEKEVTRMVILMVLGFMLAWTPYAV +VAFWIFT---NKGA-DFTATLMAVPAFFSKSSSLYNPIIYVLMNKQFRNCMITTI----- +CC-----GKNPFGDEDVSSTVSQSK-TEVSSVS-SSQVSPA------------------- +------------------------------------------------------------ +--------------- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +M------------------NGTE-G------KNFYVPM----SNRTGLVRSPFEYPQY-- +--------------------------------------------------YLAEPW---- +---------------QFKILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNLA +VAGTIMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIERY +IVVCKPMGSF-KFSSSHAFAGIAFTWVMALAC-AAPPLFG-WS-----RYIPEGMQCSCG +PDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTVKAAAAQQQDSA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEREVTKMVILMVFGFLIAWTPYAT +VAAWIFF---NKGA-DFSAKFMAIPAFFSKSSALYNPVIYVLLNKQFRNCMLTTI----- +FC-----GKNPLGDDE-SSTVSTSK-TEVSSVS-PA------------------------ +------------------------------------------------------------ +--------------- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +M------------------NGTE-G------NNFYVPL----SNRTGLVRSPFEYPQY-- +--------------------------------------------------YLAEPW---- +---------------QFKLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNLA +VAGAIMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIERY +IVVCKPMGSF-KFSSTHASAGIAFTWVMAMAC-AAPPLVG-WS-----RYIPEGIQCSCG +PDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTVKAAAAQQQDSA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEREVTKMVILMVLGFLVAWTPYAT +VAAWIFF---NKGA-AFSAQFMAIPAFFSKTSALYNPVIYVLLNKQFRSCMLTTL----- +FC-----GKNPLGDEE-SSTVSTSK-TEVSSVS-PA------------------------ +------------------------------------------------------------ +--------------- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +M------------------KQVP-EFH----EDFYIPIPL--DINNLSAYSPFLVPQD-- +--------------------------------------------------HLGNQG---- +---------------IFMAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNLS +IANLFVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFERW +LVICKPLGNF-TFKTPHAIAGCILPWISALAA-SLPPLFG-WS-----RYIPEGLQCSCG +PDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITLKLAAKAQADSA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEREVTKMVVVMVLGFLVCWAPYAS +FSLWIVS---HRGE-EFDLRMATIPSCLSKASTVYNPVIYVLMNKQFRSCMMKMV----- +C------GKN-IEEDE-AST-SSQV-TQVSSVA-PEK----------------------- +------------------------------------------------------------ +--------------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +M------------------RKMS-E------EEFYL-------FKNISSVGPWDGPQY-- +--------------------------------------------------HIAPVW---- +---------------AFYLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNVS +FGGFLLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFERY +IVICKPFGNF-RFSSKHALTVVLATWTIGIGV-SIPPFFG-WS-----RFIPEGLQCSCG +PDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRALKAVAAQQQESA------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------TTQKAEREVSRMVVVMVGSFCVCYVPYAA +FAMYMVN---NRNH-GLDLRLVTIPSFFSKSACIYNPIIYCFMNKQFQACIMKMV----- +C------GKA-MTDES-DTC-SSQK-TEVSTVS-STQVGPN------------------- +------------------------------------------------------------ +--------------- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--DLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERW +LVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVW-TAPPIFG-WS-----RYWPHGLKTSCG +PDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEKEVTRMVVVMVLAFC-------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +--------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWSLQRLAGRHPQDSYEDSTQS------SIFTY-------TNSNSTRGPFEGPNY-- +--------------------------------------------------HIAPRW---- +---------------VYHLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNLA +VADLAETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERW +MVVCKPFGNV-RFDAKLAIVGIAFSWIWAAVW-TAPPIFG-WS-----RYWPHGLKTSCG +PDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAIRAVAKQQKESE------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEKEVTRMVVVMVLAFCFCWGPYAF +FACFAAA---NPGY-PFHPLMAALPAFFAKSATIYNPVIYVFMNRQFRNCILQLF----- +-------GKK-VDDGS-ELS-SASK-TEVSSVS---SVSPA------------------- +------------------------------------------------------------ +--------------- +> 10== Z68193 1 human Red Opsin <>[] +MAQQWSLQRLAGRHPQDSYEDSTQS------SIFTY-------TNSNSTRGPFEGPNY-- +--------------------------------------------------HIAPRW---- +---------------VYHLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNLA +VADLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWERW +LVVCKPFGNV-RFDAKLAIVGIAFSWIWSAVW-TAPPIFG-WS-----RYWPHGLKTSCG +PDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAIRAVAKQQKESE------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEKEVTRMVVVMIFAYCVCWGPYTF +FACFAAA---NPGY-AFHPLMAALPAYFAKSATIYNPVIYVFMNRQFRNCILQLF----- +-------GKK-VDDGS-ELS-SASK-TEVSSVS---SVSPA------------------- +------------------------------------------------------------ +--------------- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDD-DDTTRG------SVFTY-------TNTNNTRGPFEGPNY-- +--------------------------------------------------HIAPRW---- +---------------VYNLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNLA +FVDLVETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWERW +FVVCKPFGNI-KFDSKLAIIGIVFSWVWAWGW-SAPPIFG-WS-----RYWPHGLKTSCG +PDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAIRAVAAQQKESE------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEREVSRMVVVMIVAFCICWGPYAS +FVSFAAA---NPGY-AFHPLAAALPAYFAKSATIYNPVIYVFMNRQFRNCIMQLF----- +-------GKK-VDDGS-EAS-TTSR-TEVSSVS-NSSVAPA------------------- +------------------------------------------------------------ +--------------- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-AWE-AAFAARRRHEE-EDTTRD------SVFTY-------TNSNNTRGPFEGPNY-- +--------------------------------------------------HIAPRW---- +---------------VYNLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNLA +VADLGETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWERW +FVVCKPFGNI-KFDGKLAVAGILFSWLWSCAW-TAPPIFG-WS-----RYWPHGLKTSCG +PDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAIRAVAAQQKESE------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------STQKAEKEVSRMVVVMIVAYCFCWGPYTF +FACFAAA---NPGY-AFHPLAAALPAYFAKSATIYNPIIYVFMNRQFRNCILQLF----- +-------GKK-VDDGS-EVS-T-SR-TEVSSVS-NSSVSPA------------------- +------------------------------------------------------------ +--------------- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +-----------------------MS------SNSSQ-------APPNGTPGPFDGPQW-- +-------------------------------------------------PYQAPQS---- +---------------TYVGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNLA +VADLLVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALERY +VVVCKPLGDF-QFQRRHAVSGCAFTWGWALLW-SAPPLLG-WS-----SYVPEGLRTSCG +PNWYTGGSN--NNSYILSLFVTCFVLPLSLILFSYTNLLLTLRAAAAQQKEAD------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------TTQRAEREVTRMVIVMVMAFLLCWLPYST +FALVVAT---HKGI-IIQPVLASLPSYFSKTATVYNPIIYVFMNKQFQSCLLEML----- +CCGYQ--PQR-TGKAS-PGT-PGPH-ADVTAAGLRNKVMPAHPV---------------- +------------------------------------------------------------ +--------------- +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +M------------------ESGNVS------SSLF------------GNVSTALRPEA-- +-------------------------RLSA---E---TRLLGWNVPPEELRHIPEHWLTYP +----------EPPESMNYLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINLA +FCDFMMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDRF +NVITRPMEG--KMTHGKAIAMIIFIYMYATPW-VVACYTETWG-----RFVPEGYLTSCT +FDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKMNVES +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS-------NVDKNKETAEIRIAKAAITICFLFFCSWTPYGV +MSLIGAF---GDKT-LLTPGATMIPACACKMVACIDPFVYAISHPRYRMELQKRCPWL-- +AL-----NEK-APESS-AVA-STST-TQEPQQT--------------------------- +TAA--------------------------------------------------------- +--------------- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +M------------------EYHNVS------SVL-------------GNVSSVLRPDA-- +-------------------------RLSA---E---SRLLGWNVPPDELRHIPEHWLIYP +----------EPPESMNYLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINLA +FCDFMMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDRY +NVITRPMEG--KMTHGKAIAMIIFIYLYATPW-VVACYTESWG-----RFVPEGYLTSCT +FDYLTDN--FDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKALRDQAKKMNVDS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS-------NVDKSKEAAEIRIAKAAITICFLFFASWTPYGV +MSLIGAF---GDKT-LLTPGATMIPACTCKMVACIDPFVYAISHPRYRMELQKRCPWL-- +AI-----SEK-APESR-AAI-STST-TQEQQQT--------------------------- +TAA--------------------------------------------------------- +--------------- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +M------------------EPLC------------------------NASEPPLRPEA-- +-------------------------R-SSGNGD---LQFLGWNVPPDQIQYIPEHWLTQL +----------EPPASMHYMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNLA +VFDLIMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDRY +NVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFWD-----RFVPEGYLTSCS +FDYLSDN--FDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKALREQAKKMNVES +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS-------NVDKSKETAEIRIAKAAITICFLFFVSWTPYGV +MSLIGAF---GDKS-LLTQGATMIPACTCKLVACIDPFVYAISHPRYRLELQKRCPWL-- +GV-----NEK-SGEIS-SAQ-STTT-QEQQQTT--------------------------- +AA---------------------------------------------------------- +--------------- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +M------------------DALC------------------------NASEPPLRPEA-- +-------------------------RMSSGSDE---LQFLGWNVPPDQIQYIPEHWLTQL +----------EPPASMHYMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNLA +VFDLIMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDRY +NVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFWD-----RFVPEGYLTSCS +FDYLSDN--FDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKALREQAKKMNVES +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS-------NVDKSKETAEIRIAKAAITICFLFFVSWTPYGV +MSLIGAF---GDKS-LLTPGATMIPACTCKLVACIEPFVYAISHPRYRMELQKRCPWL-- +GV-----NEK-SGEAS-SAQ-STTT-QEQTQQT--------------------------- +SAA--------------------------------------------------------- +--------------- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +M------------------TNAT-------------------------------GPQMAY +-------YG--------------AASMDFGYPE---GVSIVDFVRPEIKPYVHQHWYNYP +----------PVNPMWHYLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNLA +LSDLIMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDRY +NIICNGFNGP-KLTTGKAVVFALISWVIAIGC-ALPPFFG-WG-----NYILEGILDSCS +YDYLTQD--FNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAAMRAQAKKMNVST +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------NEADAQRAEIRIAKTALVNVSLWFICWTPYAL +ISLKGVM---GDTS-GITPLVSTLPALLAKSCSCYNPFVYAISHPKYRLAITQHLPWF-- +CV-----HET-ETKSN-DDS-QSNS-TVAQDKA--------------------------- +------------------------------------------------------------ +--------------- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +M------------------ANVT-------------------------------GPQMAF +-------YG--------------SGAATFGYPE---GMTVADFVPDRVKHMVLDHWYNYP +----------PVNPMWHYLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNLA +LSDLIMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDRY +NIICNGFNGP-KLTQGKATFMCGLAWVISVGW-SLPPFFG-WG-----SYTLEGILDSCS +YDYFTRD--MNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAAMRAQAKKMNVTN +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------NEAETQRAEIRIAKTALVNVSLWFICWTPYAA +ITIQGLL---GNAE-GITPLLTTLPALLAKSCSCYNPFVYAISHPKFRLAITQHLPWF-- +CV-----HEK-DPNDV-EEN-QSSN-TQTQEKS--------------------------- +------------------------------------------------------------ +--------------- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +M------------------ESFA-------------------------VAAAQLGPHF-- +------------------------APLS--------NGSVVDKVTPDMAHLISPYWNQFP +----------AMDPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLA +ISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRY +QVIVKGMAGR-PMTIPLALGKM---------------------------YVPEGNLTSCG +IDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMNVKS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLV +INCMGLF---KF-E-GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCC-- +VF-----GKV-DDGKS-SDA-QSQA-TASEAES------KA------------------- +------------------------------------------------------------ +--------------- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +M------------------ESFA-------------------------VAAAQLGPHF-- +------------------------APLS--------NGSVVDKVTPDMAHLISPYWNQFP +----------AMDPIWAKILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINLA +ISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRY +QVIVKGMAGR-PMTIPLALGKIAYIWFMSSIW-CLAPAFG-WS-----RYVPEGNLTSCG +IDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMNVKS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SEDAEKSAEGKLAKVALVTITLWFMAWTPYLV +INCMGLF---KF-E-GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCC-- +VF-----GKV-DDGKS-SDA-QSQA-TASEAES------KA------------------- +------------------------------------------------------------ +--------------- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +M------------------DSFA-------------------------AVATQLGPQF-- +------------------------AAPS--------NGSVVDKVTPDMAHLISPYWDQFP +----------AMDPIWAKILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINLA +ISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDRY +QVIVKGMAGR-PMTIPLALGKIAYIWFMSTIWCCLAPVFG-WS-----RYVPEGNLTSCG +IDYLERD--WNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKAMREQAKKMNVKS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SEDADKSAEGKLAKVALVTISLWFMAWTPYLV +INCMGLF---KF-E-GLTPLNTIWGACFAKSAACYNPIVYGISHPKYRLALKEKCPCC-- +VF-----GKV-DDGKS-SEA-QSQA-TTSEAES------KA------------------- +------------------------------------------------------------ +--------------- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +M------------------ERSH--------------------LPETPFDLAHSGPRF-- +------------------------QAQSSG------NGSVLDNVLPDMAHLVNPYWSRFA +----------PMDPMMSKILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNLA +FSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDRY +NVIVKGINGT-PMTIKTSIMKILFIWMMAVFW-TVMPLIG-WS-----AYVPEGNLTACS +IDYMTRM--WNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKAMREQAKKMNVKS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SEDCDKSAEGKLAKVALTTISLWFMAWTPYLV +ICYFGLF---KI-D-GLTPLTTIWGATFAKTSAVYNPIVYGISHPKYRIVLKEKCPMC-- +VF-----GNT-DEPKP-DAP-ASDTETTSEADS------KA------------------- +------------------------------------------------------------ +--------------- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +M------------------ERSL--------------------LPEPPLAMALLGPRF-- +------------------------EAQTGG------NRSVLDNVLPDMAPLVNPHWSRFA +----------PMDPTMSKILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNLA +FSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDRY +NVIVKGINGT-PMTIKTSIMKIAFIWMMAVFW-TIMPLIG-WS-----SYVPEGNLTACS +IDYMTRQ--WNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKAMRDQAKKMNVKS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SEDCDKSAENKLAKVALTTISLWFMAWTPYLI +ICYFGLF---KI-D-GLTPLTTIWGATFAKTSAVYNPIVYGISHPNDRLVLKEKCPMC-- +VC-----GTT-DEPKP-DAP-PSDTETTSEAES------KD------------------- +------------------------------------------------------------ +--------------- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +M-------------------------------------------------IAVSGPSY-- +------------------------EAFSYGGQARFNNQTVVDKVPPDMLHLIDANWYQYP +----------PLNPMWHGILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINLA +ISNFLMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDRY +NVIVKGLSGK-PLSINGALIRIIAIWLFSLGW-TIAPMFG-WN-----RYVPEGNMTACG +TDYFNRG--LLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKNMREQAKKMNVAS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRS--------SENQNTSAECKLAKVALMTISLWFMAWTPYLV +INFSGIF---NL-V-KISPLFTIWGSLFAKANAVYNPIVYGISHPKYRAALFAKFPSL-- +AC-----AA--EPSSD-AVS-TTSG-TTTVTDN------EK------------------S +NA---------------------------------------------------------- +--------------- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +M------------------ANQL---------------------------------SY-- +------------------------SSLGWPYQP---NASVVDTMPKEMLYMIHEHWYAFP +----------PMNPLWYSILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNLA +FSDFCMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDRY +NVIVRGMAAA-PLTHKKATLLLLFVWIWSGGW-TILPFFG-WS-----RYVPEGNLTSCT +VDYLTKD--WSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQLREQAKKMNVAS +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRA-------NADQQKQSAECRLAKVAMMTVGLWFMAWTPYLI +ISWAGVF---SSGT-RLTPLATIWGSVFAKANSCYNPIVYGISHPRYKAALYQRFPSL-- +AC-----GSG-ESGSD-VKS-EASA-TTTMEEK------PKIPEA--------------- +------------------------------------------------------------ +--------------- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +M------------------VEST----------------------TLVNQTWWYNPTV-- +--------------------------------------------------DIHPHWAKFD +----------PIPDAVYYSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINLA +MSDLSFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDRY +NVIGRPMAASKKMSHRRAFLMIIFVWMWSIVW-SVGPVFN-WG-----AYVPEGILTSCS +FDYLSTD--PSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKEMAAMAKRLNAKE +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRK---------AQAGASAEMKLAKISMVIITQFMLSWSPYAI +IALLAQF---GPAE-WVTPYAAELPVLFAKASAIHNPIVYSVSHPKFREAIQTTFPWLLT +CCQFD------EKECE-DAN-DAEE-EVVASER----GGESRDAAQMKEMMAMMQKMQAQ +QAAYQP---PPPPQGYPPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAPPQVEAP +QGAPPQGVDNQAYQA +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +M------------------GRDL-----------------------RDNETWWYNPSI-- +--------------------------------------------------VVHPHWREFD +----------QVPDAVYYSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINLA +FSDFTFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDRY +NVIGRPMAASKKMSHRRAFIMIIFVWLWSVLW-AIGPIFG-WG-----AYTLEGVLCNCS +FDYISRD--STTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKEMAAMAKRLNAKE +------------------------------------------------------------ +------------------------------------------------------------ +-----------------LRK---------AQAGANAEMRLAKISIVIVSQFLLSWSPYAV +VALLAQF---GPLE-WVTPYAAQLPVMFAKASAIHNPMIYSVSHPKFREAISQTFPWVLT +CCQFD------DKETE-DDK-DAET-EIPAGES--SDAAPSADAAQMKEMMAMMQKMQQQ +QAAYPPQGYAPPPQGYPPQGYPPQGY--PPQGYPPQGYPP---PPQGAPPQGAPP----- +-AAPPQGVDNQAYQA +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +--------------------P---HLLS--------GFL-------EVTASPAPTWDAPP +DNVSGCGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLA +LADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRY +LGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-WA-----QNVNDDKVCLIS +QDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPG------- +-------FPRVQPESVISLNG--------------------------------------- +-----------------------VVKLQKE-------------------VEECAN----- +-------------LSRLLKHE------RKNISIFKREQKAATTLGIIVGAFTVCWLPFFL +LSTARPFICGTSCS-CIPLWVERTCLWLGYANSLINPFIYAFFNRDLRPTSRSLL----- +QCQYRNINRK-------LSAAGMHE-ALKLAER------PERSEFVL------------Q +NSDH-------------------------------------------------------- +-------CGKKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +--------------------P---HLLS--------GFL-------EVTASPAPTWDAPP +DNVSGCGEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSLA +LADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDRY +LGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-WA-----QNVNDDKVCLIS +QDF----------GYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKFPG------- +-------FPRVQPESVISLNG--------------------------------------- +-----------------------VVKLQKE-------------------VEECAN----- +-------------LSRLLKHE------RKNISIFKREQKAATTLGIIVGAFTVCWLPFFL +LSTARPFICGTSCS-CIPLWVERTCLWLGYANSLINPFIYAFFNRDLRTTYRSLL----- +QCQYRNINRK-------LSAAGMHE-ALKLAER------PERSEFVL------------Q +NSDH-------------------------------------------------------- +-------CGKKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +M------------------DVLSPG-------------------------------QG-- +------------------------NNTTSPPAPF-E---------------TGGNTTGIS +----------DVTVSYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLA +VTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRY +WAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP---EDRSDPDACTIS +KDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVKKVEKTGADT +RHGASPAPQPKK-----SVNGE--SGSRNWRLGVESKAGGALC----------------- +-------------------------------ANGAVRQGDDGAALEVIEVHRVGNSKEHL +PLPSEAG--PTPCAPASFERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFI +VALVLPF---CESSCHMPTLLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKII----- +KCKFCRQ----------------------------------------------------- +------------------------------------------------------------ +--------------- +> 33=p A35181 serotonin receptor class 1A - rat +M------------------DVFSFG-------------------------------QG-- +------------------------NNTTASQEPF-G---------------TGGNVTSIS +----------DVTFSYQVITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSLA +VTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDRY +WAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP---EDRSDPDACTIS +KDH----------GYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRKTVRKVEKKGAGT +SLGTSSAPPPKK-----SLNGQ--PGSGDWRRCAENRAVGTPC----------------- +-------------------------------TNGAVRQGDDEATLEVIEVHRVGNSKEHL +PLPSESG--SNSYAPACLERKNERNAEAKRKMALARERKTVKTLGIIMGTFILCWLPFFI +VALVLPF---CESSCHMPALLGAIINWLGYSNSLLNPVIYAYFNKDFQNAFKKII----- +KCKFCRR----------------------------------------------------- +------------------------------------------------------------ +--------------- +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +M------------------ANFTFGDLALDVARMGGLASTPSGLRSTGLTTPGLSPTGLV +TSDFNDSYGLTGQFINGSHSSRSRDNASANDT--------------SATNMTDDRYWSLT +----------VYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLA +VADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRY +WAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIIS +QDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKT +EETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPEN +ANGVNSNSSS----------SERLKQIQIETAEAFANGCAEEASIAML-ERQCNNGKK-- +-----------------ISSNDTPYSRTREKLELKRERKAARTLAIITGAFLICWLPFFI +IALIGPF---VDPE-GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKIL----- +FGKYRRGHR--------------------------------------------------- +------------------------------------------------------------ +--------------- +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +M------------------ANFTFGDLALDVARMGGLASTPSGLRSTGLTTPGLSPTGLV +TSDFNDSYGLTGQFINGSHSSRSRDNASANDT--------------SATNMTDDRYWSLT +----------VYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSLA +VADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDRY +WAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NNDPDKTGTCIIS +QDK----------GYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLKT +EETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKKNRAKKLPEN +ANGVNSNSSS----------SERLKQIQIETAEAFANGCAEEASIAML-ERQCNNGKK-- +-----------------ISSNDTPYSRTREKLELKRERKAARTLAIITGAFLICWLPFFI +IALIGPF---VDPE-GIPPFARSFVLWLGYFNSLLNPIIYTIFSPEFRSAFQKIL----- +FGKYRRGHR--------------------------------------------------- +------------------------------------------------------------ +--------------- +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +M------------------EGAE-GQEELDWEALYLRLPL-------------------- +------------------------QNCSWNSTGWEPNW--------NVTVVPNTTWWQAS +-----APFDTPAALVRAAAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSLA +VADLLVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDRY +WAVTN-IDYIHASTAKRVGMMIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDLRCVVS +QDV----------GYQIFATASSFYVPVLIILILYWRIYQTARKRIRRRRGATARGGVGP +-------PP-----------------------------------------------VPAG +GALVAGGGSGGIAAAVVAVIGRPLPTISETTTTGFTNVSSNNTSPE---KQSCANGLEAD +PPTTGYGAVAAAYYPSLVRRK------PKEAADSKRERKAAKTLAIITGAFVACWLPFFV +LAILVPT---CDCE--VSPVLTSLSLWLGYFNSTLNPVIYTVFSPEFRHAFQRLL----- +CGRRVRRRRA-----------------------------PQ------------------- +------------------------------------------------------------ +--------------- diff --git a/mafft/src/mafft-7.487-with-extensions/test/sample.parttree b/mafft/src/mafft-7.487-with-extensions/test/sample.parttree new file mode 100644 index 0000000000..b3242a2b7a --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/sample.parttree @@ -0,0 +1,504 @@ +> 1== M63632 1 Lampetra japonica rhodopsin <>[BBRC174,1125-1132'91] +MN-------------------GTE------GDNFYVPF----------------SNKTGL +-----------ARSPYEYPQY-----YLAEPWK--------------------Y------ +------------------SALAAYMFFLILVGFPVNFLTLFVTVQHKKLRTPLNYILLNL +AMANLFMVLFG-FTVTMYTSMN-GYFV--FGPTMCSIEGFFATLGGEVALWSLVVLAIER +YIVICKPMGN-FRFGNTHAIMGVAFTWIMALAC-AAPPLVG-W-----SRYIPEGMQCSC +GPDYYTLNPNFNNESYVVYMFVVHFLVPFVIIFFCYGRLLCTV----KE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAAQQ------------------------------------ESASTQKAEKEVTRM +VVLMVIGFLVCWVPYASVAFYIFT-HQGS--DFGATFMTLPAFFAKSSALYNPVIYILMN +KQFRNCMITTLC----C---GKNPLGD-DE--SGASTSKTEV------------------ +------------------------------------------------------------ +---SSVS-------TSPVSP-A---------- +> 2== U22180 1 rat opsin [J.Mol.Neurosci.5(3),207-209'94] +MN-------------------GTE------GPNFYVPF----------------SNITGV +-----------VRSPFEQPQY-----YLAEPWQ--------------------F------ +------------------SMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNL +AVADLFMVFGG-FTTTLYTSLH-GYFV--FGPTGCNLEGFFATLGGEIGLWSLVVLAIER +YVVVCKPMSN-FRFGENHAIMGVAFTWVMALAC-AAPPLVG-W-----SRYIPEGMQCSC +GIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTV----KE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------ESATTQKAEKEVTRM +VIIMVIFFLICWLPYASVAMYIFT-HQGS--NFGPIFMTLPAFFAKTASIYNPIIYIMMN +KQFRNCMLTSLC----C---GKNPLGD-DE--ASATASKTE------------------- +------------------------------------------------------------ +--------------TSQVAP-A---------- +> 3== M92038 1 chicken green sensitive cone opsin [PNAS89,5932-5936'9 +MN-------------------GTE------GINFYVPM----------------SNKTGV +-----------VRSPFEYPQY-----YLAEPWK--------------------Y------ +------------------RLVCCYIFFLISTGLPINLLTLLVTFKHKKLRQPLNYILVNL +AVADLFMACFG-FTVTFYTAWN-GYFV--FGPVGCAVEGFFATLGGQVALWSLVVLAIER +YIVVCKPMGN-FRFSATHAMMGIAFTWVMAFSC-AAPPLFG-W-----SRYMPEGMQCSC +GPDYYTHNPDYHNESYVLYMFVIHFIIPVVVIFFSYGRLICKV----RE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------ESATTQKAEKEVTRM +VILMVLGFMLAWTPYAVVAFWIFT-NKGA--DFTATLMAVPAFFSKSSSLYNPIIYVLMN +KQFRNCMITTIC----C---GKNPFGD-EDVSSTVSQSKTEV------------------ +------------------------------------------------------------ +---SSVS-------SSQVSP-A---------- +> 4=p A45229 opsin, green-sensitive (clone GFgr-1) - goldfish +MN-------------------GTE------GKNFYVPM----------------SNRTGL +-----------VRSPFEYPQY-----YLAEPWQ--------------------F------ +------------------KILALYLFFLMSMGLPINGLTLVVTAQHKKLRQPLNFILVNL +AVAGTIMVCFG-FTVTFYTAIN-GYFV--LGPTGCAVEGFMATLGGEVALWSLVVLAIER +YIVVCKPMGS-FKFSSSHAFAGIAFTWVMALAC-AAPPLFG-W-----SRYIPEGMQCSC +GPDYYTLNPDYNNESYVIYMFVCHFILPVAVIFFTYGRLVCTV----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------DSASTQKAEREVTKM +VILMVFGFLIAWTPYATVAAWIFF-NKGA--DFSAKFMAIPAFFSKSSALYNPVIYVLLN +KQFRNCMLTTIF----C---GKNPLGD-DE-SSTVSTSKTEV------------------ +------------------------------------------------------------ +---SS------------VSP-A---------- +> 5=p B45229 opsin, green-sensitive (clone GFgr-2) - goldfish +MN-------------------GTE------GNNFYVPL----------------SNRTGL +-----------VRSPFEYPQY-----YLAEPWQ--------------------F------ +------------------KLLAVYMFFLICLGLPINGLTLICTAQHKKLRQPLNFILVNL +AVAGAIMVCFG-FTVTFYTAIN-GYFA--LGPTGCAVEGFMATLGGEVALWSLVVLAIER +YIVVCKPMGS-FKFSSTHASAGIAFTWVMAMAC-AAPPLVG-W-----SRYIPEGIQCSC +GPDYYTLNPEYNNESYVLYMFICHFILPVTIIFFTYGRLVCTV----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQQ------------------------------------DSASTQKAEREVTKM +VILMVLGFLVAWTPYATVAAWIFF-NKGA--AFSAQFMAIPAFFSKTSALYNPVIYVLLN +KQFRSCMLTTLF----C---GKNPLGD-EE-SSTVSTSKTEV------------------ +------------------------------------------------------------ +---SS------------VSP-A---------- +> 6== L11864 1 Carassius auratus blue cone opsin [Biochemistry32,208- +MK-------------------QVPE----FHEDFYIPIPL------------DINNLSAY +-------------SPFLVPQD-----HLGNQGI--------------------F------ +------------------MAMSVFMFFIFIGGASINILTILCTIQFKKLRSHLNYILVNL +SIANLFVAIFG-SPLSFYSFFN-RYFI--FGATACKIEGFLATLGGMVGLWSLAVVAFER +WLVICKPLGN-FTFKTPHAIAGCILPWISALAA-SLPPLFG-W-----SRYIPEGLQCSC +GPDWYTTNNKYNNESYVMFLFCFCFAVPFGTIVFCYGQLLITL----KL----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAKAQA------------------------------------DSASTQKAEREVTKM +VVVMVLGFLVCWAPYASFSLWIVS-HRGE--EFDLRMATIPSCLSKASTVYNPVIYVLMN +KQFRSCMM-KMV----C---GKN-IEE-DE--ASTSSQVTQV------------------ +------------------------------------------------------------ +---SS------------VAPEK---------- +> 7== M13299 1 human BCP <>[Science232(4747),193-202'86] +MR-------------------KMS------EEEFYL-----------------FKNISSV +-------------GPWDGPQY-----HIAPVWA--------------------F------ +------------------YLQAAFMGTVFLIGFPLNAMVLVATLRYKKLRQPLNYILVNV +SFGGFLLCIFS-VFPVFVASCN-GYFV--FGRHVCALEGFLGTVAGLVTGWSLAFLAFER +YIVICKPFGN-FRFSSKHALTVVLATWTIGIGV-SIPPFFG-W-----SRFIPEGLQCSC +GPDWYTVGTKYRSESYTWFLFIFCFIVPLSLICFSYTQLLRAL----KA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQQ------------------------------------ESATTQKAEREVSRM +VVVMVGSFCVCYVPYAAFAMYMVN-NRNH--GLDLRLVTIPSFFSKSACIYNPIIYCFMN +KQFQACIM-KMV----C---GKA-MTD-ES--DTCSSQKTEV------------------ +------------------------------------------------------------ +---STVS-------STQVGP-N---------- +> 8=opsin, greensensitive human (fragment) S07060 +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---DLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WLVVCKPFGN-VRFDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMVLAFC--------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +-------------------------------- +> 9== K03494 1 human GCP <>[Science232(4747),193-202'86] +MAQQWSLQRLAGRHPQDSYEDSTQ------SSIFTYTN----------------SNST-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------HLTSVWMIFVVIASVFTNGLVLAATMKFKKLRHPLNWILVNL +AVADLAETVIA-STISVVNQVY-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WMVVCKPFGN-VRFDAKLAIVGIAFSWIWAAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCITPLSIIVLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMVLAFCFCWGPYAFFACFAAA-NPGY--PFHPLMAALPAFFAKSATIYNPVIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--ELSSASKTEV------------------ +------------------------------------------------------------ +---SSV---------SSVSP-A---------- +> 10== Z68193 1 human Red Opsin <>[] +MAQQWSLQRLAGRHPQDSYEDSTQ------SSIFTYTN----------------SNST-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------HLTSVWMIFVVTASVFTNGLVLAATMKFKKLRHPLNWILVNL +AVADLAETVIA-STISIVNQVS-GYFV--LGHPMCVLEGYTVSLCGITGLWSLAIISWER +WLVVCKPFGN-VRFDAKLAIVGIAFSWIWSAVW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSYPGVQSYMIVLMVTCCIIPLAIIMLCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAKQQK------------------------------------ESESTQKAEKEVTRM +VVVMIFAYCVCWGPYTFFACFAAA-NPGY--AFHPLMAALPAYFAKSATIYNPVIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--ELSSASKTEV------------------ +------------------------------------------------------------ +---SSV---------SSVSP-A---------- +> 11== M92036 1 Gecko gecko P521 [PNAS89,6841-6845'92] +MTEAWNVAVFAARRSRDD-DDTTR------GSVFTYTN----------------TNNT-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------NLVSFFMIIVVIASCFTNGLVLVATAKFKKLRHPLNWILVNL +AFVDLVETLVA-STISVFNQIF-GYFI--LGHPLCVIEGYVVSSCGITGLWSLAIISWER +WFVVCKPFGN-IKFDSKLAIIGIVFSWVWAWGW-SAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSVELGCQSFMLTLMITCCFLPLFIIIVCYLQVWMAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQK------------------------------------ESESTQKAEREVSRM +VVVMIVAFCICWGPYASFVSFAAA-NPGY--AFHPLAAALPAYFAKSATIYNPVIYVFMN +RQFRNCIMQLF---------GKK-VDD-GS--EASTTSRTEV------------------ +------------------------------------------------------------ +---SSVS-------NSSVAP-A---------- +> 12== M62903 1 chicken visual pigment <>[BBRC173,1212-1217'90] +MA-AWEAAFAARRRHEE--EDTTR------DSVFTYTN----------------SNNT-- +------------RGPFEGPNY-----HIAPRWV--------------------Y------ +------------------NLTSVWMIFVVAASVFTNGLVLVATWKFKKLRHPLNWILVNL +AVADLGETVIA-STISVINQIS-GYFI--LGHPMCVVEGYTVSACGITALWSLAIISWER +WFVVCKPFGN-IKFDGKLAVAGILFSWLWSCAW-TAPPIFG-W-----SRYWPHGLKTSC +GPDVFSGSSDPGVQSYMVVLMVTCCFFPLAIIILCYLQVWLAI----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---VAAQQK------------------------------------ESESTQKAEKEVSRM +VVVMIVAYCFCWGPYTFFACFAAA-NPGY--AFHPLAAALPAYFAKSATIYNPIIYVFMN +RQFRNCILQLF---------GKK-VDD-GS--EVST-SRTEV------------------ +------------------------------------------------------------ +---SSVS-------NSSVSP-A---------- +> 13== S75720 1 chicken P-opsin <>[Science267(5203),1502-1506'95] +MS-----------------SNSSQ------AP----------------------PNGT-- +------------PGPFDGPQW----PYQAPQST--------------------Y------ +------------------VGVAVLMGTVVACASVVNGLVIVVSICYKKLRSPLNYILVNL +AVADLLVTLCG-SSVSLSNNIN-GFFV--FGRRMCELEGFMVSLTGIVGLWSLAILALER +YVVVCKPLGD-FQFQRRHAVSGCAFTWGWALLW-SAPPLLG-W-----SSYVPEGLRTSC +GPNWYTGGS--NNNSYILSLFVTCFVLPLSLILFSYTNLLLTL----RA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---AAAQQK------------------------------------EADTTQRAEREVTRM +VIVMVMAFLLCWLPYSTFALVVAT-HKGI--IIQPVLASLPSYFSKTATVYNPIIYVFMN +KQFQSCLLEMLC----CGYQPQR-TGK-AS--PGTPGPHADV------------------ +------------------------------------------------------------ +---TAAG------LRNKVMP-AH-------PV +> 14== M17718 1 D.melanogaster Rh3 <>[J.Neurosci.7,1550-1557'87] +MESGNV---------------SSSLFGNVST-ALRPEARLSA---ETRLLGW-------- +------------NVPPEELR------HIPEHWL-----------TYPEPPESMN------ +------------------YLLGTLYIFFTLMSMLGNGLVIWVFSAAKSLRTPSNILVINL +AFCDFMMMVK--TPIFIYNSFH-QGYA--LGHLGCQIFGIIGSYTGIAAGATNAFIAYDR +FNVITRPMEG--KMTHGKAIAMIIFIYMYATPW-VVACYTETW-----GRFVPEGYLTSC +TFDYLT--DNFDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LRDQAKK----------MNVESL----------------RSNVDKNKETAEIRIAKA +AITICFLFFCSWTPYGVMSLIGAF-GDKT--LLTPGATMIPACACKMVACIDPFVYAISH +PRYRMELQKRCP----WLALNEKAPE--SS-AVASTSTTQEP------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 15== X65879 1 Drosophila pseudoobscura Dpse\Rh3 <>[Genetics132(1),193-204'92 +MEYHNV---------------SSVL-GNVSS-VLRPDARLSA---ESRLLGW-------- +------------NVPPDELR------HIPEHWL-----------IYPEPPESMN------ +------------------YLLGTLYIFFTVISMIGNGLVMWVFSAAKSLRTPSNILVINL +AFCDFMMMIK--TPIFIYNSFH-QGYA--LGHLGCQIFGVIGSYTGIAAGATNAFIAYDR +YNVITRPMEG--KMTHGKAIAMIIFIYLYATPW-VVACYTESW-----GRFVPEGYLTSC +TFDYLT--DNFDTRLFVACIFFFSFVCPTTMITYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LRDQAKK----------MNVDSL----------------RSNVDKSKEAAEIRIAKA +AITICFLFFASWTPYGVMSLIGAF-GDKT--LLTPGATMIPACTCKMVACIDPFVYAISH +PRYRMELQKRCP----WLAISEKAPE--SR-AAISTSTTQEQ------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 16== M17730 1 D.melanogaster Rh4 opsin <>[J.Neurosci.7,1558-1566'87] +ME---------------------PL-CNASEPPLRPEAR-SSGNGDLQFLGW-------- +------------NVPPDQIQ------YIPEHWL-----------TQLEPPASMH------ +------------------YMLGVFYIFLFCASTVGNGMVIWIFSTSKSLRTPSNMFVLNL +AVFDLIMCLK--APIF--NSFH-RGFAIYLGNTWCQIFASIGSYSGIGAGMTNAAIGYDR +YNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSC +SFDYLS--DNFDTRLFVGTIFFFSFVCPTLMILYYYSQIVGHVFSHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVESL----------------RSNVDKSKETAEIRIAKA +AITICFLFFVSWTPYGVMSLIGAF-GDKS--LLTQGATMIPACTCKLVACIDPFVYAISH +PRYRLELQKRCP----WLGVNEKSGE--IS-SAQST-TTQEQ------------------ +------------------------------------------------------------ +---------------QQTTA-A---------- +> 17== X65880 1 Drosophila pseudoobscura Dpse\Rh4 <>[Genetics132(1),193-204'92 +MD---------------------AL-CNASEPPLRPEARMSSGSDELQFLGW-------- +------------NVPPDQIQ------YIPEHWL-----------TQLEPPASMH------ +------------------YMLGVFYIFLFFASTLGNGMVIWIFSTSKSLRTPSNMFVLNL +AVFDLIMCLK--APIFIYNSFH-RGFA--LGNTWCQIFASIGSYSGIGAGMTNAAIGYDR +YNVITKPMNR--NMTFTKAVIMNIIIWLYCTPW-VVLPLTQFW-----DRFVPEGYLTSC +SFDYLS--DNFDTRLFVGTIFLFSFVVPTLMILYYYSQIVGHVFNHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVESL----------------RSNVDKSKETAEIRIAKA +AITICFLFFVSWTPYGVMSLIGAF-GDKS--LLTPGATMIPACTCKLVACIEPFVYAISH +PRYRMELQKRCP----WLGVNEKSGE--AS-SAQST-TTQEQ------------------ +------------------------------------------------------------ +--------------TQQTSA-A---------- +> 18== D50584 1 Hemigrapsus sanguineus opsin BcRh2 [J.Exp.Biol.1 +MT-------------------------NATGPQMAYYGAASMD------FGYP-EGVSIV +-----------DFVRPEIKP------YVHQHWY-----------NYPPVNPMWH------ +------------------YLLGVIYLFLGTVSIFGNGLVIYLFNKSAALRTPANILVVNL +ALSDLIMLTTN-VPFFTYNCFSGGVWM--FSPQYCEIYACLGAITGVCSIWLLCMISFDR +YNIICNGFNG-PKLTTGKAVVFALISWVIAIGC-ALPPFFG-W-----GNYILEGILDSC +SYDYLT--QDFNTFSYNIFIFVFDYFLPAAIIVFSYVFIVKAIFAHEAA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRAQAKK----------MNVSTL----------------RS-NEADAQRAEIRIAKT +ALVNVSLWFICWTPYALISLKGVM-GDTS--GITPLVSTLPALLAKSCSCYNPFVYAISH +PKYRLAITQHLP----WFCVHETETKS-ND-DSQSNSTVAQ------------------- +------------------------------------------------------------ +------------------DK-A---------- +> 19== D50583 1 Hemigrapsus sanguineus opsin BcRh1 [J.Exp.Biol.1 +MA-------------------------NVTGPQMAFYGSGAAT------FGYP-EGMTVA +-----------DFVPDRVKH------MVLDHWY-----------NYPPVNPMWH------ +------------------YLLGVVYLFLGVISIAGNGLVIYLYMKSQALKTPANMLIVNL +ALSDLIMLTTN-FPPFCYNCFSGGRWM--FSGTYCEIYAALGAITGVCSIWTLCMISFDR +YNIICNGFNG-PKLTQGKATFMCGLAWVISVGW-SLPPFFG-W-----GSYTLEGILDSC +SYDYFT--RDMNTITYNICIFIFDFFLPASVIVFSYVFIVKAIFAHEAA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRAQAKK----------MNVTNL----------------RS-NEAETQRAEIRIAKT +ALVNVSLWFICWTPYAAITIQGLL-GNAE--GITPLLTTLPALLAKSCSCYNPFVYAISH +PKFRLAITQHLP----WFCVHEKDPND-VE-ENQSSNTQTQ------------------- +------------------------------------------------------------ +------------------EK-S---------- +> 20== K02320 1 D.melanogaster opsin <>[Cell40,851-858'85] +ME-------------------SFAVAAAQLGPHFAPLS-----------------NGSVV +-----------DKVTPDMAH------LISPYWN-----------QFPAMDPIWA------ +------------------KILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKM---------------------------YVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDAEKSAEGKLAKV +ALVTITLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-DAQSQATASEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 21== K02315 1 D.melanogaster ninaE <>[Cell40,839-850'85] +ME-------------------SFAVAAAQLGPHFAPLS-----------------NGSVV +-----------DKVTPDMAH------LISPYWN-----------QFPAMDPIWA------ +------------------KILTAYMIMIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKIAYIWFMSSIW-CLAPAFG-W-----SRYVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDAEKSAEGKLAKV +ALVTITLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-DAQSQATASEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 22== X65877 1 Drosophila pseudoobscura Dpse\ninaE <>[Genetics132(1),193-204' +MD-------------------SFAAVATQLGPQFAAPS-----------------NGSVV +-----------DKVTPDMAH------LISPYWD-----------QFPAMDPIWA------ +------------------KILTAYMIIIGMISWCGNGVVIYIFATTKSLRTPANLLVINL +AISDFGIMITN-TPMMGINLYF-ETWV--LGPMMCDIYAGLGSAFGCSSIWSMCMISLDR +YQVIVKGMAG-RPMTIPLALGKIAYIWFMSTIWCCLAPVFG-W-----SRYVPEGNLTSC +GIDYLE--RDWNPRSYLIFYSIFVYYIPLFLICYSYWFIIAAVSAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDADKSAEGKLAKV +ALVTISLWFMAWTPYLVINCMGLF-KF-E--GLTPLNTIWGACFAKSAACYNPIVYGISH +PKYRLALKEKCP----CCVFGKVDDGK-SS-EAQSQATTSEA------------------ +------------------------------------------------------------ +---E--------------SK-A---------- +> 23== M12896 1 D.melanogaster Rh2 <>[Cell44,705-710'86] +MERSH--------------LPETPFDLAHSGPRFQAQSSG---------------NGSVL +-----------DNVLPDMAH------LVNPYWS-----------RFAPMDPMMS------ +------------------KILGLFTLAIMIISCCGNGVVVYIFGGTKSLRTPANLLVLNL +AFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAGCGSLFGCVSIWSMCMIAFDR +YNVIVKGING-TPMTIKTSIMKILFIWMMAVFW-TVMPLIG-W-----SAYVPEGNLTAC +SIDYMT--RMWNPRSYLITYSLFVYYTPLFLICYSYWFIIAAVAAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVKSL----------------RS-SEDCDKSAEGKLAKV +ALTTISLWFMAWTPYLVICYFGLF-KI-D--GLTPLTTIWGATFAKTSAVYNPIVYGISH +PKYRIVLKEKCP----MCVFGNTDEPKPDA-PASDTETTSEA------------------ +------------------------------------------------------------ +---D--------------SK-A---------- +> 24== X65878 1 Drosophila pseudoobscura Dpse\Rh2 <>[Genetics132(1),193-204'92 +MERSL--------------LPEPPLAMALLGPRFEAQTGG---------------NRSVL +-----------DNVLPDMAP------LVNPHWS-----------RFAPMDPTMS------ +------------------KILGLFTLVILIISCCGNGVVVYIFGGTKSLRTPANLLVLNL +AFSDFCMMASQ-SPVMIINFYY-ETWV--LGPLWCDIYAACGSLFGCVSIWSMCMIAFDR +YNVIVKGING-TPMTIKTSIMKIAFIWMMAVFW-TIMPLIG-W-----SSYVPEGNLTAC +SIDYMT--RQWNPRSYLITYSLFVYYTPLFMICYSYWFIIATVAAHEKA----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MRDQAKK----------MNVKSL----------------RS-SEDCDKSAENKLAKV +ALTTISLWFMAWTPYLIICYFGLF-KI-D--GLTPLTTIWGATFAKTSAVYNPIVYGISH +PNDRLVLKEKCP----MCVCGTTDEPKPDA-PPSDTETTSEA------------------ +------------------------------------------------------------ +---E--------------SK-D---------- +> 25== U26026 1 Apis mellifera long-wavelength rhodopsin <>[] +MI-------------------------AVSGPSYEAFSYGGQA-----RF----NNQTVV +-----------DKVPPDMLH------LIDANWY-----------QYPPLNPMWH------ +------------------GILGFVIGMLGFVSAMGNGMVVYIFLSTKSLRTPSNLFVINL +AISNFLMMFCM-SPPMVINCYY-ETWV--LGPLFCQIYAMLGSLFGCGSIWTMTMIAFDR +YNVIVKGLSG-KPLSINGALIRIIAIWLFSLGW-TIAPMFG-W-----NRYVPEGNMTAC +GTDYFN--RGLLSASYLVCYGIWVYFVPLFLIIYSYWFIIQAVAAHEKN----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MREQAKK----------MNVASL----------------RS-SENQNTSAECKLAKV +ALMTISLWFMAWTPYLVINFSGIF-NL-V--KISPLFTIWGSLFAKANAVYNPIVYGISH +PKYRAALFAKFP----SLAC-AAEPSS-DA-VSTTSGTTTVT------------------ +------------------------------------------------------------ +---DNEK-----------SN-A---------- +> 26== L03781 1 Limulus polyphemus opsin <>[PNAS90,6150-6154'93] +M---------------------------ANQLSYSSLGWPYQP------------NASVV +-----------DTMPKEMLY------MIHEHWY-----------AFPPMNPLWY------ +------------------SILGVAMIILGIICVLGNGMVIYLMMTTKSLRTPTNLLVVNL +AFSDFCMMAFM-MPTMTSNCFA-ETWI--LGPFMCEVYGMAGSLFGCASIWSMVMITLDR +YNVIVRGMAA-APLTHKKATLLLLFVWIWSGGW-TILPFFG-W-----SRYVPEGNLTSC +TVDYLT--KDWSSASYVVIYGLAVYFLPLITMIYCYFFIVHAVAEHEKQ----------- +------------------------------------------------------------ +------------------------------------------------------------ +---LREQAKK----------MNVASL----------------RANADQQKQSAECRLAKV +AMMTVGLWFMAWTPYLIISWAGVF-SSGT--RLTPLATIWGSVFAKANSCYNPIVYGISH +PRYKAALYQRFP----SLACGSGESGS-DV-KSEASATTTME------------------ +------------------------------------------------------------ +---EKPK----------IPE-A---------- +> 27== X07797 1 Octopus dofleini rhodopsin <>[FEBS232(1),69-72'88] +MVESTTL------------VNQT--------------------------WWY---NPTVD +---------------------------IHPHWA-----------KFDPIPDAVY------ +------------------YSVGIFIGVVGIIGILGNGVVIYLFSKTKSLQTPANMFIINL +AMSDLSFSAINGFPLKTISAFM-KKWI--FGKVACQLYGLLGGIFGFMSINTMAMISIDR +YNVIGRPMAASKKMSHRRAFLMIIFVWMWSIVW-SVGPVFN-W-----GAYVPEGILTSC +SFDYLS--TDPSTRSFILCMYFCGFMLPIIIIAFCYFNIVMSVSNHEKE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MAAMAKR----------LNAKEL----------------R--KAQAGASAEMKLAKI +SMVIITQFMLSWSPYAIIALLAQF-GPAE--WVTPYAAELPVLFAKASAIHNPIVYSVSH +PKFREAIQTTFPWLLTCCQFDEKECED-AN-DAEEEVVASER--GGESRDAAQMKEMMAM +MQKMQAQQAAYQPPPPPQGY--PPQGYPPQGAYPPPQGYPPQGYPPQGYPPQGYPPQGAP +PQVEAPQGAPPQGVDNQAYQ-A---------- +> 28== X70498 1 Todarodes pacificus rhodopsin [FEBS317(1-2),5-11'93] +MGRDLR-------------DNET--------------------------WWY---NPSIV +---------------------------VHPHWR-----------EFDQVPDAVY------ +------------------YSLGIFIGICGIIGCGGNGIVIYLFTKTKSLQTPANMFIINL +AFSDFTFSLVNGFPLMTISCFL-KKWI--FGFAACKVYGFIGGIFGFMSIMTMAMISIDR +YNVIGRPMAASKKMSHRRAFIMIIFVWLWSVLW-AIGPIFG-W-----GAYTLEGVLCNC +SFDYIS--RDSTTRSNILCMFILGFFGPILIIFFCYFNIVMSVSNHEKE----------- +------------------------------------------------------------ +------------------------------------------------------------ +---MAAMAKR----------LNAKEL----------------R--KAQAGANAEMRLAKI +SIVIVSQFLLSWSPYAVVALLAQF-GPLE--WVTPYAAQLPVMFAKASAIHNPMIYSVSH +PKFREAISQTFPWVLTCCQFDDKETED-DK-DAETEIPAGESSDAAPSADAAQMKEMMAM +MQKMQQQQAAY----PPQGYAPPPQGYPPQGY--PPQGYPPQGYPPQGYPP---PPQGAP +PQ-GAPPAAPPQGVDNQAYQ-A---------- +> 29== L21195 1 human serotonin 5-HT7 receptor protein 30== L15228 1 rat 5HT-7 serotonin receptor <>[JBC268,18200-18204'93] +M----------------------------------------------------------- +--------------PHLLSGFLEVTASPAPTWD------------APPDNVSGC------ +-------GEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSL +ALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDR +YLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDK--VC +LIS--------QDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF-------- +---------PGF---------------------------------PRVQPESVI------ +----------------SLNGVVK----------------------LQKEVEECAN----- +---LSRLLKH--------------------------------ER-KNISIFKREQKAATT +LGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFN +RDLRPTSRSLLQ--------CQYRNIN----RKLSAAGMHEA------------------ +-LKLA------------------------------------------------------- +---ERPE------RSEFVLQNSDHCGKKGHDT +> 31=p A47425 serotonin receptor 5HT-7 - rat +M----------------------------------------------------------- +--------------PHLLSGFLEVTASPAPTWD------------APPDNVSGC------ +-------GEQINYGRVEKVVIGSILTLITLLTIAGNCLVVISVSFVKKLRQPSNYLIVSL +ALADLSVAVAV-MPFVSVTDLIGGKWI--FGHFFCNVFIAMDVMCCTASIMTLCVISIDR +YLGITRPLTYPVRQNGKCMAKMILSVWLLSASI-TLPPLFG-W-----AQNVNDDK--VC +LIS--------QDFGYTIYSTAVAFYIPMSVMLFMYYQIYKAARKSAAKHKF-------- +---------PGF---------------------------------PRVQPESVI------ +----------------SLNGVVK----------------------LQKEVEECAN----- +---LSRLLKH--------------------------------ER-KNISIFKREQKAATT +LGIIVGAFTVCWLPFFLLSTARPFICGTSCSCIPLWVERTCLWLGYANSLINPFIYAFFN +RDLRTTYRSLLQ--------CQYRNIN----RKLSAAGMHEA------------------ +-LKLA------------------------------------------------------- +---ERPE------RSEFVLQNSDHCGKKGHDT +> 32== M83181 1 human serotonin receptor <>[JBC267(11),7553-7562'92] +M-DVLS-------------PGQ--------GNNTTSPPAPFETG----------GNTTGI +-------------------------SDVTVSYQ--------------------------- +------------------VITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSL +AVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDR +YWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP--EDRSDPD---AC +TIS--------KDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK----------- +----------------------------TVKKVEKTGADTRHGASPAPQPKKSVNGESGS +RNWRLGVESKAGGAL-CANGAVRQGDDGAALEVIEVHRVGNSKEHLPLPSEAGPTPCAP- +----ASFERK-----------NERNA----------------EA-KRKMALARERKTVKT +LGIIMGTFILCWLPFFIVALVLPF-CESSC-HMPTLLGAIINWLGYSNSLLNPVIYAYFN +KDFQNAFKKIIK--------CKFCR----------------------------------- +------------------------------------------------------------ +-------------------------------Q +> 33=p A35181 serotonin receptor class 1A - rat +M-DVFS-------------FGQ--------GNNTTASQEPFGTG----------GNVTSI +-------------------------SDVTFSYQ--------------------------- +------------------VITSLLLGTLIFCAVLGNACVVAAIALERSLQNVANYLIGSL +AVTDLMVSVLV-LPMAALYQVL-NKWT--LGQVTCDLFIALDVLCCTSSILHLCAIALDR +YWAITDPIDYVNKRTPRRAAALISLTWLIGFLI-SIPPMLG-WRTP--EDRSDPD---AC +TIS--------KDHGYTIYSTFGAFYIPLLLMLVLYGRIFRAARFRIRK----------- +----------------------------TVRKVEKKGAGTSLGTSSAPPPKKSLNGQPGS +GDWRRCAENRAVGTP-CTNGAVRQGDDEATLEVIEVHRVGNSKEHLPLPSESGSNSYAP- +----ACLERK-----------NERNA----------------EA-KRKMALARERKTVKT +LGIIMGTFILCWLPFFIVALVLPF-CESSC-HMPALLGAIINWLGYSNSLLNPVIYAYFN +KDFQNAFKKIIK--------CKFCR----------------------------------- +------------------------------------------------------------ +-------------------------------R +> 34== L06803 1 Lymnaea stagnalis serotonin receptor <>[PNAS90,11-15'93] +M-ANFT-------------FGDLALDVARMGGLASTPSGLRSTG----------LTTPGL +SPTG------------------LVTSDFNDSYGLTGQFINGSHSSRSRDNASAN-DTSAT +NMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSL +AVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDR +YWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NN--DPDKTGTC +IIS--------QDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLK +TEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKK-------- +--------NRAKKLPENANGVNSNSSSSERLKQIQIE-----------TAEAFANGCAEE +AS-IAMLERQ-CNNGKKISSNDTPYS----------------RT-REKLELKRERKAART +LAIITGAFLICWLPFFIIALIGPF-VDPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFS +PEFRSAFQKILF--------GKYRRG---------------------------------- +------------------------------------------------------------ +------------------------------HR +> 35=p A47174 serotonin receptor, 5HTlym receptor - great pond snail +M-ANFT-------------FGDLALDVARMGGLASTPSGLRSTG----------LTTPGL +SPTG------------------LVTSDFNDSYGLTGQFINGSHSSRSRDNASAN-DTSAT +NMTDDRYWSLTVYSHEHLVLTSVILGLFVLCCIIGNCFVIAAVMLERSLHNVANYLILSL +AVADLMVAVLV-MPLSVVSEIS-KVWF--LHSEVCDMWISVDVLCCTASILHLVAIAMDR +YWAVTS-IDYIRRRSARRILLMIMVVWIVALFI-SIPPLFG-WRDP--NN--DPDKTGTC +IIS--------QDKGYTIFSTVGAFYLPMLVMMIIYIRIWLVARSRIRKDKFQMTKARLK +TEETTLVASPKTEYSVVSDCNGCNSPDSTTEKKKRRAPFKSYGCSPRPERKK-------- +--------NRAKKLPENANGVNSNSSSSERLKQIQIE-----------TAEAFANGCAEE +AS-IAMLERQ-CNNGKKISSNDTPYS----------------RT-REKLELKRERKAART +LAIITGAFLICWLPFFIIALIGPF-VDPE--GIPPFARSFVLWLGYFNSLLNPIIYTIFS +PEFRSAFQKILF--------GKYRRG---------------------------------- +------------------------------------------------------------ +------------------------------HR +> 36== X95604 1 Bombyx mori serotonin receptor [InsectBiochem.Mol.Bi +M-EG-A-------------EGQEELD----WEALYLRLPLQNCS----------WNSTGW +EPNW------------------NVTVVPNTTWW----------------QASAPFDTPAA +LVRA--------------AAKAVVLGLLILATVVGNVFVIAAILLERHLRSAANNLILSL +AVADLLVACLV-MPLGAVYEVV-QRWT--LGPELCDMWTSGDVLCCTASILHLVAIALDR +YWAVTN-IDYIHASTAKRVGMMIACVWTVSFFV-CIAQLLG-WKDPDWNQRVSEDL--RC +VVS--------QDVGYQIFATASSFYVPVLIILILYWRIYQTARKRIRR----------- +----------------------------------RRGATARGGVGPPPVP---------- +-----------------AGGALVAGGGSGGIAAAVVAVIGRP---LPTISETTTTGFTNV +SSNNTSPEKQSCANGLEA---DPPTTGYGAVAAAYYPSLVRRKP-KEAADSKRERKAAKT +LAIITGAFVACWLPFFVLAILVPT-CDCE---VSPVLTSLSLWLGYFNSTLNPVIYTVFS +PEFRHAFQRLLC--------GRRVRRR----R---------------------------- +------------------------------------------------------------ +-----------------------------APQ diff --git a/mafft/src/mafft-7.487-with-extensions/test/samplerna b/mafft/src/mafft-7.487-with-extensions/test/samplerna new file mode 100644 index 0000000000..926ff03242 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/samplerna @@ -0,0 +1,36 @@ +>AJ006331.1_1230 +ccauggcguuaguau +gagugucgugcagccuccaggccccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaaucgcuggggugaccggguccuuucuuggaacaacccgc +ucaauacccagaaauuugggcgugcccccgcgagaucacuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagu + +>Z84287.1_1250 +uucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucgaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgagagu + +>AF064490.1_2296 +ugagu +gucgaacagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccgggaugaccggguccuuucuuggauaaacccgc +ucaaugcccggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaacaugagcacgaauccuaaaccucaaagaaaaaccaaaagaaacaccaaccg +>Z84230.1_1250 +uucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggauaagcccgc +ucaaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgagagu + +>AB049100.1_1360 +auagaucacuccccugugaggaacuacugucuucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucaaugccuggagauuugggcgugcccccgcgagaccgcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaccaugagcacgaauccuaaaccucaaagaaaaaccaaacguaacaccaaccg + diff --git a/mafft/src/mafft-7.487-with-extensions/test/samplerna.qinsi b/mafft/src/mafft-7.487-with-extensions/test/samplerna.qinsi new file mode 100644 index 0000000000..0d9d4c27e8 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/samplerna.qinsi @@ -0,0 +1,35 @@ +>AJ006331.1_1230 +---------------------------------------------------ccauggcgu +uaguaugagugucgugcagccuccaggccccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaaucgcuggggugaccggguccuuucuuggaacaacccgc +ucaauacccagaaauuugggcgugcccccgcgagaucacuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagu------------------- +------------------------------------------------------------ +>Z84287.1_1250 +-------------------------------uucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucgaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgagagu------------------- +------------------------------------------------------------ +>AF064490.1_2296 +------------------------------------------------------------ +-----ugagugucgaacagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccgggaugaccggguccuuucuuggauaaacccgc +ucaaugcccggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaacaugagcacgaauccuaaaccucaaagaaaaaccaaaagaaacaccaaccg +>Z84230.1_1250 +-------------------------------uucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggauaagcccgc +ucaaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgagagu------------------- +------------------------------------------------------------ +>AB049100.1_1360 +auagaucacuccccugugaggaacuacugucuucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucaaugccuggagauuugggcgugcccccgcgagaccgcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaccaugagcacgaauccuaaaccucaaagaaaaaccaaacguaacaccaaccg diff --git a/mafft/src/mafft-7.487-with-extensions/test/samplerna.xinsi b/mafft/src/mafft-7.487-with-extensions/test/samplerna.xinsi new file mode 100644 index 0000000000..881a77baa9 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/samplerna.xinsi @@ -0,0 +1,35 @@ +>AJ006331.1_1230 +c--------------------------------ca-------------------uggcgu +uaguaugagugucgugcagccuccaggccccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaaucgcuggggugaccggguccuuucuuggaacaacccgc +ucaauacccagaaauuugggcgugcccccgcgagaucacuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcga--------------------- +----------------------------------------------------------gu +>Z84287.1_1250 +u-------------------------------ucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucgaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgaga--------------------- +----------------------------------------------------------gu +>AF064490.1_2296 +u----------------------------------------------------------- +------gagugucgaacagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccgggaugaccggguccuuucuuggauaaacccgc +ucaaugcccggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaacaugagcacgaauccuaaaccucaaagaaaaaccaaaagaaacaccaaccg +>Z84230.1_1250 +u-------------------------------ucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggauaagcccgc +ucaaugccuggagauuugggcgugcccccgcgagacugcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcucgaga--------------------- +----------------------------------------------------------gu +>AB049100.1_1360 +auagaucacuccccugugaggaacuacugucuucacgcagaaagcgucuagccauggcgu +uaguaugagugucgugcagccuccaggacccccccucccgggagagccauaguggucugc +ggaaccggugaguacaccggaauugccaggacgaccggguccuuucuuggaucaacccgc +ucaaugccuggagauuugggcgugcccccgcgagaccgcuagccgaguaguguugggucg +cgaaaggccuugugguacugccugauagggugcuugcgagugccccgggaggucucguag +accgugcaccaugagcacgaauccuaaaccucaaagaaaaaccaaacguaacaccaaccg diff --git a/mafft/src/mafft-7.487-with-extensions/test/script b/mafft/src/mafft-7.487-with-extensions/test/script new file mode 100644 index 0000000000..dfeba24194 --- /dev/null +++ b/mafft/src/mafft-7.487-with-extensions/test/script @@ -0,0 +1,37 @@ +mafft sample > x +diff x sample.fftns2 >& /dev/null || exit 1 + +mafft --maxiterate 100 sample > x +diff x sample.fftnsi >& /dev/null || exit 1 + +mafft --dpparttree sample > x +diff x sample.dpparttree >& /dev/null || exit 1 + +mafft --globalpair sample > x +diff x sample.gins1 >& /dev/null || exit 1 + +mafft --globalpair --maxiterate 100 sample > x +diff x sample.ginsi >& /dev/null || exit 1 + +mafft --allowshift --globalpair --maxiterate 100 sample > x +diff x sample.ginsi.allowshift >& /dev/null || exit 1 + +mafft --localpair sample > x +diff x sample.lins1 >& /dev/null || exit 1 + +mafft --localpair --maxiterate 100 sample > x +diff x sample.linsi >& /dev/null || exit 1 + +mafft --parttree sample > x +diff x sample.parttree >& /dev/null || exit 1 + +mafft-qinsi samplerna > x +diff x samplerna.qinsi >& /dev/null || exit 1 + +mafft-xinsi samplerna > x +diff x samplerna.xinsi >& /dev/null || exit 1 + +echo 'OK' +rm x + +exit 0 diff --git a/mafft/src/mafft-7.487.tgz b/mafft/src/mafft-7.487.tgz new file mode 120000 index 0000000000..841b9ed66e --- /dev/null +++ b/mafft/src/mafft-7.487.tgz @@ -0,0 +1 @@ +/home/guoyi/Bio/bioarchlinux/mafft/mafft-7.487.tgz \ No newline at end of file

x*Dh2vF|! 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≤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